spree_core 3.4.6 → 3.5.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- data/app/assets/javascripts/spree.js.coffee +1 -1
- data/app/helpers/spree/base_helper.rb +4 -0
- data/app/models/concerns/spree/named_type.rb +1 -1
- data/app/models/concerns/spree/user_methods.rb +21 -4
- data/app/models/concerns/spree/user_reporting.rb +2 -2
- data/app/models/spree/address.rb +6 -12
- data/app/models/spree/adjustable/adjustments_updater.rb +2 -1
- data/app/models/spree/country.rb +2 -1
- data/app/models/spree/line_item.rb +8 -2
- data/app/models/spree/log_entry.rb +1 -1
- data/app/models/spree/order.rb +8 -6
- data/app/models/spree/order/checkout.rb +1 -0
- data/app/models/spree/order_contents.rb +20 -12
- data/app/models/spree/order_inventory.rb +24 -12
- data/app/models/spree/payment/processing.rb +2 -2
- data/app/models/spree/preferences/preferable.rb +1 -1
- data/app/models/spree/product/scopes.rb +1 -1
- data/app/models/spree/promotion.rb +15 -1
- data/app/models/spree/promotion/rules/option_value.rb +13 -5
- data/app/models/spree/promotion/rules/product.rb +2 -1
- data/app/models/spree/promotion/rules/taxon.rb +3 -1
- data/app/models/spree/promotion_action_line_item.rb +3 -0
- data/app/models/spree/promotion_handler/promotion_duplicator.rb +52 -0
- data/app/models/spree/refund.rb +1 -1
- data/app/models/spree/reimbursement.rb +1 -1
- data/app/models/spree/reimbursement/reimbursement_type_engine.rb +7 -18
- data/app/models/spree/reimbursement_performer.rb +3 -7
- data/app/models/spree/reimbursement_type/original_payment.rb +2 -2
- data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +3 -7
- data/app/models/spree/reimbursement_type/store_credit.rb +2 -10
- data/app/models/spree/shipment.rb +10 -4
- data/app/models/spree/stock/availability_validator.rb +1 -1
- data/app/models/spree/stock/packer.rb +1 -1
- data/app/models/spree/stock/splitter/backordered.rb +5 -7
- data/app/models/spree/stock/splitter/base.rb +1 -0
- data/app/models/spree/stock/splitter/shipping_category.rb +9 -16
- data/app/models/spree/stock/splitter/weight.rb +18 -20
- data/app/models/spree/stock_transfer.rb +2 -1
- data/app/models/spree/store_credit_category.rb +13 -0
- data/app/models/spree/taxon.rb +7 -0
- data/app/models/spree/variant.rb +1 -1
- data/app/validators/email_validator.rb +7 -0
- data/config/locales/en.yml +18 -27
- data/db/default/spree/states.rb +9 -27
- data/db/migrate/20150128032538_remove_environment_from_tracker.rb +2 -0
- data/db/migrate/20171004223836_remove_icon_from_taxons.rb +8 -0
- data/db/migrate/20180222133746_add_unique_index_on_spree_promotions_code.rb +6 -0
- data/lib/generators/spree/dummy_model/dummy_model_generator.rb +23 -0
- data/lib/generators/spree/dummy_model/templates/migration.rb.tt +10 -0
- data/lib/generators/spree/dummy_model/templates/model.rb.tt +6 -0
- data/lib/spree/core/controller_helpers/auth.rb +1 -1
- data/lib/spree/core/controller_helpers/common.rb +4 -0
- data/lib/spree/core/controller_helpers/order.rb +6 -5
- data/lib/spree/core/engine.rb +10 -10
- data/lib/spree/core/environment_extension.rb +3 -0
- data/lib/spree/core/importer/order.rb +1 -1
- data/lib/spree/core/validators/email.rb +1 -0
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/money.rb +1 -5
- data/lib/spree/permitted_attributes.rb +1 -1
- data/lib/spree/testing_support/capybara_ext.rb +16 -13
- data/lib/spree/testing_support/common_rake.rb +4 -1
- data/lib/spree/testing_support/factories/inventory_unit_factory.rb +7 -0
- data/lib/spree/testing_support/factories/taxon_factory.rb +1 -1
- data/spree_core.gemspec +1 -1
- data/vendor/assets/javascripts/jsuri.js +458 -2
- metadata +13 -7
- data/app/models/spree/tracker.rb +0 -25
- data/lib/spree/testing_support/factories/tracker_factory.rb +0 -7
@@ -31,12 +31,20 @@ module Spree
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def actionable?(line_item)
|
34
|
-
|
35
|
-
|
36
|
-
eligible_product_ids = preferred_eligible_values.keys
|
37
|
-
eligible_value_ids = preferred_eligible_values[product_id]
|
34
|
+
pid = line_item.product.id
|
35
|
+
ovids = line_item.variant.option_values.pluck(:id)
|
38
36
|
|
39
|
-
|
37
|
+
product_ids.include?(pid) && (value_ids(pid) - ovids).empty?
|
38
|
+
end
|
39
|
+
|
40
|
+
private
|
41
|
+
|
42
|
+
def product_ids
|
43
|
+
preferred_eligible_values.keys
|
44
|
+
end
|
45
|
+
|
46
|
+
def value_ids(product_id)
|
47
|
+
preferred_eligible_values[product_id]
|
40
48
|
end
|
41
49
|
end
|
42
50
|
end
|
@@ -6,7 +6,8 @@ module Spree
|
|
6
6
|
module Rules
|
7
7
|
class Product < PromotionRule
|
8
8
|
has_many :product_promotion_rules, class_name: 'Spree::ProductPromotionRule',
|
9
|
-
foreign_key: :promotion_rule_id
|
9
|
+
foreign_key: :promotion_rule_id,
|
10
|
+
dependent: :destroy
|
10
11
|
has_many :products, through: :product_promotion_rules, class_name: 'Spree::Product'
|
11
12
|
|
12
13
|
MATCH_POLICIES = %w(any all none)
|
@@ -2,7 +2,9 @@ module Spree
|
|
2
2
|
class Promotion
|
3
3
|
module Rules
|
4
4
|
class Taxon < PromotionRule
|
5
|
-
has_many :promotion_rule_taxons, class_name: 'Spree::PromotionRuleTaxon',
|
5
|
+
has_many :promotion_rule_taxons, class_name: 'Spree::PromotionRuleTaxon',
|
6
|
+
foreign_key: 'promotion_rule_id',
|
7
|
+
dependent: :destroy
|
6
8
|
has_many :taxons, through: :promotion_rule_taxons, class_name: 'Spree::Taxon'
|
7
9
|
|
8
10
|
MATCH_POLICIES = %w(any all)
|
@@ -2,5 +2,8 @@ module Spree
|
|
2
2
|
class PromotionActionLineItem < Spree::Base
|
3
3
|
belongs_to :promotion_action, class_name: 'Spree::Promotion::Actions::CreateLineItems'
|
4
4
|
belongs_to :variant, class_name: 'Spree::Variant'
|
5
|
+
|
6
|
+
validates :promotion_action, :variant, :quantity, presence: true
|
7
|
+
validates :quantity, numericality: { only_integer: true, message: Spree.t('validation.must_be_int') }
|
5
8
|
end
|
6
9
|
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Spree
|
2
|
+
module PromotionHandler
|
3
|
+
class PromotionDuplicator
|
4
|
+
def initialize(promotion)
|
5
|
+
@promotion = promotion
|
6
|
+
end
|
7
|
+
|
8
|
+
def duplicate
|
9
|
+
@new_promotion = @promotion.dup
|
10
|
+
@new_promotion.path = "#{@promotion.path}_new"
|
11
|
+
@new_promotion.name = "New #{@promotion.name}"
|
12
|
+
@new_promotion.code = "#{@promotion.code}_new"
|
13
|
+
|
14
|
+
ActiveRecord::Base.transaction do
|
15
|
+
@new_promotion.save
|
16
|
+
copy_rules
|
17
|
+
copy_actions
|
18
|
+
end
|
19
|
+
|
20
|
+
@new_promotion
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def copy_rules
|
26
|
+
@promotion.promotion_rules.each do |rule|
|
27
|
+
new_rule = rule.dup
|
28
|
+
@new_promotion.promotion_rules << new_rule
|
29
|
+
|
30
|
+
new_rule.users = rule.users if rule.try(:users)
|
31
|
+
new_rule.taxons = rule.taxons if rule.try(:taxons)
|
32
|
+
new_rule.products = rule.products if rule.try(:products)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
def copy_actions
|
37
|
+
@promotion.promotion_actions.each do |action|
|
38
|
+
new_action = action.dup
|
39
|
+
new_action.calculator = action.calculator.dup if action.try(:calculator)
|
40
|
+
|
41
|
+
@new_promotion.promotion_actions << new_action
|
42
|
+
|
43
|
+
if action.try(:promotion_action_line_items)
|
44
|
+
action.promotion_action_line_items.each do |item|
|
45
|
+
new_action.promotion_action_line_items << item.dup
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
data/app/models/spree/refund.rb
CHANGED
@@ -43,7 +43,7 @@ module Spree
|
|
43
43
|
def perform!
|
44
44
|
return true if transaction_id.present?
|
45
45
|
|
46
|
-
credit_cents = Spree::Money.new(amount.to_f, currency: payment.currency).
|
46
|
+
credit_cents = Spree::Money.new(amount.to_f, currency: payment.currency).money.cents
|
47
47
|
|
48
48
|
@response = process!(credit_cents)
|
49
49
|
|
@@ -42,7 +42,7 @@ module Spree
|
|
42
42
|
# Refund.total_amount_reimbursed_for(reimbursement)
|
43
43
|
# See the `reimbursement_generator` property regarding the generation of custom reimbursements.
|
44
44
|
class_attribute :reimbursement_models
|
45
|
-
self.reimbursement_models = [Refund]
|
45
|
+
self.reimbursement_models = [Refund, Credit]
|
46
46
|
|
47
47
|
# The reimbursement_performer property should be set to an object that responds to the following methods:
|
48
48
|
# - #perform
|
@@ -22,7 +22,7 @@ module Spree
|
|
22
22
|
def calculate_reimbursement_types
|
23
23
|
@return_items.each do |return_item|
|
24
24
|
reimbursement_type = calculate_reimbursement_type(return_item)
|
25
|
-
|
25
|
+
@reimbursement_type_hash[reimbursement_type] << return_item if reimbursement_type
|
26
26
|
end
|
27
27
|
|
28
28
|
@reimbursement_type_hash
|
@@ -31,24 +31,13 @@ module Spree
|
|
31
31
|
private
|
32
32
|
|
33
33
|
def calculate_reimbursement_type(return_item)
|
34
|
-
if return_item.exchange_required?
|
35
|
-
|
36
|
-
|
37
|
-
return_item.
|
38
|
-
elsif return_item.preferred_reimbursement_type.present?
|
39
|
-
if valid_preferred_reimbursement_type?(return_item)
|
40
|
-
return_item.preferred_reimbursement_type.class
|
41
|
-
end
|
42
|
-
elsif past_reimbursable_time_period?(return_item)
|
43
|
-
expired_reimbursement_type
|
44
|
-
else
|
45
|
-
default_reimbursement_type
|
34
|
+
return exchange_reimbursement_type if return_item.exchange_required?
|
35
|
+
return return_item.override_reimbursement_type.class if return_item.override_reimbursement_type.present?
|
36
|
+
if return_item.preferred_reimbursement_type.present?
|
37
|
+
return valid_preferred_reimbursement_type?(return_item) ? return_item.preferred_reimbursement_type.class : nil
|
46
38
|
end
|
47
|
-
|
48
|
-
|
49
|
-
def add_reimbursement_type(return_item, reimbursement_type)
|
50
|
-
return unless reimbursement_type
|
51
|
-
@reimbursement_type_hash[reimbursement_type] << return_item
|
39
|
+
return expired_reimbursement_type if past_reimbursable_time_period?(return_item)
|
40
|
+
default_reimbursement_type
|
52
41
|
end
|
53
42
|
end
|
54
43
|
end
|
@@ -21,18 +21,14 @@ module Spree
|
|
21
21
|
private
|
22
22
|
|
23
23
|
def execute(reimbursement, simulate)
|
24
|
-
|
24
|
+
# Engine reimbursement_type_engine returns hash of preferred reimbursement types pointing at return items
|
25
|
+
# {Spree::ReimbursementType::OriginalPayment => [ReturnItem, ...], Spree::ReimbursementType::Exchange => [ReturnItem, ...]}
|
26
|
+
reimbursement_type_hash = reimbursement_type_engine.new(reimbursement.return_items).calculate_reimbursement_types
|
25
27
|
|
26
28
|
reimbursement_type_hash.flat_map do |reimbursement_type, return_items|
|
27
29
|
reimbursement_type.reimburse(reimbursement, return_items, simulate)
|
28
30
|
end
|
29
31
|
end
|
30
|
-
|
31
|
-
def calculate_reimbursement_types(reimbursement)
|
32
|
-
# Engine returns hash of preferred reimbursement types pointing at return items
|
33
|
-
# {Spree::ReimbursementType::OriginalPayment => [ReturnItem, ...], Spree::ReimbursementType::Exchange => [ReturnItem, ...]}
|
34
|
-
reimbursement_type_engine.new(reimbursement.return_items).calculate_reimbursement_types
|
35
|
-
end
|
36
32
|
end
|
37
33
|
end
|
38
34
|
end
|
@@ -6,8 +6,8 @@ class Spree::ReimbursementType::OriginalPayment < Spree::ReimbursementType
|
|
6
6
|
unpaid_amount = return_items.map { |ri| ri.total.to_d.round(2) }.sum
|
7
7
|
payments = reimbursement.order.payments.completed
|
8
8
|
|
9
|
-
|
10
|
-
|
9
|
+
reimbursement_list, unpaid_amount = create_refunds(reimbursement, payments, unpaid_amount, simulate)
|
10
|
+
reimbursement_list
|
11
11
|
end
|
12
12
|
end
|
13
13
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Spree
|
2
2
|
module ReimbursementType::ReimbursementHelpers
|
3
3
|
def create_refunds(reimbursement, payments, unpaid_amount, simulate, reimbursement_list = [])
|
4
|
-
payments.
|
4
|
+
payments.each do |payment|
|
5
5
|
break if unpaid_amount <= 0
|
6
6
|
next unless payment.can_credit?
|
7
7
|
|
@@ -37,17 +37,13 @@ module Spree
|
|
37
37
|
# If you have multiple methods of crediting a customer, overwrite this method
|
38
38
|
# Must return an array of objects the respond to #description, #display_amount
|
39
39
|
def create_credit(reimbursement, unpaid_amount, simulate)
|
40
|
-
|
40
|
+
category = Spree::StoreCreditCategory.default_reimbursement_category(category_options(reimbursement))
|
41
|
+
creditable = Spree::StoreCredit.new(store_credit_params(category, reimbursement, unpaid_amount))
|
41
42
|
credit = reimbursement.credits.build(creditable: creditable, amount: unpaid_amount)
|
42
43
|
simulate ? credit.readonly! : credit.save!
|
43
44
|
credit
|
44
45
|
end
|
45
46
|
|
46
|
-
def create_creditable(reimbursement, unpaid_amount)
|
47
|
-
category = Spree::StoreCreditCategory.default_reimbursement_category(category_options(reimbursement))
|
48
|
-
Spree::StoreCredit.new(store_credit_params(category, reimbursement, unpaid_amount))
|
49
|
-
end
|
50
|
-
|
51
47
|
def store_credit_params(category, reimbursement, unpaid_amount)
|
52
48
|
{
|
53
49
|
user: reimbursement.order.user,
|
@@ -4,12 +4,10 @@ class Spree::ReimbursementType::StoreCredit < Spree::ReimbursementType
|
|
4
4
|
class << self
|
5
5
|
def reimburse(reimbursement, return_items, simulate)
|
6
6
|
unpaid_amount = return_items.sum(&:total).to_d.round(2, :down)
|
7
|
-
payments =
|
8
|
-
reimbursement_list = []
|
7
|
+
payments = reimbursement.order.payments.completed.store_credits
|
9
8
|
|
10
9
|
# Credit each store credit that was used on the order
|
11
|
-
reimbursement_list, unpaid_amount = create_refunds(reimbursement, payments, unpaid_amount,
|
12
|
-
simulate, reimbursement_list)
|
10
|
+
reimbursement_list, unpaid_amount = create_refunds(reimbursement, payments, unpaid_amount, simulate)
|
13
11
|
|
14
12
|
# If there is any amount left to pay out to the customer, then create credit with that amount
|
15
13
|
if unpaid_amount > 0.0
|
@@ -18,11 +16,5 @@ class Spree::ReimbursementType::StoreCredit < Spree::ReimbursementType
|
|
18
16
|
|
19
17
|
reimbursement_list
|
20
18
|
end
|
21
|
-
|
22
|
-
private
|
23
|
-
|
24
|
-
def store_credit_payments(reimbursement)
|
25
|
-
reimbursement.order.payments.completed.store_credits
|
26
|
-
end
|
27
19
|
end
|
28
20
|
end
|
@@ -39,7 +39,7 @@ module Spree
|
|
39
39
|
scope :trackable, -> { where("tracking IS NOT NULL AND tracking != ''") }
|
40
40
|
scope :with_state, ->(*s) { where(state: s) }
|
41
41
|
# sort by most recent shipped_at, falling back to created_at. add "id desc" to make specs that involve this scope more deterministic.
|
42
|
-
scope :reverse_chronological, -> { order('coalesce(spree_shipments.shipped_at, spree_shipments.created_at) desc', id: :desc) }
|
42
|
+
scope :reverse_chronological, -> { order(Arel.sql('coalesce(spree_shipments.shipped_at, spree_shipments.created_at) desc'), id: :desc) }
|
43
43
|
|
44
44
|
# shipment state machine (see http://github.com/pluginaweek/state_machine/tree/master for details)
|
45
45
|
state_machine initial: :pending, use_transactions: false do
|
@@ -217,10 +217,15 @@ module Spree
|
|
217
217
|
|
218
218
|
if shipping_method
|
219
219
|
selected_rate = shipping_rates.detect do |rate|
|
220
|
-
|
220
|
+
if original_shipping_method_id
|
221
|
+
rate.shipping_method_id == original_shipping_method_id
|
222
|
+
else
|
223
|
+
rate.selected
|
224
|
+
end
|
221
225
|
end
|
222
226
|
save!
|
223
227
|
self.selected_shipping_rate_id = selected_rate.id if selected_rate
|
228
|
+
reload
|
224
229
|
end
|
225
230
|
|
226
231
|
shipping_rates
|
@@ -340,10 +345,11 @@ module Spree
|
|
340
345
|
|
341
346
|
order.contents.remove(variant, quantity, shipment: self)
|
342
347
|
order.contents.add(variant, quantity, shipment: new_shipment)
|
348
|
+
order.create_tax_charge!
|
343
349
|
order.update_with_updater!
|
344
350
|
|
345
351
|
refresh_rates
|
346
|
-
save!
|
352
|
+
save! if persisted?
|
347
353
|
new_shipment.save!
|
348
354
|
end
|
349
355
|
end
|
@@ -362,7 +368,7 @@ module Spree
|
|
362
368
|
order.update_with_updater!
|
363
369
|
|
364
370
|
refresh_rates
|
365
|
-
save!
|
371
|
+
save! if persisted?
|
366
372
|
shipment_to_transfer_to.refresh_rates
|
367
373
|
shipment_to_transfer_to.save!
|
368
374
|
end
|
@@ -2,7 +2,7 @@ module Spree
|
|
2
2
|
module Stock
|
3
3
|
class AvailabilityValidator < ActiveModel::Validator
|
4
4
|
def validate(line_item)
|
5
|
-
unit_count = line_item.inventory_units.sum(&:quantity)
|
5
|
+
unit_count = line_item.inventory_units.reject(&:pending?).sum(&:quantity)
|
6
6
|
return if unit_count >= line_item.quantity
|
7
7
|
|
8
8
|
quantity = line_item.quantity - unit_count
|
@@ -4,16 +4,14 @@ module Spree
|
|
4
4
|
class Backordered < Spree::Stock::Splitter::Base
|
5
5
|
def split(packages)
|
6
6
|
split_packages = []
|
7
|
+
|
7
8
|
packages.each do |package|
|
8
|
-
unless package.on_hand.empty?
|
9
|
-
split_packages << build_package(package.on_hand)
|
10
|
-
end
|
9
|
+
split_packages << build_package(package.on_hand) unless package.on_hand.empty?
|
11
10
|
|
12
|
-
unless package.backordered.empty?
|
13
|
-
split_packages << build_package(package.backordered)
|
14
|
-
end
|
11
|
+
split_packages << build_package(package.backordered) unless package.backordered.empty?
|
15
12
|
end
|
16
|
-
|
13
|
+
|
14
|
+
return_next(split_packages)
|
17
15
|
end
|
18
16
|
end
|
19
17
|
end
|
@@ -3,31 +3,24 @@ module Spree
|
|
3
3
|
module Splitter
|
4
4
|
class ShippingCategory < Spree::Stock::Splitter::Base
|
5
5
|
def split(packages)
|
6
|
-
split_packages =
|
7
|
-
|
8
|
-
split_packages += split_by_category(package)
|
9
|
-
end
|
10
|
-
return_next split_packages
|
6
|
+
split_packages = packages.flat_map(&method(:split_by_category))
|
7
|
+
return_next(split_packages)
|
11
8
|
end
|
12
9
|
|
13
10
|
private
|
14
11
|
|
15
12
|
def split_by_category(package)
|
16
|
-
|
17
|
-
package.contents.
|
18
|
-
|
19
|
-
end
|
20
|
-
hash_to_packages(categories)
|
13
|
+
# group package items by shipping category
|
14
|
+
grouped_packages = package.contents.group_by(&method(:shipping_category_for))
|
15
|
+
hash_to_packages(grouped_packages)
|
21
16
|
end
|
22
17
|
|
23
|
-
def hash_to_packages(
|
24
|
-
packages
|
25
|
-
|
26
|
-
packages << build_package(contents)
|
27
|
-
end
|
28
|
-
packages
|
18
|
+
def hash_to_packages(grouped_packages)
|
19
|
+
# select values from packages grouped by shipping categories and build new packages
|
20
|
+
grouped_packages.values.map(&method(:build_package))
|
29
21
|
end
|
30
22
|
|
23
|
+
# optimization: save variant -> shipping_category correspondence
|
31
24
|
def shipping_category_for(item)
|
32
25
|
@item_shipping_category ||= {}
|
33
26
|
@item_shipping_category[item.inventory_unit.variant_id] ||= item.variant.shipping_category_id
|
@@ -4,17 +4,12 @@ module Spree
|
|
4
4
|
class Weight < Spree::Stock::Splitter::Base
|
5
5
|
attr_reader :packer, :next_splitter
|
6
6
|
|
7
|
-
cattr_accessor
|
8
|
-
150
|
9
|
-
end
|
7
|
+
cattr_accessor(:threshold) { 150 }
|
10
8
|
|
11
9
|
def split(packages)
|
12
|
-
generated_packages =
|
13
|
-
packages.
|
14
|
-
|
15
|
-
end
|
16
|
-
packages.push *generated_packages
|
17
|
-
return_next packages
|
10
|
+
generated_packages = packages.flat_map(&method(:reduce))
|
11
|
+
packages.push(*generated_packages)
|
12
|
+
return_next(packages)
|
18
13
|
end
|
19
14
|
|
20
15
|
private
|
@@ -25,20 +20,20 @@ module Spree
|
|
25
20
|
# This also prevents an additional package if no fit is possible
|
26
21
|
package.contents.clear
|
27
22
|
package.contents << contents.shift
|
28
|
-
|
29
|
-
while contents.present?
|
23
|
+
split_packages = [package]
|
30
24
|
|
31
|
-
|
25
|
+
while contents.present?
|
26
|
+
package_to_use = choose_package(split_packages, contents.first)
|
32
27
|
|
33
28
|
if package_to_use.nil?
|
34
29
|
package_to_use = build_package
|
35
|
-
|
30
|
+
split_packages << package_to_use
|
36
31
|
end
|
37
32
|
|
38
33
|
package_to_use.contents << contents.shift
|
39
34
|
end
|
40
35
|
|
41
|
-
|
36
|
+
split_packages.drop(1)
|
42
37
|
end
|
43
38
|
|
44
39
|
def choose_package(generated_packages, content_to_add)
|
@@ -50,11 +45,14 @@ module Spree
|
|
50
45
|
|
51
46
|
generated_packages.each do |generated_package|
|
52
47
|
generated_package_weight = generated_package.weight
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
48
|
+
|
49
|
+
weight_exceed = (generated_package_weight + content_to_add.weight) > threshold
|
50
|
+
space_left = available_space >= (threshold - generated_package_weight)
|
51
|
+
|
52
|
+
next if weight_exceed || space_left
|
53
|
+
|
54
|
+
package_to_use = generated_package
|
55
|
+
available_space = threshold - generated_package_weight
|
58
56
|
end
|
59
57
|
|
60
58
|
package_to_use
|
@@ -63,7 +61,7 @@ module Spree
|
|
63
61
|
def split_package_contents_over_threshold(package)
|
64
62
|
package.contents.flat_map do |content|
|
65
63
|
if content.weight > threshold && content.splittable_by_weight?
|
66
|
-
split_content_item_over_threshold
|
64
|
+
split_content_item_over_threshold(content)
|
67
65
|
else
|
68
66
|
content
|
69
67
|
end
|