spree_core 3.3.6 → 3.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/helpers/spree/base_helper.rb +17 -18
- data/app/helpers/spree/products_helper.rb +5 -5
- data/app/models/concerns/spree/calculated_adjustments.rb +4 -3
- data/app/models/concerns/spree/default_price.rb +4 -5
- data/app/models/concerns/spree/display_money.rb +1 -1
- data/app/models/concerns/spree/named_type.rb +1 -1
- data/app/models/concerns/spree/ransackable_attributes.rb +5 -6
- data/app/models/concerns/spree/user_address.rb +6 -6
- data/app/models/concerns/spree/user_methods.rb +3 -3
- data/app/models/concerns/spree/user_payment_source.rb +4 -2
- data/app/models/concerns/spree/user_reporting.rb +1 -1
- data/app/models/spree/ability.rb +3 -3
- data/app/models/spree/address.rb +13 -9
- data/app/models/spree/adjustable/adjuster/promotion.rb +1 -1
- data/app/models/spree/adjustable/adjustments_updater.rb +2 -2
- data/app/models/spree/adjustable/promotion_accumulator.rb +6 -4
- data/app/models/spree/adjustment.rb +2 -3
- data/app/models/spree/app_configuration.rb +5 -6
- data/app/models/spree/base.rb +1 -1
- data/app/models/spree/calculator/default_tax.rb +4 -5
- data/app/models/spree/calculator/flat_percent_item_total.rb +1 -1
- data/app/models/spree/calculator/flat_rate.rb +3 -3
- data/app/models/spree/calculator/flexi_rate.rb +5 -5
- data/app/models/spree/calculator/price_sack.rb +9 -9
- data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +1 -1
- data/app/models/spree/calculator/shipping/flat_rate.rb +3 -3
- data/app/models/spree/calculator/shipping/flexi_rate.rb +7 -7
- data/app/models/spree/calculator/shipping/per_item.rb +2 -2
- data/app/models/spree/calculator/shipping/price_sack.rb +4 -4
- data/app/models/spree/calculator/tiered_flat_rate.rb +3 -2
- data/app/models/spree/calculator/tiered_percent.rb +4 -3
- data/app/models/spree/calculator.rb +4 -4
- data/app/models/spree/classification.rb +2 -2
- data/app/models/spree/credit_card.rb +1 -1
- data/app/models/spree/exchange.rb +4 -5
- data/app/models/spree/gateway/bogus.rb +20 -20
- data/app/models/spree/gateway/bogus_simple.rb +2 -4
- data/app/models/spree/gateway.rb +4 -4
- data/app/models/spree/image.rb +3 -3
- data/app/models/spree/inventory_unit.rb +30 -30
- data/app/models/spree/line_item.rb +7 -9
- data/app/models/spree/option_type.rb +1 -1
- data/app/models/spree/order/checkout.rb +5 -5
- data/app/models/spree/order/currency_updater.rb +1 -4
- data/app/models/spree/order/payments.rb +4 -4
- data/app/models/spree/order/store_credit.rb +2 -2
- data/app/models/spree/order.rb +11 -29
- data/app/models/spree/order_contents.rb +6 -5
- data/app/models/spree/order_inventory.rb +3 -4
- data/app/models/spree/order_updater.rb +13 -14
- data/app/models/spree/payment/processing.rb +25 -26
- data/app/models/spree/payment.rb +72 -79
- data/app/models/spree/payment_capture_event.rb +1 -1
- data/app/models/spree/payment_method/check.rb +1 -1
- data/app/models/spree/payment_method/store_credit.rb +5 -5
- data/app/models/spree/payment_method.rb +7 -7
- data/app/models/spree/preferences/configuration.rb +6 -9
- data/app/models/spree/preferences/preferable.rb +11 -11
- data/app/models/spree/preferences/preferable_class_methods.rb +2 -3
- data/app/models/spree/preferences/scoped_store.rb +6 -5
- data/app/models/spree/preferences/store.rb +9 -14
- data/app/models/spree/price.rb +1 -1
- data/app/models/spree/product/scopes.rb +49 -49
- data/app/models/spree/product.rb +16 -16
- data/app/models/spree/promotion/actions/create_item_adjustments.rb +2 -1
- data/app/models/spree/promotion/actions/free_shipping.rb +1 -1
- data/app/models/spree/promotion/rules/first_order.rb +7 -6
- data/app/models/spree/promotion/rules/item_total.rb +3 -5
- data/app/models/spree/promotion/rules/one_use_per_user.rb +1 -2
- data/app/models/spree/promotion/rules/option_value.rb +14 -6
- data/app/models/spree/promotion/rules/product.rb +4 -4
- data/app/models/spree/promotion/rules/taxon.rb +6 -6
- data/app/models/spree/promotion/rules/user.rb +3 -3
- data/app/models/spree/promotion/rules/user_logged_in.rb +1 -1
- data/app/models/spree/promotion.rb +15 -16
- data/app/models/spree/promotion_action.rb +1 -1
- data/app/models/spree/promotion_handler/cart.rb +3 -2
- data/app/models/spree/promotion_handler/free_shipping.rb +1 -3
- data/app/models/spree/promotion_handler/page.rb +3 -3
- data/app/models/spree/promotion_rule.rb +5 -4
- data/app/models/spree/refund.rb +8 -8
- data/app/models/spree/reimbursement/credit.rb +1 -1
- data/app/models/spree/reimbursement/reimbursement_type_engine.rb +1 -3
- data/app/models/spree/reimbursement.rb +4 -8
- data/app/models/spree/reimbursement_performer.rb +0 -5
- data/app/models/spree/reimbursement_tax_calculator.rb +5 -12
- data/app/models/spree/reimbursement_type.rb +2 -2
- data/app/models/spree/return_authorization.rb +22 -26
- data/app/models/spree/return_item/eligibility_validator/default.rb +3 -3
- data/app/models/spree/return_item/eligibility_validator/inventory_shipped.rb +2 -2
- data/app/models/spree/return_item/eligibility_validator/no_reimbursements.rb +2 -2
- data/app/models/spree/return_item/eligibility_validator/order_completed.rb +2 -2
- data/app/models/spree/return_item/eligibility_validator/rma_required.rb +2 -3
- data/app/models/spree/return_item/eligibility_validator/time_since_purchase.rb +2 -2
- data/app/models/spree/return_item.rb +15 -19
- data/app/models/spree/returns_calculator.rb +1 -2
- data/app/models/spree/shipment.rb +14 -35
- data/app/models/spree/shipment_handler.rb +10 -12
- data/app/models/spree/shipping_calculator.rb +5 -6
- data/app/models/spree/shipping_method.rb +3 -3
- data/app/models/spree/shipping_rate.rb +2 -2
- data/app/models/spree/state.rb +2 -2
- data/app/models/spree/stock/availability_validator.rb +1 -1
- data/app/models/spree/stock/content_item.rb +2 -3
- data/app/models/spree/stock/coordinator.rb +3 -2
- data/app/models/spree/stock/differentiator.rb +3 -2
- data/app/models/spree/stock/estimator.rb +7 -5
- data/app/models/spree/stock/package.rb +5 -5
- data/app/models/spree/stock/packer.rb +1 -1
- data/app/models/spree/stock/prioritizer.rb +5 -7
- data/app/models/spree/stock/quantifier.rb +0 -1
- data/app/models/spree/stock/splitter/backordered.rb +2 -4
- data/app/models/spree/stock/splitter/base.rb +3 -2
- data/app/models/spree/stock/splitter/shipping_category.rb +2 -1
- data/app/models/spree/stock_item.rb +1 -1
- data/app/models/spree/stock_location.rb +12 -11
- data/app/models/spree/stock_movement.rb +1 -3
- data/app/models/spree/stock_transfer.rb +1 -1
- data/app/models/spree/store.rb +4 -4
- data/app/models/spree/store_credit.rb +3 -3
- data/app/models/spree/tax_category.rb +1 -1
- data/app/models/spree/tax_rate.rb +10 -10
- data/app/models/spree/taxon.rb +13 -13
- data/app/models/spree/taxonomy.rb +9 -8
- data/app/models/spree/validations/db_maximum_length_validator.rb +2 -3
- data/app/models/spree/variant.rb +30 -41
- data/app/models/spree/zone.rb +10 -10
- data/app/validators/db_maximum_length_validator.rb +5 -5
- data/config/initializers/acts_as_taggable_on.rb +3 -3
- data/config/initializers/assets.rb +1 -1
- data/config/initializers/friendly_id.rb +1 -1
- data/config/initializers/premailer_assets.rb +1 -1
- data/config/locales/en.yml +8 -2
- data/db/default/spree/states.rb +1 -0
- data/lib/generators/spree/custom_user/custom_user_generator.rb +12 -15
- data/lib/generators/spree/install/install_generator.rb +45 -32
- data/lib/spree/core/components.rb +3 -3
- data/lib/spree/core/controller_helpers/auth.rb +5 -10
- data/lib/spree/core/controller_helpers/common.rb +2 -3
- data/lib/spree/core/controller_helpers/order.rb +3 -7
- data/lib/spree/core/controller_helpers/respond_with.rb +4 -4
- data/lib/spree/core/engine.rb +3 -3
- data/lib/spree/core/environment/calculators.rb +0 -1
- data/lib/spree/core/environment_extension.rb +8 -8
- data/lib/spree/core/importer/order.rb +64 -67
- data/lib/spree/core/importer/product.rb +10 -9
- data/lib/spree/core/product_filters.rb +17 -18
- data/lib/spree/core/routes.rb +2 -6
- data/lib/spree/core/search/base.rb +62 -59
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/core.rb +4 -6
- data/lib/spree/i18n.rb +3 -5
- data/lib/spree/localized_number.rb +0 -2
- data/lib/spree/migrations.rb +8 -7
- data/lib/spree/money.rb +3 -7
- data/lib/spree/permitted_attributes.rb +2 -2
- data/lib/spree/responder.rb +4 -5
- data/lib/spree/testing_support/authorization_helpers.rb +3 -3
- data/lib/spree/testing_support/caching.rb +5 -5
- data/lib/spree/testing_support/capybara_ext.rb +16 -18
- data/lib/spree/testing_support/common_rake.rb +8 -9
- data/lib/spree/testing_support/controller_requests.rb +6 -6
- data/lib/spree/testing_support/extension_rake.rb +2 -3
- data/lib/spree/testing_support/factories/address_factory.rb +1 -1
- data/lib/spree/testing_support/factories/adjustment_factory.rb +1 -1
- data/lib/spree/testing_support/factories/calculator_factory.rb +1 -1
- data/lib/spree/testing_support/factories/country_factory.rb +1 -1
- data/lib/spree/testing_support/factories/credit_card_factory.rb +1 -1
- data/lib/spree/testing_support/factories/customer_return_factory.rb +1 -3
- data/lib/spree/testing_support/factories/image_factory.rb +2 -2
- data/lib/spree/testing_support/factories/inventory_unit_factory.rb +1 -1
- data/lib/spree/testing_support/factories/line_item_factory.rb +2 -2
- data/lib/spree/testing_support/factories/options_factory.rb +1 -1
- data/lib/spree/testing_support/factories/order_factory.rb +1 -1
- data/lib/spree/testing_support/factories/payment_factory.rb +1 -1
- data/lib/spree/testing_support/factories/payment_method_factory.rb +4 -4
- data/lib/spree/testing_support/factories/price_factory.rb +1 -1
- data/lib/spree/testing_support/factories/product_factory.rb +1 -1
- data/lib/spree/testing_support/factories/product_option_type_factory.rb +1 -1
- data/lib/spree/testing_support/factories/product_property_factory.rb +1 -1
- data/lib/spree/testing_support/factories/promotion_category_factory.rb +1 -2
- data/lib/spree/testing_support/factories/promotion_factory.rb +1 -2
- data/lib/spree/testing_support/factories/promotion_rule_factory.rb +1 -1
- data/lib/spree/testing_support/factories/property_factory.rb +1 -1
- data/lib/spree/testing_support/factories/prototype_factory.rb +1 -1
- data/lib/spree/testing_support/factories/refund_factory.rb +1 -1
- data/lib/spree/testing_support/factories/reimbursement_factory.rb +2 -2
- data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +1 -1
- data/lib/spree/testing_support/factories/return_authorization_factory.rb +1 -1
- data/lib/spree/testing_support/factories/return_item_factory.rb +1 -1
- data/lib/spree/testing_support/factories/role_factory.rb +1 -1
- data/lib/spree/testing_support/factories/shipment_factory.rb +2 -2
- data/lib/spree/testing_support/factories/shipping_category_factory.rb +1 -1
- data/lib/spree/testing_support/factories/shipping_method_factory.rb +3 -3
- data/lib/spree/testing_support/factories/state_factory.rb +1 -1
- data/lib/spree/testing_support/factories/stock_factory.rb +1 -1
- data/lib/spree/testing_support/factories/stock_item_factory.rb +1 -1
- data/lib/spree/testing_support/factories/stock_location_factory.rb +2 -2
- data/lib/spree/testing_support/factories/stock_movement_factory.rb +1 -1
- data/lib/spree/testing_support/factories/store_credit_category_factory.rb +2 -2
- data/lib/spree/testing_support/factories/store_credit_event_factory.rb +1 -1
- data/lib/spree/testing_support/factories/store_credit_factory.rb +1 -1
- data/lib/spree/testing_support/factories/store_credit_type_factory.rb +1 -1
- data/lib/spree/testing_support/factories/store_factory.rb +1 -1
- data/lib/spree/testing_support/factories/tag_factory.rb +1 -1
- data/lib/spree/testing_support/factories/tax_category_factory.rb +2 -2
- data/lib/spree/testing_support/factories/tax_rate_factory.rb +1 -1
- data/lib/spree/testing_support/factories/taxon_factory.rb +1 -1
- data/lib/spree/testing_support/factories/taxonomy_factory.rb +1 -1
- data/lib/spree/testing_support/factories/tracker_factory.rb +1 -1
- data/lib/spree/testing_support/factories/user_factory.rb +1 -1
- data/lib/spree/testing_support/factories/variant_factory.rb +1 -2
- data/lib/spree/testing_support/factories/zone_factory.rb +1 -1
- data/lib/spree/testing_support/factories/zone_member_factory.rb +1 -1
- data/lib/spree/testing_support/factories.rb +3 -3
- data/lib/spree/testing_support/flash.rb +1 -3
- data/lib/spree/testing_support/i18n.rb +5 -6
- data/lib/spree/testing_support/kernel.rb +1 -2
- data/lib/spree/testing_support/order_walkthrough.rb +12 -15
- data/lib/spree/testing_support/preferences.rb +0 -1
- data/lib/tasks/core.rake +47 -56
- data/lib/tasks/email.rake +2 -2
- data/lib/tasks/exchanges.rake +5 -5
- data/spree_core.gemspec +1 -1
- metadata +5 -9
- data/app/models/spree/calculator/percent_per_item.rb +0 -51
- data/config/initializers/premailer_rails.rb +0 -3
- data/lib/spree/core/delegate_belongs_to.rb +0 -99
- data/lib/spree/testing_support/microdata.rb +0 -192
@@ -5,7 +5,7 @@ module Spree
|
|
5
5
|
preference :minimal_amount, :decimal, default: 0
|
6
6
|
preference :normal_amount, :decimal, default: 0
|
7
7
|
preference :discount_amount, :decimal, default: 0
|
8
|
-
preference :currency, :string, default: ->{ Spree::Config[:currency] }
|
8
|
+
preference :currency, :string, default: -> { Spree::Config[:currency] }
|
9
9
|
|
10
10
|
def self.description
|
11
11
|
Spree.t(:price_sack)
|
@@ -13,16 +13,16 @@ module Spree
|
|
13
13
|
|
14
14
|
# as object we always get line items, as calculable we have Coupon, ShippingMethod
|
15
15
|
def compute(object)
|
16
|
-
if object.is_a?(Array)
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
16
|
+
base = if object.is_a?(Array)
|
17
|
+
object.map { |o| o.respond_to?(:amount) ? o.amount : BigDecimal(o.to_s) }.sum
|
18
|
+
else
|
19
|
+
object.respond_to?(:amount) ? object.amount : BigDecimal(object.to_s)
|
20
|
+
end
|
21
21
|
|
22
|
-
if base <
|
23
|
-
|
22
|
+
if base < preferred_minimal_amount
|
23
|
+
preferred_normal_amount
|
24
24
|
else
|
25
|
-
|
25
|
+
preferred_discount_amount
|
26
26
|
end
|
27
27
|
end
|
28
28
|
end
|
@@ -4,14 +4,14 @@ module Spree
|
|
4
4
|
module Calculator::Shipping
|
5
5
|
class FlatRate < ShippingCalculator
|
6
6
|
preference :amount, :decimal, default: 0
|
7
|
-
preference :currency, :string, default: ->{ Spree::Config[:currency] }
|
7
|
+
preference :currency, :string, default: -> { Spree::Config[:currency] }
|
8
8
|
|
9
9
|
def self.description
|
10
10
|
Spree.t(:shipping_flat_rate_per_order)
|
11
11
|
end
|
12
12
|
|
13
|
-
def compute_package(
|
14
|
-
|
13
|
+
def compute_package(_package)
|
14
|
+
preferred_amount
|
15
15
|
end
|
16
16
|
end
|
17
17
|
end
|
@@ -6,7 +6,7 @@ module Spree
|
|
6
6
|
preference :first_item, :decimal, default: 0.0
|
7
7
|
preference :additional_item, :decimal, default: 0.0
|
8
8
|
preference :max_items, :integer, default: 0
|
9
|
-
preference :currency, :string, default: ->{ Spree::Config[:currency] }
|
9
|
+
preference :currency, :string, default: -> { Spree::Config[:currency] }
|
10
10
|
|
11
11
|
def self.description
|
12
12
|
Spree.t(:shipping_flexible_rate)
|
@@ -18,14 +18,14 @@ module Spree
|
|
18
18
|
|
19
19
|
def compute_from_quantity(quantity)
|
20
20
|
sum = 0
|
21
|
-
max =
|
21
|
+
max = preferred_max_items.to_i
|
22
22
|
quantity.times do |i|
|
23
23
|
# check max value to avoid divide by 0 errors
|
24
|
-
if (max == 0 && i == 0) || (max > 0) && (i % max == 0)
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
24
|
+
sum += if (max == 0 && i == 0) || (max > 0) && (i % max == 0)
|
25
|
+
preferred_first_item.to_f
|
26
|
+
else
|
27
|
+
preferred_additional_item.to_f
|
28
|
+
end
|
29
29
|
end
|
30
30
|
|
31
31
|
sum
|
@@ -4,7 +4,7 @@ module Spree
|
|
4
4
|
module Calculator::Shipping
|
5
5
|
class PerItem < ShippingCalculator
|
6
6
|
preference :amount, :decimal, default: 0
|
7
|
-
preference :currency, :string, default: ->{ Spree::Config[:currency] }
|
7
|
+
preference :currency, :string, default: -> { Spree::Config[:currency] }
|
8
8
|
|
9
9
|
def self.description
|
10
10
|
Spree.t(:shipping_flat_rate_per_item)
|
@@ -15,7 +15,7 @@ module Spree
|
|
15
15
|
end
|
16
16
|
|
17
17
|
def compute_from_quantity(quantity)
|
18
|
-
|
18
|
+
preferred_amount * quantity
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
@@ -6,7 +6,7 @@ module Spree
|
|
6
6
|
preference :minimal_amount, :decimal, default: 0
|
7
7
|
preference :normal_amount, :decimal, default: 0
|
8
8
|
preference :discount_amount, :decimal, default: 0
|
9
|
-
preference :currency, :string, default: ->{ Spree::Config[:currency] }
|
9
|
+
preference :currency, :string, default: -> { Spree::Config[:currency] }
|
10
10
|
|
11
11
|
def self.description
|
12
12
|
Spree.t(:shipping_price_sack)
|
@@ -17,10 +17,10 @@ module Spree
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def compute_from_price(price)
|
20
|
-
if price <
|
21
|
-
|
20
|
+
if price < preferred_minimal_amount
|
21
|
+
preferred_normal_amount
|
22
22
|
else
|
23
|
-
|
23
|
+
preferred_discount_amount
|
24
24
|
end
|
25
25
|
end
|
26
26
|
end
|
@@ -19,14 +19,15 @@ module Spree
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def compute(object)
|
22
|
-
base, amount = preferred_tiers.sort.reverse.detect{ |b,_| object.amount >= b }
|
22
|
+
base, amount = preferred_tiers.sort.reverse.detect { |b, _| object.amount >= b }
|
23
23
|
amount || preferred_base_amount
|
24
24
|
end
|
25
25
|
|
26
26
|
private
|
27
|
+
|
27
28
|
def preferred_tiers_content
|
28
29
|
if preferred_tiers.is_a? Hash
|
29
|
-
unless preferred_tiers.keys.all?{ |k| k.is_a?(Numeric) && k > 0 }
|
30
|
+
unless preferred_tiers.keys.all? { |k| k.is_a?(Numeric) && k > 0 }
|
30
31
|
errors.add(:base, :keys_should_be_positive_number)
|
31
32
|
end
|
32
33
|
else
|
@@ -23,17 +23,18 @@ module Spree
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def compute(object)
|
26
|
-
base, percent = preferred_tiers.sort.reverse.detect{ |b,_| object.amount >= b }
|
26
|
+
base, percent = preferred_tiers.sort.reverse.detect { |b, _| object.amount >= b }
|
27
27
|
(object.amount * (percent || preferred_base_percent) / 100).round(2)
|
28
28
|
end
|
29
29
|
|
30
30
|
private
|
31
|
+
|
31
32
|
def preferred_tiers_content
|
32
33
|
if preferred_tiers.is_a? Hash
|
33
|
-
unless preferred_tiers.keys.all?{ |k| k.is_a?(Numeric) && k > 0 }
|
34
|
+
unless preferred_tiers.keys.all? { |k| k.is_a?(Numeric) && k > 0 }
|
34
35
|
errors.add(:base, :keys_should_be_positive_number)
|
35
36
|
end
|
36
|
-
unless preferred_tiers.values.all?{ |k| k.is_a?(Numeric) && k >= 0 && k <= 100 }
|
37
|
+
unless preferred_tiers.values.all? { |k| k.is_a?(Numeric) && k >= 0 && k <= 100 }
|
37
38
|
errors.add(:base, :values_should_be_percent)
|
38
39
|
end
|
39
40
|
else
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Spree
|
2
2
|
class Calculator < Spree::Base
|
3
3
|
# Conditional check for backwards compatibilty since acts as paranoid was added late https://github.com/spree/spree/issues/5858
|
4
|
-
if connection.data_source_exists?(:spree_calculators) && connection.column_exists?(:spree_calculators, :deleted_at)
|
4
|
+
if ActiveRecord::Base.connected? && connection.data_source_exists?(:spree_calculators) && connection.column_exists?(:spree_calculators, :deleted_at)
|
5
5
|
acts_as_paranoid
|
6
6
|
end
|
7
7
|
|
@@ -16,7 +16,7 @@ module Spree
|
|
16
16
|
method = "compute_#{computable_name}".to_sym
|
17
17
|
calculator_class = self.class
|
18
18
|
if respond_to?(method)
|
19
|
-
|
19
|
+
send(method, computable)
|
20
20
|
else
|
21
21
|
raise NotImplementedError, "Please implement '#{method}(#{computable_name})' in your calculator: #{calculator_class.name}"
|
22
22
|
end
|
@@ -33,14 +33,14 @@ module Spree
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def to_s
|
36
|
-
self.class.name.titleize.gsub("Calculator\/",
|
36
|
+
self.class.name.titleize.gsub("Calculator\/", '')
|
37
37
|
end
|
38
38
|
|
39
39
|
def description
|
40
40
|
self.class.description
|
41
41
|
end
|
42
42
|
|
43
|
-
def available?(
|
43
|
+
def available?(_object)
|
44
44
|
true
|
45
45
|
end
|
46
46
|
end
|
@@ -4,8 +4,8 @@ module Spree
|
|
4
4
|
acts_as_list scope: :taxon
|
5
5
|
|
6
6
|
with_options inverse_of: :classifications, touch: true do
|
7
|
-
belongs_to :product, class_name:
|
8
|
-
belongs_to :taxon, class_name:
|
7
|
+
belongs_to :product, class_name: 'Spree::Product'
|
8
|
+
belongs_to :taxon, class_name: 'Spree::Taxon'
|
9
9
|
end
|
10
10
|
|
11
11
|
validates :taxon, :product, presence: true
|
@@ -10,11 +10,11 @@ module Spree
|
|
10
10
|
def description
|
11
11
|
@reimbursement_objects.map do |reimbursement_object|
|
12
12
|
"#{reimbursement_object.variant.options_text} => #{reimbursement_object.exchange_variant.options_text}"
|
13
|
-
end.join(
|
13
|
+
end.join(' | ')
|
14
14
|
end
|
15
15
|
|
16
16
|
def display_amount
|
17
|
-
Spree::Money.new @reimbursement_objects.
|
17
|
+
Spree::Money.new @reimbursement_objects.sum(&:total)
|
18
18
|
end
|
19
19
|
|
20
20
|
def perform!
|
@@ -23,7 +23,7 @@ module Spree
|
|
23
23
|
shipments_units = shipments.flat_map(&:inventory_units)
|
24
24
|
|
25
25
|
if shipments_units.sum(&:quantity) != new_exchange_inventory_units.sum(&:quantity)
|
26
|
-
raise UnableToCreateShipments
|
26
|
+
raise UnableToCreateShipments, 'Could not generate shipments for all items. Out of stock?'
|
27
27
|
end
|
28
28
|
|
29
29
|
@order.shipments += shipments
|
@@ -40,12 +40,11 @@ module Spree
|
|
40
40
|
end
|
41
41
|
|
42
42
|
def self.param_key
|
43
|
-
|
43
|
+
'spree_exchange'
|
44
44
|
end
|
45
45
|
|
46
46
|
def self.model_name
|
47
47
|
Spree::Exchange
|
48
48
|
end
|
49
|
-
|
50
49
|
end
|
51
50
|
end
|
@@ -1,9 +1,9 @@
|
|
1
1
|
module Spree
|
2
2
|
class Gateway::Bogus < Gateway
|
3
|
-
TEST_VISA = ['4111111111111111','4012888888881881','4222222222222']
|
4
|
-
TEST_MC = ['5500000000000004','5555555555554444','5105105105105100','2223000010309703']
|
5
|
-
TEST_AMEX = ['378282246310005','371449635398431','378734493671000','340000000000009']
|
6
|
-
TEST_DISC = ['6011000000000004','6011111111111117','6011000990139424']
|
3
|
+
TEST_VISA = ['4111111111111111', '4012888888881881', '4222222222222']
|
4
|
+
TEST_MC = ['5500000000000004', '5555555555554444', '5105105105105100', '2223000010309703']
|
5
|
+
TEST_AMEX = ['378282246310005', '371449635398431', '378734493671000', '340000000000009']
|
6
|
+
TEST_DISC = ['6011000000000004', '6011111111111117', '6011000990139424']
|
7
7
|
|
8
8
|
VALID_CCS = ['1', TEST_VISA, TEST_MC, TEST_AMEX, TEST_DISC].flatten
|
9
9
|
|
@@ -25,38 +25,37 @@ module Spree
|
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
|
-
def authorize(
|
28
|
+
def authorize(_money, credit_card, _options = {})
|
29
29
|
profile_id = credit_card.gateway_customer_profile_id
|
30
|
-
if VALID_CCS.include?
|
30
|
+
if VALID_CCS.include?(credit_card.number) || (profile_id && profile_id.starts_with?('BGS-'))
|
31
31
|
ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345', avs_result: { code: 'D' })
|
32
32
|
else
|
33
33
|
ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', { message: 'Bogus Gateway: Forced failure' }, test: true)
|
34
34
|
end
|
35
35
|
end
|
36
36
|
|
37
|
-
def purchase(
|
37
|
+
def purchase(_money, credit_card, _options = {})
|
38
38
|
profile_id = credit_card.gateway_customer_profile_id
|
39
|
-
if VALID_CCS.include?
|
39
|
+
if VALID_CCS.include?(credit_card.number) || (profile_id && profile_id.starts_with?('BGS-'))
|
40
40
|
ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345', avs_result: { code: 'M' })
|
41
41
|
else
|
42
42
|
ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', message: 'Bogus Gateway: Forced failure', test: true)
|
43
43
|
end
|
44
44
|
end
|
45
45
|
|
46
|
-
def credit(
|
46
|
+
def credit(_money, _credit_card, _response_code, _options = {})
|
47
47
|
ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345')
|
48
48
|
end
|
49
49
|
|
50
|
-
def capture(
|
50
|
+
def capture(_money, authorization, _gateway_options)
|
51
51
|
if authorization == '12345'
|
52
52
|
ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true)
|
53
53
|
else
|
54
54
|
ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', error: 'Bogus Gateway: Forced failure', test: true)
|
55
55
|
end
|
56
|
-
|
57
56
|
end
|
58
57
|
|
59
|
-
def void(
|
58
|
+
def void(_response_code, _credit_card, _options = {})
|
60
59
|
ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345')
|
61
60
|
end
|
62
61
|
|
@@ -78,14 +77,15 @@ module Spree
|
|
78
77
|
end
|
79
78
|
|
80
79
|
private
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
random
|
80
|
+
|
81
|
+
def generate_profile_id(success)
|
82
|
+
record = true
|
83
|
+
prefix = success ? 'BGS' : 'FAIL'
|
84
|
+
while record
|
85
|
+
random = "#{prefix}-#{Array.new(6) { rand(6) }.join}"
|
86
|
+
record = CreditCard.find_by(gateway_customer_profile_id: random)
|
89
87
|
end
|
88
|
+
random
|
89
|
+
end
|
90
90
|
end
|
91
91
|
end
|
@@ -1,12 +1,11 @@
|
|
1
1
|
# Bogus Gateway that doesn't support payment profiles
|
2
2
|
module Spree
|
3
3
|
class Gateway::BogusSimple < Gateway::Bogus
|
4
|
-
|
5
4
|
def payment_profiles_supported?
|
6
5
|
false
|
7
6
|
end
|
8
7
|
|
9
|
-
def authorize(
|
8
|
+
def authorize(_money, credit_card, _options = {})
|
10
9
|
if VALID_CCS.include? credit_card.number
|
11
10
|
ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345', avs_result: { code: 'A' })
|
12
11
|
else
|
@@ -14,13 +13,12 @@ module Spree
|
|
14
13
|
end
|
15
14
|
end
|
16
15
|
|
17
|
-
def purchase(
|
16
|
+
def purchase(_money, credit_card, _options = {})
|
18
17
|
if VALID_CCS.include? credit_card.number
|
19
18
|
ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, test: true, authorization: '12345', avs_result: { code: 'A' })
|
20
19
|
else
|
21
20
|
ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', message: 'Bogus Gateway: Forced failure', test: true)
|
22
21
|
end
|
23
22
|
end
|
24
|
-
|
25
23
|
end
|
26
24
|
end
|
data/app/models/spree/gateway.rb
CHANGED
@@ -15,7 +15,7 @@ module Spree
|
|
15
15
|
|
16
16
|
def provider
|
17
17
|
gateway_options = options
|
18
|
-
gateway_options.delete :login if gateway_options.
|
18
|
+
gateway_options.delete :login if gateway_options.key?(:login) && gateway_options[:login].nil?
|
19
19
|
if gateway_options[:server]
|
20
20
|
ActiveMerchant::Billing::Base.mode = gateway_options[:server].to_sym
|
21
21
|
end
|
@@ -23,7 +23,7 @@ module Spree
|
|
23
23
|
end
|
24
24
|
|
25
25
|
def options
|
26
|
-
|
26
|
+
preferences.each_with_object({}) { |(key, value), memo| memo[key.to_sym] = value; }
|
27
27
|
end
|
28
28
|
|
29
29
|
def method_missing(method, *args)
|
@@ -61,7 +61,7 @@ module Spree
|
|
61
61
|
end
|
62
62
|
|
63
63
|
def sources_by_order(order)
|
64
|
-
source_ids = order.payments.where(source_type: payment_source_class.to_s, payment_method_id:
|
64
|
+
source_ids = order.payments.where(source_type: payment_source_class.to_s, payment_method_id: id).pluck(:source_id).uniq
|
65
65
|
payment_source_class.where(id: source_ids).with_payment_profile
|
66
66
|
end
|
67
67
|
|
@@ -70,7 +70,7 @@ module Spree
|
|
70
70
|
sources_by_order order
|
71
71
|
else
|
72
72
|
if order.user_id
|
73
|
-
|
73
|
+
credit_cards.where(user_id: order.user_id).with_payment_profile
|
74
74
|
else
|
75
75
|
[]
|
76
76
|
end
|
data/app/models/spree/image.rb
CHANGED
@@ -13,14 +13,14 @@ module Spree
|
|
13
13
|
path: ':rails_root/public/spree/products/:id/:style/:basename.:extension',
|
14
14
|
convert_options: { all: '-strip -auto-orient -colorspace sRGB' }
|
15
15
|
validates_attachment :attachment,
|
16
|
-
|
17
|
-
|
16
|
+
presence: true,
|
17
|
+
content_type: { content_type: accepted_image_types }
|
18
18
|
|
19
19
|
# save the w,h of the original image (from which others can be calculated)
|
20
20
|
# we need to look at the write-queue for images which have not been saved yet
|
21
21
|
before_save :find_dimensions, if: :attachment_updated_at_changed?
|
22
22
|
|
23
|
-
#used by admin products autocomplete
|
23
|
+
# used by admin products autocomplete
|
24
24
|
def mini_url
|
25
25
|
attachment.url(:mini, false)
|
26
26
|
end
|
@@ -1,15 +1,15 @@
|
|
1
1
|
module Spree
|
2
2
|
class InventoryUnit < Spree::Base
|
3
3
|
with_options inverse_of: :inventory_units do
|
4
|
-
belongs_to :variant, class_name:
|
5
|
-
belongs_to :order, class_name:
|
6
|
-
belongs_to :shipment, class_name:
|
7
|
-
belongs_to :return_authorization, class_name:
|
8
|
-
belongs_to :line_item, class_name:
|
4
|
+
belongs_to :variant, class_name: 'Spree::Variant'
|
5
|
+
belongs_to :order, class_name: 'Spree::Order'
|
6
|
+
belongs_to :shipment, class_name: 'Spree::Shipment', touch: true, optional: true
|
7
|
+
belongs_to :return_authorization, class_name: 'Spree::ReturnAuthorization'
|
8
|
+
belongs_to :line_item, class_name: 'Spree::LineItem'
|
9
9
|
end
|
10
10
|
|
11
11
|
has_many :return_items, inverse_of: :inventory_unit
|
12
|
-
belongs_to :original_return_item, class_name:
|
12
|
+
belongs_to :original_return_item, class_name: 'Spree::ReturnItem'
|
13
13
|
|
14
14
|
scope :backordered, -> { where state: 'backordered' }
|
15
15
|
scope :on_hand, -> { where state: 'on_hand' }
|
@@ -17,11 +17,11 @@ module Spree
|
|
17
17
|
scope :shipped, -> { where state: 'shipped' }
|
18
18
|
scope :returned, -> { where state: 'returned' }
|
19
19
|
scope :backordered_per_variant, ->(stock_item) do
|
20
|
-
includes(:shipment, :order)
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
20
|
+
includes(:shipment, :order).
|
21
|
+
where.not(spree_shipments: { state: 'canceled' }).
|
22
|
+
where(variant_id: stock_item.variant_id).
|
23
|
+
where.not(spree_orders: { completed_at: nil }).
|
24
|
+
backordered.order('spree_orders.completed_at ASC')
|
25
25
|
end
|
26
26
|
|
27
27
|
validates :quantity, numericality: { greater_than: 0 }
|
@@ -60,7 +60,7 @@ module Spree
|
|
60
60
|
|
61
61
|
def find_stock_item
|
62
62
|
Spree::StockItem.where(stock_location_id: shipment.stock_location_id,
|
63
|
-
|
63
|
+
variant_id: variant_id).first
|
64
64
|
end
|
65
65
|
|
66
66
|
def self.split(original_inventory_unit, extract_quantity)
|
@@ -104,11 +104,11 @@ module Spree
|
|
104
104
|
def required_quantity
|
105
105
|
return @required_quantity unless @required_quantity.nil?
|
106
106
|
|
107
|
-
if exchanged_unit?
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
107
|
+
@required_quantity = if exchanged_unit?
|
108
|
+
original_return_item.return_quantity
|
109
|
+
else
|
110
|
+
line_item.quantity
|
111
|
+
end
|
112
112
|
end
|
113
113
|
|
114
114
|
def exchanged_unit?
|
@@ -117,21 +117,21 @@ module Spree
|
|
117
117
|
|
118
118
|
private
|
119
119
|
|
120
|
-
|
121
|
-
|
122
|
-
|
120
|
+
def allow_ship?
|
121
|
+
on_hand?
|
122
|
+
end
|
123
123
|
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
124
|
+
def fulfill_order
|
125
|
+
reload
|
126
|
+
order.fulfill!
|
127
|
+
end
|
128
128
|
|
129
|
-
|
130
|
-
|
131
|
-
|
129
|
+
def percentage_of_line_item
|
130
|
+
quantity / BigDecimal.new(line_item.quantity)
|
131
|
+
end
|
132
132
|
|
133
|
-
|
134
|
-
|
135
|
-
|
133
|
+
def current_return_item
|
134
|
+
return_items.not_cancelled.first
|
135
|
+
end
|
136
136
|
end
|
137
137
|
end
|
@@ -3,10 +3,10 @@ module Spree
|
|
3
3
|
before_validation :ensure_valid_quantity
|
4
4
|
|
5
5
|
with_options inverse_of: :line_items do
|
6
|
-
belongs_to :order, class_name:
|
7
|
-
belongs_to :variant, class_name:
|
6
|
+
belongs_to :order, class_name: 'Spree::Order', touch: true
|
7
|
+
belongs_to :variant, class_name: 'Spree::Variant'
|
8
8
|
end
|
9
|
-
belongs_to :tax_category, class_name:
|
9
|
+
belongs_to :tax_category, class_name: 'Spree::TaxCategory'
|
10
10
|
|
11
11
|
has_one :product, through: :variant
|
12
12
|
|
@@ -23,7 +23,7 @@ module Spree
|
|
23
23
|
validates_with Stock::AvailabilityValidator
|
24
24
|
validate :ensure_proper_currency, if: -> { order.present? }
|
25
25
|
|
26
|
-
before_destroy :verify_order_inventory, if: -> { order.has_checkout_step?(
|
26
|
+
before_destroy :verify_order_inventory, if: -> { order.has_checkout_step?('delivery') }
|
27
27
|
|
28
28
|
before_destroy :destroy_inventory_units
|
29
29
|
|
@@ -54,9 +54,7 @@ module Spree
|
|
54
54
|
end
|
55
55
|
|
56
56
|
def copy_tax_category
|
57
|
-
if variant
|
58
|
-
self.tax_category = variant.tax_category
|
59
|
-
end
|
57
|
+
self.tax_category = variant.tax_category if variant
|
60
58
|
end
|
61
59
|
|
62
60
|
extend DisplayMoney
|
@@ -76,7 +74,7 @@ module Spree
|
|
76
74
|
end
|
77
75
|
|
78
76
|
alias discounted_money display_discounted_amount
|
79
|
-
|
77
|
+
alias discounted_amount taxable_amount
|
80
78
|
|
81
79
|
def final_amount
|
82
80
|
amount + adjustment_total
|
@@ -127,7 +125,7 @@ module Spree
|
|
127
125
|
end
|
128
126
|
|
129
127
|
def update_inventory
|
130
|
-
if (saved_changes? || target_shipment.present?) && order.has_checkout_step?(
|
128
|
+
if (saved_changes? || target_shipment.present?) && order.has_checkout_step?('delivery')
|
131
129
|
verify_order_inventory
|
132
130
|
end
|
133
131
|
end
|
@@ -19,7 +19,7 @@ module Spree
|
|
19
19
|
|
20
20
|
default_scope { order(:position) }
|
21
21
|
|
22
|
-
accepts_nested_attributes_for :option_values, reject_if:
|
22
|
+
accepts_nested_attributes_for :option_values, reject_if: ->(ov) { ov[:name].blank? || ov[:presentation].blank? }, allow_destroy: true
|
23
23
|
|
24
24
|
after_touch :touch_all_products
|
25
25
|
|
@@ -58,7 +58,7 @@ module Spree
|
|
58
58
|
|
59
59
|
event :return do
|
60
60
|
transition to: :returned,
|
61
|
-
from: [:complete, :awaiting_return, :canceled, :
|
61
|
+
from: [:complete, :awaiting_return, :canceled, :resumed],
|
62
62
|
if: :all_inventory_units_returned?
|
63
63
|
end
|
64
64
|
|
@@ -184,7 +184,7 @@ module Spree
|
|
184
184
|
checkout_steps << step
|
185
185
|
end).map(&:to_s)
|
186
186
|
# Ensure there is always a complete step
|
187
|
-
steps <<
|
187
|
+
steps << 'complete' unless steps.include?('complete')
|
188
188
|
steps
|
189
189
|
end
|
190
190
|
|
@@ -226,7 +226,7 @@ module Spree
|
|
226
226
|
if existing_card_id.present?
|
227
227
|
credit_card = CreditCard.find existing_card_id
|
228
228
|
if credit_card.user_id != user_id || credit_card.user_id.blank?
|
229
|
-
raise Core::GatewayError
|
229
|
+
raise Core::GatewayError, Spree.t(:invalid_credit_card)
|
230
230
|
end
|
231
231
|
|
232
232
|
credit_card.verification_value = params[:cvc_confirm] if params[:cvc_confirm].present?
|
@@ -253,7 +253,7 @@ module Spree
|
|
253
253
|
clone_billing
|
254
254
|
# Skip setting ship address if order doesn't have a delivery checkout step
|
255
255
|
# to avoid triggering validations on shipping address
|
256
|
-
clone_shipping if checkout_steps.include?(
|
256
|
+
clone_shipping if checkout_steps.include?('delivery')
|
257
257
|
end
|
258
258
|
end
|
259
259
|
|
@@ -306,7 +306,7 @@ module Spree
|
|
306
306
|
if @updating_params[:payment_source].present?
|
307
307
|
source_params = @updating_params.
|
308
308
|
delete(:payment_source)[@updating_params[:order][:payments_attributes].
|
309
|
-
|
309
|
+
first[:payment_method_id].to_s]
|
310
310
|
|
311
311
|
if source_params
|
312
312
|
@updating_params[:order][:payments_attributes].first[:source_attributes] = source_params
|