spree_core 3.3.6 → 3.4.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/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
|