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
@@ -2,10 +2,10 @@ module Spree
|
|
2
2
|
class ReturnItem::EligibilityValidator::RMARequired < Spree::ReturnItem::EligibilityValidator::BaseValidator
|
3
3
|
def eligible_for_return?
|
4
4
|
if @return_item.return_authorization.present?
|
5
|
-
|
5
|
+
true
|
6
6
|
else
|
7
7
|
add_error(:rma_required, Spree.t('return_item_rma_ineligible'))
|
8
|
-
|
8
|
+
false
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
@@ -14,4 +14,3 @@ module Spree
|
|
14
14
|
end
|
15
15
|
end
|
16
16
|
end
|
17
|
-
|
@@ -2,10 +2,10 @@ module Spree
|
|
2
2
|
class ReturnItem::EligibilityValidator::TimeSincePurchase < Spree::ReturnItem::EligibilityValidator::BaseValidator
|
3
3
|
def eligible_for_return?
|
4
4
|
if (@return_item.inventory_unit.order.completed_at + Spree::Config[:return_eligibility_number_of_days].days) > Time.current
|
5
|
-
|
5
|
+
true
|
6
6
|
else
|
7
7
|
add_error(:number_of_days, Spree.t('return_item_time_period_ineligible'))
|
8
|
-
|
8
|
+
false
|
9
9
|
end
|
10
10
|
end
|
11
11
|
|
@@ -152,7 +152,7 @@ module Spree
|
|
152
152
|
# will have a different variant than the inventory unit itself
|
153
153
|
return unless exchange_required?
|
154
154
|
exchange_inventory_units.build(variant: exchange_variant, line_item: inventory_unit.line_item,
|
155
|
-
|
155
|
+
order: inventory_unit.order, quantity: return_quantity)
|
156
156
|
end
|
157
157
|
|
158
158
|
def exchange_shipments
|
@@ -166,16 +166,14 @@ module Spree
|
|
166
166
|
private
|
167
167
|
|
168
168
|
def persist_acceptance_status_errors
|
169
|
-
|
169
|
+
update_attributes(acceptance_status_errors: validator.errors)
|
170
170
|
end
|
171
171
|
|
172
172
|
def stock_item
|
173
173
|
return unless customer_return
|
174
174
|
|
175
|
-
Spree::StockItem.find_by(
|
176
|
-
|
177
|
-
stock_location_id: customer_return.stock_location_id,
|
178
|
-
})
|
175
|
+
Spree::StockItem.find_by(variant_id: inventory_unit.variant_id,
|
176
|
+
stock_location_id: customer_return.stock_location_id)
|
179
177
|
end
|
180
178
|
|
181
179
|
def currency
|
@@ -184,11 +182,13 @@ module Spree
|
|
184
182
|
|
185
183
|
def process_inventory_unit!
|
186
184
|
inventory_unit.return!
|
187
|
-
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
185
|
+
if should_restock?
|
186
|
+
Spree::StockMovement.create!(
|
187
|
+
stock_item_id: stock_item.id,
|
188
|
+
quantity: inventory_unit.quantity,
|
189
|
+
originator: return_authorization
|
190
|
+
)
|
191
|
+
end
|
192
192
|
end
|
193
193
|
|
194
194
|
# This logic is also present in the customer return. The reason for the
|
@@ -237,16 +237,12 @@ module Spree
|
|
237
237
|
end
|
238
238
|
|
239
239
|
def validate_no_other_completed_return_items
|
240
|
-
other_return_item = Spree::ReturnItem.where(
|
241
|
-
|
242
|
-
reception_status: COMPLETED_RECEPTION_STATUSES,
|
243
|
-
}).first
|
240
|
+
other_return_item = Spree::ReturnItem.where(inventory_unit_id: inventory_unit_id,
|
241
|
+
reception_status: COMPLETED_RECEPTION_STATUSES).first
|
244
242
|
|
245
243
|
if other_return_item
|
246
|
-
errors.add(:inventory_unit, :other_completed_return_item_exists,
|
247
|
-
|
248
|
-
return_item_id: other_return_item.id,
|
249
|
-
})
|
244
|
+
errors.add(:inventory_unit, :other_completed_return_item_exists, inventory_unit_id: inventory_unit_id,
|
245
|
+
return_item_id: other_return_item.id)
|
250
246
|
end
|
251
247
|
end
|
252
248
|
|
@@ -76,7 +76,7 @@ module Spree
|
|
76
76
|
shipment.state_changes.create!(
|
77
77
|
previous_state: transition.from,
|
78
78
|
next_state: transition.to,
|
79
|
-
name: 'shipment'
|
79
|
+
name: 'shipment'
|
80
80
|
)
|
81
81
|
end
|
82
82
|
end
|
@@ -125,11 +125,6 @@ module Spree
|
|
125
125
|
end
|
126
126
|
alias discounted_amount discounted_cost
|
127
127
|
|
128
|
-
def editable_by?(_user)
|
129
|
-
warn "`Spree::Shipment#editable_by?` is deprecated. You should use cancancan `can?` method for cheks like this."
|
130
|
-
!shipped?
|
131
|
-
end
|
132
|
-
|
133
128
|
def final_price
|
134
129
|
cost + adjustment_total
|
135
130
|
end
|
@@ -224,7 +219,6 @@ module Spree
|
|
224
219
|
selected_rate = shipping_rates.detect do |rate|
|
225
220
|
rate.shipping_method_id == original_shipping_method_id
|
226
221
|
end
|
227
|
-
save!
|
228
222
|
self.selected_shipping_rate_id = selected_rate.id if selected_rate
|
229
223
|
end
|
230
224
|
|
@@ -241,14 +235,12 @@ module Spree
|
|
241
235
|
save!
|
242
236
|
end
|
243
237
|
|
244
|
-
def set_up_inventory(state, variant, order, line_item
|
245
|
-
return if quantity <= 0
|
238
|
+
def set_up_inventory(state, variant, order, line_item)
|
246
239
|
inventory_units.create(
|
247
240
|
state: state,
|
248
241
|
variant_id: variant.id,
|
249
242
|
order_id: order.id,
|
250
|
-
line_item_id: line_item.id
|
251
|
-
quantity: quantity
|
243
|
+
line_item_id: line_item.id
|
252
244
|
)
|
253
245
|
end
|
254
246
|
|
@@ -289,7 +281,7 @@ module Spree
|
|
289
281
|
update_columns(
|
290
282
|
cost: selected_shipping_rate.cost,
|
291
283
|
adjustment_total: adjustments.additional.map(&:update!).compact.sum,
|
292
|
-
updated_at: Time.current
|
284
|
+
updated_at: Time.current
|
293
285
|
)
|
294
286
|
end
|
295
287
|
end
|
@@ -332,22 +324,19 @@ module Spree
|
|
332
324
|
new_state = determine_state(order)
|
333
325
|
update_columns(
|
334
326
|
state: new_state,
|
335
|
-
updated_at: Time.current
|
327
|
+
updated_at: Time.current
|
336
328
|
)
|
337
329
|
after_ship if new_state == 'shipped' && old_state != 'shipped'
|
338
330
|
end
|
339
331
|
|
340
332
|
def transfer_to_location(variant, quantity, stock_location)
|
341
|
-
if quantity <= 0
|
342
|
-
raise ArgumentError
|
343
|
-
end
|
333
|
+
raise ArgumentError if quantity <= 0
|
344
334
|
|
345
335
|
transaction do
|
346
336
|
new_shipment = order.shipments.create!(stock_location: stock_location)
|
347
337
|
|
348
338
|
order.contents.remove(variant, quantity, shipment: self)
|
349
339
|
order.contents.add(variant, quantity, shipment: new_shipment)
|
350
|
-
order.update_with_updater!
|
351
340
|
|
352
341
|
refresh_rates
|
353
342
|
save!
|
@@ -361,14 +350,11 @@ module Spree
|
|
361
350
|
end.try(:quantity) || 0
|
362
351
|
final_quantity = quantity + quantity_already_shipment_to_transfer_to
|
363
352
|
|
364
|
-
if quantity <= 0 || self == shipment_to_transfer_to
|
365
|
-
raise ArgumentError
|
366
|
-
end
|
353
|
+
raise ArgumentError if quantity <= 0 || self == shipment_to_transfer_to
|
367
354
|
|
368
355
|
transaction do
|
369
|
-
order.contents.remove(variant,
|
370
|
-
order.contents.add(variant,
|
371
|
-
order.update_with_updater!
|
356
|
+
order.contents.remove(variant, quantity, shipment: self)
|
357
|
+
order.contents.add(variant, quantity, shipment: shipment_to_transfer_to)
|
372
358
|
|
373
359
|
refresh_rates
|
374
360
|
save!
|
@@ -388,12 +374,12 @@ module Spree
|
|
388
374
|
end
|
389
375
|
|
390
376
|
def manifest_restock(item)
|
391
|
-
if item.states[
|
392
|
-
stock_location.restock item.variant, item.states[
|
377
|
+
if item.states['on_hand'].to_i.positive?
|
378
|
+
stock_location.restock item.variant, item.states['on_hand'], self
|
393
379
|
end
|
394
380
|
|
395
|
-
if item.states[
|
396
|
-
stock_location.restock_backordered item.variant, item.states[
|
381
|
+
if item.states['backordered'].to_i.positive?
|
382
|
+
stock_location.restock_backordered item.variant, item.states['backordered']
|
397
383
|
end
|
398
384
|
end
|
399
385
|
|
@@ -405,19 +391,12 @@ module Spree
|
|
405
391
|
Adjustable::AdjustmentsUpdater.update(self)
|
406
392
|
end
|
407
393
|
|
408
|
-
def send_shipped_email
|
409
|
-
warn "Shipment#send_shipped_email is deprecated, please use ShipmentHandler#send_shipped_email"
|
410
|
-
ShipmentMailer.shipped_email(id).deliver_later
|
411
|
-
end
|
412
|
-
|
413
394
|
def set_cost_zero_when_nil
|
414
395
|
self.cost = 0 unless cost
|
415
396
|
end
|
416
397
|
|
417
398
|
def update_adjustments
|
418
|
-
if saved_change_to_cost? && state != 'shipped'
|
419
|
-
recalculate_adjustments
|
420
|
-
end
|
399
|
+
recalculate_adjustments if saved_change_to_cost? && state != 'shipped'
|
421
400
|
end
|
422
401
|
end
|
423
402
|
end
|
@@ -20,24 +20,22 @@ module Spree
|
|
20
20
|
def perform
|
21
21
|
@shipment.inventory_units.each &:ship!
|
22
22
|
@shipment.process_order_payments if Spree::Config[:auto_capture_on_dispatch]
|
23
|
+
send_shipped_email
|
23
24
|
@shipment.touch :shipped_at
|
24
25
|
update_order_shipment_state
|
25
|
-
send_shipped_email
|
26
26
|
end
|
27
27
|
|
28
28
|
private
|
29
|
-
def send_shipped_email
|
30
|
-
ShipmentMailer.shipped_email(@shipment.id).deliver_later
|
31
|
-
end
|
32
29
|
|
33
|
-
|
34
|
-
|
30
|
+
def send_shipped_email
|
31
|
+
ShipmentMailer.shipped_email(@shipment.id).deliver_later
|
32
|
+
end
|
35
33
|
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
34
|
+
def update_order_shipment_state
|
35
|
+
order = @shipment.order
|
36
|
+
|
37
|
+
new_state = OrderUpdater.new(order).update_shipment_state
|
38
|
+
order.update_columns(shipment_state: new_state, updated_at: Time.current)
|
39
|
+
end
|
42
40
|
end
|
43
41
|
end
|
@@ -1,22 +1,21 @@
|
|
1
1
|
module Spree
|
2
2
|
class ShippingCalculator < Calculator
|
3
|
-
|
4
|
-
def compute_shipment(shipment)
|
3
|
+
def compute_shipment(_shipment)
|
5
4
|
raise NotImplementedError, "Please implement 'compute_shipment(shipment)' in your calculator: #{self.class.name}"
|
6
5
|
end
|
7
6
|
|
8
|
-
def compute_package(
|
7
|
+
def compute_package(_package)
|
9
8
|
raise NotImplementedError, "Please implement 'compute_package(package)' in your calculator: #{self.class.name}"
|
10
9
|
end
|
11
10
|
|
12
|
-
def available?(
|
11
|
+
def available?(_package)
|
13
12
|
true
|
14
13
|
end
|
15
14
|
|
16
15
|
private
|
16
|
+
|
17
17
|
def total(content_items)
|
18
|
-
content_items.
|
18
|
+
content_items.sum(&:amount)
|
19
19
|
end
|
20
20
|
end
|
21
21
|
end
|
22
|
-
|
@@ -38,8 +38,8 @@ module Spree
|
|
38
38
|
end
|
39
39
|
|
40
40
|
def self.calculators
|
41
|
-
spree_calculators.send(model_name_without_spree_namespace)
|
42
|
-
|
41
|
+
spree_calculators.send(model_name_without_spree_namespace).
|
42
|
+
select { |c| c.to_s.constantize < Spree::ShippingCalculator }
|
43
43
|
end
|
44
44
|
|
45
45
|
def tax_category
|
@@ -48,7 +48,7 @@ module Spree
|
|
48
48
|
|
49
49
|
def available_to_display?(display_filter)
|
50
50
|
(frontend? && display_filter == DISPLAY_ON_FRONT_END) ||
|
51
|
-
|
51
|
+
(backend? && display_filter == DISPLAY_ON_BACK_END)
|
52
52
|
end
|
53
53
|
|
54
54
|
private
|
@@ -22,12 +22,12 @@ module Spree
|
|
22
22
|
return price if tax_rate.nil? || tax_amount == 0
|
23
23
|
|
24
24
|
Spree.t tax_rate.included_in_price? ? :including_tax : :excluding_tax,
|
25
|
-
scope:
|
25
|
+
scope: 'shipping_rates.display_price',
|
26
26
|
price: price,
|
27
27
|
tax_amount: display_tax_amount,
|
28
28
|
tax_rate_name: tax_rate.name
|
29
29
|
end
|
30
|
-
|
30
|
+
alias display_cost display_price
|
31
31
|
|
32
32
|
def tax_amount
|
33
33
|
@_tax_amount ||= tax_rate.calculator.compute_shipping_rate(self)
|
data/app/models/spree/state.rb
CHANGED
@@ -24,9 +24,9 @@ module Spree
|
|
24
24
|
# blank is added elsewhere, if needed
|
25
25
|
def self.states_group_by_country_id
|
26
26
|
state_info = Hash.new { |h, k| h[k] = [] }
|
27
|
-
|
27
|
+
order(:name).each do |state|
|
28
28
|
state_info[state.country_id.to_s].push [state.id, state.name]
|
29
|
-
|
29
|
+
end
|
30
30
|
state_info
|
31
31
|
end
|
32
32
|
|
@@ -11,7 +11,7 @@ module Spree
|
|
11
11
|
return if item_available?(line_item, quantity)
|
12
12
|
|
13
13
|
variant = line_item.variant
|
14
|
-
display_name =
|
14
|
+
display_name = variant.name.to_s
|
15
15
|
display_name += " (#{variant.options_text})" unless variant.options_text.blank?
|
16
16
|
|
17
17
|
line_item.errors[:quantity] << Spree.t(
|
@@ -31,14 +31,13 @@ module Spree
|
|
31
31
|
end
|
32
32
|
|
33
33
|
def on_hand?
|
34
|
-
state.to_s ==
|
34
|
+
state.to_s == 'on_hand'
|
35
35
|
end
|
36
36
|
|
37
37
|
def backordered?
|
38
|
-
state.to_s ==
|
38
|
+
state.to_s == 'backordered'
|
39
39
|
end
|
40
40
|
|
41
|
-
|
42
41
|
def amount
|
43
42
|
price * quantity
|
44
43
|
end
|
@@ -21,7 +21,7 @@ module Spree
|
|
21
21
|
packages = estimate_packages(packages)
|
22
22
|
end
|
23
23
|
|
24
|
-
def build_packages(packages =
|
24
|
+
def build_packages(packages = [])
|
25
25
|
stock_locations_with_requested_variants.each do |stock_location|
|
26
26
|
packer = build_packer(stock_location, inventory_units)
|
27
27
|
packages += packer.packages
|
@@ -31,6 +31,7 @@ module Spree
|
|
31
31
|
end
|
32
32
|
|
33
33
|
private
|
34
|
+
|
34
35
|
def stock_locations_with_requested_variants
|
35
36
|
Spree::StockLocation.active.joins(:stock_items).
|
36
37
|
where(spree_stock_items: { variant_id: requested_variant_ids }).distinct
|
@@ -57,7 +58,7 @@ module Spree
|
|
57
58
|
Packer.new(stock_location, inventory_units, splitters(stock_location))
|
58
59
|
end
|
59
60
|
|
60
|
-
def splitters(
|
61
|
+
def splitters(_stock_location)
|
61
62
|
# extension point to return custom splitters for a location
|
62
63
|
Rails.application.config.spree.stock_splitters
|
63
64
|
end
|
@@ -16,11 +16,12 @@ module Spree
|
|
16
16
|
end
|
17
17
|
|
18
18
|
private
|
19
|
+
|
19
20
|
def build_missing
|
20
21
|
@missing = Hash.new(0)
|
21
22
|
required.keys.each do |variant|
|
22
|
-
|
23
|
-
|
23
|
+
missing = required[variant] - packed[variant]
|
24
|
+
@missing[variant] = missing if missing > 0
|
24
25
|
end
|
25
26
|
end
|
26
27
|
|
@@ -17,6 +17,7 @@ module Spree
|
|
17
17
|
end
|
18
18
|
|
19
19
|
private
|
20
|
+
|
20
21
|
def choose_default_shipping_rate(shipping_rates)
|
21
22
|
unless shipping_rates.empty?
|
22
23
|
shipping_rates.min_by(&:cost).selected = true
|
@@ -31,10 +32,11 @@ module Spree
|
|
31
32
|
shipping_methods(package, ui_filter).map do |shipping_method|
|
32
33
|
cost = shipping_method.calculator.compute(package)
|
33
34
|
|
35
|
+
next unless cost
|
34
36
|
shipping_method.shipping_rates.new(
|
35
37
|
cost: gross_amount(cost, taxation_options_for(shipping_method)),
|
36
38
|
tax_rate: first_tax_rate_for(shipping_method.tax_category)
|
37
|
-
)
|
39
|
+
)
|
38
40
|
end.compact
|
39
41
|
end
|
40
42
|
|
@@ -59,10 +61,10 @@ module Spree
|
|
59
61
|
calculator = ship_method.calculator
|
60
62
|
|
61
63
|
ship_method.available_to_display?(display_filter) &&
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
64
|
+
ship_method.include?(order.ship_address) &&
|
65
|
+
calculator.available?(package) &&
|
66
|
+
(calculator.preferences[:currency].blank? ||
|
67
|
+
calculator.preferences[:currency] == currency)
|
66
68
|
end
|
67
69
|
end
|
68
70
|
end
|
@@ -4,14 +4,14 @@ module Spree
|
|
4
4
|
attr_reader :stock_location, :contents
|
5
5
|
attr_accessor :shipping_rates
|
6
6
|
|
7
|
-
def initialize(stock_location, contents=[])
|
7
|
+
def initialize(stock_location, contents = [])
|
8
8
|
@stock_location = stock_location
|
9
9
|
@contents = contents
|
10
|
-
@shipping_rates =
|
10
|
+
@shipping_rates = []
|
11
11
|
end
|
12
12
|
|
13
13
|
def add(inventory_unit, state = :on_hand)
|
14
|
-
|
14
|
+
# Remove find_item check as already taken care by prioritizer
|
15
15
|
contents << ContentItem.new(inventory_unit, state)
|
16
16
|
end
|
17
17
|
|
@@ -31,7 +31,7 @@ module Spree
|
|
31
31
|
# Fix regression that removed package.order.
|
32
32
|
# Find it dynamically through an inventory_unit.
|
33
33
|
def order
|
34
|
-
contents.detect {|item| !!item.try(:inventory_unit).try(:order) }.try(:inventory_unit).try(:order)
|
34
|
+
contents.detect { |item| !!item.try(:inventory_unit).try(:order) }.try(:inventory_unit).try(:order)
|
35
35
|
end
|
36
36
|
|
37
37
|
def weight
|
@@ -55,7 +55,7 @@ module Spree
|
|
55
55
|
|
56
56
|
def quantity(state = nil)
|
57
57
|
matched_contents = state.nil? ? contents : contents.select { |c| c.state.to_s == state.to_s }
|
58
|
-
matched_contents.
|
58
|
+
matched_contents.sum(&:quantity)
|
59
59
|
end
|
60
60
|
|
61
61
|
def empty?
|
@@ -3,7 +3,7 @@ module Spree
|
|
3
3
|
class Packer
|
4
4
|
attr_reader :stock_location, :inventory_units, :splitters
|
5
5
|
|
6
|
-
def initialize(stock_location, inventory_units, splitters=[Splitter::Base])
|
6
|
+
def initialize(stock_location, inventory_units, splitters = [Splitter::Base])
|
7
7
|
@stock_location = stock_location
|
8
8
|
@inventory_units = inventory_units
|
9
9
|
@splitters = splitters
|
@@ -3,10 +3,10 @@ module Spree
|
|
3
3
|
class Prioritizer
|
4
4
|
attr_reader :packages
|
5
5
|
|
6
|
-
def initialize(packages, adjuster_class=Adjuster)
|
6
|
+
def initialize(packages, adjuster_class = Adjuster)
|
7
7
|
@packages = packages
|
8
8
|
@adjuster_class = adjuster_class
|
9
|
-
@adjusters =
|
9
|
+
@adjusters = {}
|
10
10
|
end
|
11
11
|
|
12
12
|
def prioritized_packages
|
@@ -22,15 +22,13 @@ module Spree
|
|
22
22
|
packages.each do |package|
|
23
23
|
package.contents.each do |item|
|
24
24
|
adjuster = find_adjuster(item)
|
25
|
-
if adjuster.nil?
|
26
|
-
adjuster = build_adjuster(item, package)
|
27
|
-
end
|
25
|
+
adjuster = build_adjuster(item, package) if adjuster.nil?
|
28
26
|
adjuster.adjust(package, item)
|
29
27
|
end
|
30
28
|
end
|
31
29
|
end
|
32
30
|
|
33
|
-
def build_adjuster(item,
|
31
|
+
def build_adjuster(item, _package)
|
34
32
|
@adjusters[hash_item item] = @adjuster_class.new(item.inventory_unit)
|
35
33
|
end
|
36
34
|
|
@@ -43,7 +41,7 @@ module Spree
|
|
43
41
|
end
|
44
42
|
|
45
43
|
def prune_packages
|
46
|
-
packages.reject!
|
44
|
+
packages.reject!(&:empty?)
|
47
45
|
end
|
48
46
|
|
49
47
|
def hash_item(item)
|
@@ -2,21 +2,19 @@ module Spree
|
|
2
2
|
module Stock
|
3
3
|
module Splitter
|
4
4
|
class Backordered < Spree::Stock::Splitter::Base
|
5
|
-
|
6
5
|
def split(packages)
|
7
6
|
split_packages = []
|
8
7
|
packages.each do |package|
|
9
|
-
|
8
|
+
unless package.on_hand.empty?
|
10
9
|
split_packages << build_package(package.on_hand)
|
11
10
|
end
|
12
11
|
|
13
|
-
|
12
|
+
unless package.backordered.empty?
|
14
13
|
split_packages << build_package(package.backordered)
|
15
14
|
end
|
16
15
|
end
|
17
16
|
return_next split_packages
|
18
17
|
end
|
19
|
-
|
20
18
|
end
|
21
19
|
end
|
22
20
|
end
|
@@ -4,7 +4,7 @@ module Spree
|
|
4
4
|
class Base
|
5
5
|
attr_reader :packer, :next_splitter
|
6
6
|
|
7
|
-
def initialize(packer, next_splitter=nil)
|
7
|
+
def initialize(packer, next_splitter = nil)
|
8
8
|
@packer = packer
|
9
9
|
@next_splitter = next_splitter
|
10
10
|
end
|
@@ -15,11 +15,12 @@ module Spree
|
|
15
15
|
end
|
16
16
|
|
17
17
|
private
|
18
|
+
|
18
19
|
def return_next(packages)
|
19
20
|
next_splitter ? next_splitter.split(packages) : packages
|
20
21
|
end
|
21
22
|
|
22
|
-
def build_package(contents=[])
|
23
|
+
def build_package(contents = [])
|
23
24
|
Spree::Stock::Package.new(stock_location, contents)
|
24
25
|
end
|
25
26
|
end
|
@@ -11,6 +11,7 @@ module Spree
|
|
11
11
|
end
|
12
12
|
|
13
13
|
private
|
14
|
+
|
14
15
|
def split_by_category(package)
|
15
16
|
categories = Hash.new { |hash, key| hash[key] = [] }
|
16
17
|
package.contents.each do |item|
|
@@ -21,7 +22,7 @@ module Spree
|
|
21
22
|
|
22
23
|
def hash_to_packages(categories)
|
23
24
|
packages = []
|
24
|
-
categories.each do |
|
25
|
+
categories.each do |_id, contents|
|
25
26
|
packages << build_package(contents)
|
26
27
|
end
|
27
28
|
packages
|
@@ -96,7 +96,7 @@ module Spree
|
|
96
96
|
# the variant_id changes from nil when a new stock location is added
|
97
97
|
stock_changed = (saved_change_to_count_on_hand? &&
|
98
98
|
saved_change_to_count_on_hand.any?(&:zero?)) ||
|
99
|
-
|
99
|
+
saved_change_to_variant_id?
|
100
100
|
|
101
101
|
variant.touch if !Spree::Config.binary_inventory_cache || stock_changed
|
102
102
|
end
|