solidus_core 2.4.2 → 2.5.0.beta1
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 +5 -5
- data/README.md +1 -5
- data/Rakefile +23 -6
- data/app/helpers/spree/base_helper.rb +15 -10
- data/app/helpers/spree/checkout_helper.rb +1 -1
- data/app/helpers/spree/products_helper.rb +2 -2
- data/app/mailers/spree/carton_mailer.rb +2 -2
- data/app/mailers/spree/order_mailer.rb +4 -4
- data/app/mailers/spree/reimbursement_mailer.rb +2 -2
- data/app/mailers/spree/test_mailer.rb +1 -1
- data/app/models/concerns/spree/adjustment_source.rb +17 -11
- data/app/models/concerns/spree/calculated_adjustments.rb +2 -2
- data/app/models/spree/ability.rb +1 -1
- data/app/models/spree/address.rb +7 -0
- data/app/models/spree/adjustment.rb +6 -2
- data/app/models/spree/calculator.rb +1 -1
- data/app/models/spree/calculator/flexi_rate.rb +1 -0
- data/app/models/spree/calculator/free_shipping.rb +2 -0
- data/app/models/spree/calculator/percent_on_line_item.rb +6 -6
- data/app/models/spree/calculator/percent_per_item.rb +2 -0
- data/app/models/spree/calculator/returns/default_refund_amount.rb +4 -4
- data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +1 -0
- data/app/models/spree/calculator/shipping/flat_rate.rb +1 -0
- data/app/models/spree/calculator/shipping/flexi_rate.rb +1 -0
- data/app/models/spree/calculator/shipping/per_item.rb +1 -0
- data/app/models/spree/calculator/shipping/price_sack.rb +1 -0
- data/app/models/spree/classification.rb +1 -1
- data/app/models/spree/customer_return.rb +1 -1
- data/app/models/spree/inventory_unit.rb +8 -2
- data/app/models/spree/log_entry.rb +0 -11
- data/app/models/spree/order.rb +31 -16
- data/app/models/spree/order_contents.rb +0 -14
- data/app/models/spree/order_shipping.rb +0 -5
- data/app/models/spree/order_updater.rb +0 -4
- data/app/models/spree/payment.rb +6 -1
- data/app/models/spree/payment/processing.rb +4 -4
- data/app/models/spree/payment_method.rb +8 -3
- data/app/models/spree/payment_method/credit_card.rb +1 -1
- data/app/models/spree/payment_method/store_credit.rb +4 -4
- data/app/models/spree/price.rb +7 -1
- data/app/models/spree/product.rb +34 -6
- data/app/models/spree/product/scopes.rb +2 -2
- data/app/models/spree/promotion.rb +1 -2
- data/app/models/spree/promotion/actions/create_adjustment.rb +3 -2
- data/app/models/spree/promotion/actions/create_item_adjustments.rb +7 -8
- data/app/models/spree/promotion/actions/free_shipping.rb +1 -1
- data/app/models/spree/promotion/rules/taxon.rb +25 -24
- data/app/models/spree/promotion_action.rb +7 -1
- data/app/models/spree/promotion_chooser.rb +1 -1
- data/app/models/spree/promotion_code.rb +3 -3
- data/app/models/spree/promotion_handler/coupon.rb +8 -29
- data/app/models/spree/promotion_rule.rb +1 -1
- data/app/models/spree/refund.rb +3 -3
- data/app/models/spree/reimbursement.rb +1 -1
- data/app/models/spree/return_authorization.rb +2 -2
- data/app/models/spree/return_item.rb +3 -3
- data/app/models/spree/return_item/eligibility_validator/base_validator.rb +2 -2
- data/app/models/spree/return_item/eligibility_validator/inventory_shipped.rb +1 -1
- data/app/models/spree/return_item/eligibility_validator/no_reimbursements.rb +1 -1
- data/app/models/spree/return_item/eligibility_validator/order_completed.rb +1 -1
- data/app/models/spree/return_item/eligibility_validator/rma_required.rb +1 -1
- data/app/models/spree/return_item/eligibility_validator/time_since_purchase.rb +1 -1
- data/app/models/spree/shipment.rb +16 -6
- data/app/models/spree/shipping_method.rb +7 -0
- data/app/models/spree/shipping_rate.rb +6 -6
- data/app/models/spree/shipping_rate_tax.rb +2 -2
- data/app/models/spree/stock/availability_validator.rb +2 -2
- data/app/models/spree/stock/estimator.rb +9 -1
- data/app/models/spree/stock/inventory_unit_builder.rb +1 -2
- data/app/models/spree/stock/inventory_validator.rb +2 -2
- data/app/models/spree/stock/package.rb +1 -1
- data/app/models/spree/stock/simple_coordinator.rb +2 -2
- data/app/models/spree/stock_item.rb +6 -0
- data/app/models/spree/stock_location.rb +2 -2
- data/app/models/spree/store_credit.rb +19 -12
- data/app/models/spree/store_credit_category.rb +1 -1
- data/app/models/spree/store_credit_event.rb +7 -1
- data/app/models/spree/tax/shipping_rate_taxer.rb +1 -1
- data/app/models/spree/tax_calculator/shipping_rate.rb +12 -3
- data/app/models/spree/tax_rate.rb +10 -3
- data/app/models/spree/taxon.rb +14 -4
- data/app/models/spree/taxonomy.rb +1 -1
- data/app/models/spree/unit_cancel.rb +1 -1
- data/app/models/spree/variant.rb +33 -1
- data/app/models/spree/variant/price_selector.rb +1 -1
- data/app/models/spree/variant/pricing_options.rb +1 -1
- data/app/models/spree/variant/scopes.rb +1 -1
- data/app/models/spree/variant/vat_price_generator.rb +1 -1
- data/app/views/spree/carton_mailer/shipped_email.html.erb +6 -6
- data/app/views/spree/carton_mailer/shipped_email.text.erb +6 -6
- data/app/views/spree/order_mailer/cancel_email.html.erb +5 -5
- data/app/views/spree/order_mailer/cancel_email.text.erb +5 -5
- data/app/views/spree/order_mailer/confirm_email.html.erb +9 -9
- data/app/views/spree/order_mailer/confirm_email.text.erb +9 -9
- data/app/views/spree/order_mailer/inventory_cancellation_email.html.erb +3 -3
- data/app/views/spree/order_mailer/inventory_cancellation_email.text.erb +3 -3
- data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_errored.text.erb +1 -1
- data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_finished.text.erb +1 -1
- data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +5 -5
- data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +5 -5
- data/app/views/spree/shared/_error_messages.html.erb +2 -2
- data/app/views/spree/test_mailer/test_email.html.erb +2 -2
- data/app/views/spree/test_mailer/test_email.text.erb +2 -2
- data/config/initializers/assets.rb +3 -1
- data/config/locales/en.yml +44 -48
- data/db/default/spree/store_credit.rb +1 -1
- data/db/default/spree/stores.rb +7 -8
- data/db/migrate/20160101010000_solidus_one_four.rb +4 -46
- data/db/migrate/20170317035819_add_lft_and_rgt_indexes_to_taxons.rb +6 -0
- data/db/migrate/20170319191942_remove_order_id_from_inventory_units.rb +28 -0
- data/db/migrate/20170608074534_rename_bogus_gateways.rb +4 -2
- data/db/migrate/20170831201542_remove_default_tax_from_spree_zones.rb +1 -1
- data/lib/generators/spree/custom_user/custom_user_generator.rb +11 -22
- data/lib/generators/spree/install/install_generator.rb +10 -5
- data/lib/spree/app_configuration.rb +103 -5
- data/lib/spree/core.rb +3 -2
- data/lib/spree/core/active_merchant_dependencies.rb +11 -0
- data/lib/spree/core/controller_helpers/auth.rb +3 -1
- data/lib/spree/core/controller_helpers/common.rb +3 -7
- data/lib/spree/core/engine.rb +18 -100
- data/lib/spree/core/environment.rb +3 -3
- data/lib/spree/core/importer/order.rb +0 -1
- data/lib/spree/core/permalinks.rb +9 -15
- data/lib/spree/core/product_filters.rb +5 -3
- data/lib/spree/core/role_configuration.rb +23 -7
- data/lib/spree/core/search/base.rb +16 -13
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/paranoia_deprecations.rb +19 -0
- data/lib/spree/permission_sets.rb +0 -4
- data/lib/spree/permitted_attributes.rb +0 -3
- data/lib/spree/preferences/preferable.rb +70 -34
- data/lib/spree/preferences/preferable_class_methods.rb +22 -0
- data/lib/spree/testing_support/authorization_helpers.rb +2 -0
- data/lib/spree/testing_support/common_rake.rb +0 -1
- data/lib/spree/testing_support/dummy_app.rb +100 -0
- data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/backend/all.js +10 -0
- data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/frontend/all.js +10 -0
- data/lib/spree/testing_support/dummy_app/assets/stylesheets/spree/backend/all.css +9 -0
- data/lib/spree/testing_support/dummy_app/assets/stylesheets/spree/frontend/all.css +9 -0
- data/lib/spree/testing_support/dummy_app/database.yml +31 -0
- data/lib/spree/testing_support/dummy_app/migrations.rb +35 -0
- data/lib/spree/testing_support/dummy_app/rake_tasks.rb +60 -0
- data/lib/spree/testing_support/dummy_app/views/layouts/application.html.erb +1 -0
- data/lib/spree/testing_support/factories.rb +1 -1
- data/lib/spree/testing_support/factories/address_factory.rb +2 -2
- data/lib/spree/testing_support/factories/adjustment_factory.rb +2 -2
- data/lib/spree/testing_support/factories/adjustment_reason_factory.rb +1 -1
- data/lib/spree/testing_support/factories/calculator_factory.rb +1 -1
- data/lib/spree/testing_support/factories/carton_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 +2 -2
- data/lib/spree/testing_support/factories/image_factory.rb +1 -1
- data/lib/spree/testing_support/factories/inventory_unit_factory.rb +13 -4
- data/lib/spree/testing_support/factories/line_item_factory.rb +1 -1
- data/lib/spree/testing_support/factories/option_type_factory.rb +1 -1
- data/lib/spree/testing_support/factories/option_value_factory.rb +1 -1
- data/lib/spree/testing_support/factories/order_factory.rb +5 -1
- data/lib/spree/testing_support/factories/order_promotion_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 +1 -1
- 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 -1
- data/lib/spree/testing_support/factories/promotion_code_factory.rb +2 -2
- data/lib/spree/testing_support/factories/promotion_factory.rb +1 -1
- data/lib/spree/testing_support/factories/property_factory.rb +1 -1
- data/lib/spree/testing_support/factories/refund_factory.rb +1 -1
- data/lib/spree/testing_support/factories/refund_reason_factory.rb +1 -1
- data/lib/spree/testing_support/factories/reimbursement_factory.rb +1 -1
- 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/return_reason_factory.rb +1 -1
- data/lib/spree/testing_support/factories/role_factory.rb +1 -1
- data/lib/spree/testing_support/factories/shipment_factory.rb +1 -2
- data/lib/spree/testing_support/factories/shipping_category_factory.rb +1 -1
- data/lib/spree/testing_support/factories/shipping_method_factory.rb +2 -2
- data/lib/spree/testing_support/factories/shipping_rate_factory.rb +1 -1
- data/lib/spree/testing_support/factories/state_factory.rb +1 -7
- data/lib/spree/testing_support/factories/stock_item_factory.rb +1 -1
- data/lib/spree/testing_support/factories/stock_location_factory.rb +1 -1
- data/lib/spree/testing_support/factories/stock_movement_factory.rb +1 -1
- data/lib/spree/testing_support/factories/stock_package_factory.rb +1 -1
- data/lib/spree/testing_support/factories/store_credit_category_factory.rb +1 -1
- 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 +2 -2
- data/lib/spree/testing_support/factories/store_credit_update_reason_factory.rb +1 -1
- data/lib/spree/testing_support/factories/store_factory.rb +1 -1
- data/lib/spree/testing_support/factories/tax_category_factory.rb +1 -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/user_factory.rb +4 -10
- data/lib/spree/testing_support/factories/variant_factory.rb +1 -1
- data/lib/spree/testing_support/factories/variant_property_rule_condition_factory.rb +1 -1
- data/lib/spree/testing_support/factories/variant_property_rule_factory.rb +1 -1
- data/lib/spree/testing_support/factories/variant_property_rule_value_factory.rb +1 -1
- data/lib/spree/testing_support/factories/zone_factory.rb +2 -4
- data/lib/spree/testing_support/flash.rb +2 -2
- data/lib/spree/testing_support/order_walkthrough.rb +9 -9
- data/lib/spree/testing_support/preferences.rb +4 -0
- data/lib/spree/testing_support/sequences.rb +3 -12
- data/solidus_core.gemspec +12 -8
- data/spec/helpers/base_helper_spec.rb +19 -3
- data/spec/helpers/products_helper_spec.rb +1 -1
- data/spec/lib/calculated_adjustments_spec.rb +20 -0
- data/spec/lib/i18n_spec.rb +4 -69
- data/spec/lib/search/base_spec.rb +1 -0
- data/spec/lib/search/variant_spec.rb +4 -4
- data/spec/lib/spree/core/controller_helpers/pricing_spec.rb +6 -6
- data/spec/lib/spree/core/importer/order_spec.rb +2 -2
- data/spec/lib/spree/core/role_configuration_spec.rb +6 -9
- data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +12 -8
- data/spec/lib/spree/core/testing_support/factories/reimbursement_factory_spec.rb +1 -1
- data/spec/lib/spree/core/testing_support/factories/store_credit_category_factory_spec.rb +1 -1
- data/spec/mailers/carton_mailer_spec.rb +3 -7
- data/spec/mailers/order_mailer_spec.rb +7 -11
- data/spec/mailers/reimbursement_mailer_spec.rb +1 -5
- data/spec/mailers/test_mailer_spec.rb +0 -4
- data/spec/models/spree/ability_spec.rb +2 -1
- data/spec/models/spree/address_spec.rb +32 -19
- data/spec/models/spree/app_configuration_spec.rb +1 -1
- data/spec/models/spree/calculator/distributed_amount_spec.rb +1 -1
- data/spec/models/spree/calculator/percent_on_line_item_spec.rb +8 -10
- data/spec/models/spree/calculator/percent_per_item_spec.rb +4 -4
- data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +10 -3
- data/spec/models/spree/classification_spec.rb +19 -0
- data/spec/models/spree/credit_card_spec.rb +1 -1
- data/spec/models/spree/customer_return_spec.rb +17 -6
- data/spec/models/spree/distributed_amounts_handler_spec.rb +1 -1
- data/spec/models/spree/exchange_spec.rb +1 -1
- data/spec/models/spree/inventory_unit_spec.rb +3 -7
- data/spec/models/spree/line_item_spec.rb +6 -6
- data/spec/models/spree/option_value_spec.rb +11 -6
- data/spec/models/spree/order/callbacks_spec.rb +2 -2
- data/spec/models/spree/order/checkout_spec.rb +31 -31
- data/spec/models/spree/order/risk_assessment_spec.rb +9 -9
- data/spec/models/spree/order_contents_spec.rb +1 -9
- data/spec/models/spree/order_inventory_spec.rb +2 -2
- data/spec/models/spree/order_mutex_spec.rb +3 -1
- data/spec/models/spree/order_shipping_spec.rb +7 -4
- data/spec/models/spree/order_spec.rb +36 -13
- data/spec/models/spree/order_taxation_spec.rb +7 -7
- data/spec/models/spree/order_updater_spec.rb +6 -4
- data/spec/models/spree/payment/cancellation_spec.rb +1 -1
- data/spec/models/spree/payment_create_spec.rb +2 -2
- data/spec/models/spree/payment_method/store_credit_spec.rb +13 -13
- data/spec/models/spree/payment_spec.rb +23 -4
- data/spec/models/spree/preferences/preferable_spec.rb +44 -0
- data/spec/models/spree/preferences/statically_configurable_spec.rb +1 -0
- data/spec/models/spree/price_spec.rb +6 -4
- data/spec/models/spree/product/scopes_spec.rb +1 -1
- data/spec/models/spree/product_spec.rb +49 -9
- data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +13 -3
- data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +146 -134
- data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +6 -6
- data/spec/models/spree/promotion/rules/taxon_spec.rb +14 -14
- data/spec/models/spree/promotion_code_spec.rb +31 -19
- data/spec/models/spree/promotion_handler/coupon_spec.rb +42 -17
- data/spec/models/spree/promotion_handler/shipping_spec.rb +1 -6
- data/spec/models/spree/promotion_spec.rb +14 -14
- data/spec/models/spree/refund_spec.rb +1 -1
- data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +1 -1
- data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +1 -1
- data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +3 -2
- data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +1 -1
- data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +2 -2
- data/spec/models/spree/return_item_spec.rb +6 -6
- data/spec/models/spree/shipment_spec.rb +14 -10
- data/spec/models/spree/shipping_manifest_spec.rb +22 -9
- data/spec/models/spree/shipping_method_spec.rb +9 -5
- data/spec/models/spree/stock/availability_spec.rb +16 -2
- data/spec/models/spree/stock/estimator_spec.rb +11 -12
- data/spec/models/spree/stock/inventory_unit_builder_spec.rb +0 -4
- data/spec/models/spree/stock/package_spec.rb +3 -2
- data/spec/models/spree/stock/simple_coordinator_spec.rb +1 -24
- data/spec/models/spree/stock_item_spec.rb +6 -6
- data/spec/models/spree/stock_location_spec.rb +16 -3
- data/spec/models/spree/store_credit_spec.rb +12 -6
- data/spec/models/spree/tax/taxation_integration_spec.rb +6 -6
- data/spec/models/spree/tax_calculator/default_spec.rb +7 -7
- data/spec/models/spree/taxon_spec.rb +42 -19
- data/spec/models/spree/variant/vat_price_generator_spec.rb +1 -1
- data/spec/models/spree/variant_spec.rb +69 -11
- data/spec/rails_helper.rb +7 -13
- data/spec/spec_helper.rb +3 -12
- data/spec/support/concerns/default_price.rb +1 -1
- data/spec/support/dummy_ability.rb +2 -0
- metadata +144 -73
- data/Gemfile +0 -3
- data/app/models/spree/order_stock_location.rb +0 -15
- data/app/models/spree/stock_transfer.rb +0 -110
- data/app/models/spree/transfer_item.rb +0 -54
- data/lib/generators/spree/custom_user/templates/initializer.rb.tt +0 -1
- data/lib/spree/permission_sets/restricted_stock_transfer_display.rb +0 -17
- data/lib/spree/permission_sets/restricted_stock_transfer_management.rb +0 -52
- data/lib/spree/permission_sets/stock_transfer_display.rb +0 -10
- data/lib/spree/permission_sets/stock_transfer_management.rb +0 -11
- data/lib/spree/testing_support/factories/stock_transfer_factory.rb +0 -28
- data/lib/spree/testing_support/i18n.rb +0 -97
- data/spec/lib/spree/core/testing_support/factories/stock_transfer_factory_spec.rb +0 -12
- data/spec/models/spree/order_stock_location_spec.rb +0 -18
- data/spec/models/spree/permission_sets/restricted_stock_transfer_display_spec.rb +0 -49
- data/spec/models/spree/permission_sets/restricted_stock_transfer_management_spec.rb +0 -218
- data/spec/models/spree/permission_sets/stock_transfer_display_spec.rb +0 -23
- data/spec/models/spree/permission_sets/stock_transfer_management_spec.rb +0 -23
- data/spec/models/spree/stock_transfer_spec.rb +0 -308
- data/spec/models/spree/transfer_item_spec.rb +0 -275
- data/spec/support/test_gateway.rb +0 -2
|
@@ -65,7 +65,7 @@ module Spree
|
|
|
65
65
|
|
|
66
66
|
def return_items_belong_to_same_order
|
|
67
67
|
if return_items.select{ |return_item| return_item.inventory_unit.order_id != order_id }.any?
|
|
68
|
-
errors.add(:base,
|
|
68
|
+
errors.add(:base, I18n.t('spree.return_items_cannot_be_associated_with_multiple_orders'))
|
|
69
69
|
end
|
|
70
70
|
end
|
|
71
71
|
|
|
@@ -7,7 +7,6 @@ module Spree
|
|
|
7
7
|
CANCELABLE_STATES = ['on_hand', 'backordered', 'shipped']
|
|
8
8
|
|
|
9
9
|
belongs_to :variant, -> { with_deleted }, class_name: "Spree::Variant", inverse_of: :inventory_units
|
|
10
|
-
belongs_to :order, class_name: "Spree::Order", inverse_of: :inventory_units
|
|
11
10
|
belongs_to :shipment, class_name: "Spree::Shipment", touch: true, inverse_of: :inventory_units
|
|
12
11
|
belongs_to :return_authorization, class_name: "Spree::ReturnAuthorization", inverse_of: :inventory_units
|
|
13
12
|
belongs_to :carton, class_name: "Spree::Carton", inverse_of: :inventory_units
|
|
@@ -16,8 +15,15 @@ module Spree
|
|
|
16
15
|
has_many :return_items, inverse_of: :inventory_unit, dependent: :destroy
|
|
17
16
|
has_one :original_return_item, class_name: "Spree::ReturnItem", foreign_key: :exchange_inventory_unit_id, dependent: :destroy
|
|
18
17
|
has_one :unit_cancel, class_name: "Spree::UnitCancel"
|
|
18
|
+
has_one :order, through: :shipment
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
delegate :order_id, to: :shipment
|
|
21
|
+
|
|
22
|
+
def order=(_)
|
|
23
|
+
raise "The order association has been removed from InventoryUnit. The order is now determined from the shipment."
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
validates_presence_of :shipment, :line_item, :variant
|
|
21
27
|
|
|
22
28
|
before_destroy :ensure_can_destroy
|
|
23
29
|
|
|
@@ -2,17 +2,6 @@ module Spree
|
|
|
2
2
|
class LogEntry < Spree::Base
|
|
3
3
|
belongs_to :source, polymorphic: true
|
|
4
4
|
|
|
5
|
-
# Fix for https://github.com/spree/spree/issues/1767
|
|
6
|
-
# If a payment fails, we want to make sure we keep the record of it failing
|
|
7
|
-
after_rollback :save_anyway
|
|
8
|
-
|
|
9
|
-
def save_anyway
|
|
10
|
-
log = Spree::LogEntry.new
|
|
11
|
-
log.source = source
|
|
12
|
-
log.details = details
|
|
13
|
-
log.save!
|
|
14
|
-
end
|
|
15
|
-
|
|
16
5
|
def parsed_details
|
|
17
6
|
@details ||= YAML.load(details)
|
|
18
7
|
end
|
data/app/models/spree/order.rb
CHANGED
|
@@ -73,13 +73,14 @@ module Spree
|
|
|
73
73
|
has_many :products, through: :variants
|
|
74
74
|
|
|
75
75
|
# Shipping
|
|
76
|
-
has_many :inventory_units, inverse_of: :order
|
|
77
|
-
has_many :cartons, -> { distinct }, through: :inventory_units
|
|
78
76
|
has_many :shipments, dependent: :destroy, inverse_of: :order do
|
|
79
77
|
def states
|
|
80
78
|
pluck(:state).uniq
|
|
81
79
|
end
|
|
82
80
|
end
|
|
81
|
+
has_many :inventory_units, through: :shipments
|
|
82
|
+
has_many :cartons, -> { distinct }, through: :inventory_units
|
|
83
|
+
|
|
83
84
|
has_many :order_stock_locations, class_name: "Spree::OrderStockLocation"
|
|
84
85
|
has_many :stock_locations, through: :order_stock_locations
|
|
85
86
|
|
|
@@ -131,7 +132,13 @@ module Spree
|
|
|
131
132
|
validates :number, presence: true, uniqueness: { allow_blank: true }
|
|
132
133
|
validates :store_id, presence: true
|
|
133
134
|
|
|
134
|
-
|
|
135
|
+
def self.find_by_param(value)
|
|
136
|
+
find_by number: value
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def self.find_by_param!(value)
|
|
140
|
+
find_by! number: value
|
|
141
|
+
end
|
|
135
142
|
|
|
136
143
|
delegate :update_totals, :persist_totals, to: :updater
|
|
137
144
|
delegate :firstname, :lastname, to: :bill_address, prefix: true, allow_nil: true
|
|
@@ -150,7 +157,7 @@ module Spree
|
|
|
150
157
|
scope :by_store, ->(store) { where(store_id: store.id) }
|
|
151
158
|
|
|
152
159
|
# shows completed orders first, by their completed_at date, then uncompleted orders by their created_at
|
|
153
|
-
scope :reverse_chronological, -> { order('spree_orders.completed_at IS NULL', completed_at: :desc, created_at: :desc) }
|
|
160
|
+
scope :reverse_chronological, -> { order(Arel.sql('spree_orders.completed_at IS NULL'), completed_at: :desc, created_at: :desc) }
|
|
154
161
|
|
|
155
162
|
def self.by_customer(customer)
|
|
156
163
|
joins(:user).where("#{Spree.user_class.table_name}.email" => customer)
|
|
@@ -168,6 +175,14 @@ module Spree
|
|
|
168
175
|
where(completed_at: nil)
|
|
169
176
|
end
|
|
170
177
|
|
|
178
|
+
def self.canceled
|
|
179
|
+
where(state: 'canceled')
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
def self.not_canceled
|
|
183
|
+
where.not(state: 'canceled')
|
|
184
|
+
end
|
|
185
|
+
|
|
171
186
|
# Use this method in other gems that wish to register their own custom logic
|
|
172
187
|
# that should be called after Order#update
|
|
173
188
|
def self.register_update_hook(hook)
|
|
@@ -460,8 +475,8 @@ module Spree
|
|
|
460
475
|
# Check to see if any line item variants are soft, deleted.
|
|
461
476
|
# If so add error and restart checkout.
|
|
462
477
|
def ensure_line_item_variants_are_not_deleted
|
|
463
|
-
if line_items.any? { |li| li.variant.
|
|
464
|
-
errors.add(:base,
|
|
478
|
+
if line_items.any? { |li| li.variant.discarded? }
|
|
479
|
+
errors.add(:base, I18n.t('spree.deleted_variants_present'))
|
|
465
480
|
restart_checkout_flow
|
|
466
481
|
false
|
|
467
482
|
else
|
|
@@ -520,15 +535,15 @@ module Spree
|
|
|
520
535
|
|
|
521
536
|
def ensure_shipping_address
|
|
522
537
|
unless ship_address && ship_address.valid?
|
|
523
|
-
errors.add(:base,
|
|
538
|
+
errors.add(:base, I18n.t('spree.ship_address_required')) && (return false)
|
|
524
539
|
end
|
|
525
540
|
end
|
|
526
541
|
|
|
527
542
|
def create_proposed_shipments
|
|
528
543
|
if completed?
|
|
529
|
-
raise CannotRebuildShipments.new(
|
|
544
|
+
raise CannotRebuildShipments.new(I18n.t('spree.cannot_rebuild_shipments_order_completed'))
|
|
530
545
|
elsif shipments.any? { |s| !s.pending? }
|
|
531
|
-
raise CannotRebuildShipments.new(
|
|
546
|
+
raise CannotRebuildShipments.new(I18n.t('spree.cannot_rebuild_shipments_shipments_not_pending'))
|
|
532
547
|
else
|
|
533
548
|
shipments.destroy_all
|
|
534
549
|
self.shipments = Spree::Config.stock.coordinator_class.new(self).shipments
|
|
@@ -660,7 +675,7 @@ module Spree
|
|
|
660
675
|
payments.reset
|
|
661
676
|
|
|
662
677
|
if payments.where(state: %w(checkout pending completed)).sum(:amount) != total
|
|
663
|
-
errors.add(:base,
|
|
678
|
+
errors.add(:base, I18n.t('spree.store_credit.errors.unable_to_fund')) && (return false)
|
|
664
679
|
end
|
|
665
680
|
end
|
|
666
681
|
|
|
@@ -782,7 +797,7 @@ module Spree
|
|
|
782
797
|
return if !payment_required?
|
|
783
798
|
|
|
784
799
|
if payments.valid.empty?
|
|
785
|
-
errors.add(:base,
|
|
800
|
+
errors.add(:base, I18n.t('spree.no_payment_found'))
|
|
786
801
|
return false
|
|
787
802
|
end
|
|
788
803
|
|
|
@@ -806,12 +821,12 @@ module Spree
|
|
|
806
821
|
# }
|
|
807
822
|
#
|
|
808
823
|
def update_params_payment_source
|
|
824
|
+
Spree::Deprecation.warn('update_params_payment_source is deprecated. Please use set_payment_parameters_amount instead.', caller)
|
|
809
825
|
if @updating_params[:order] && (@updating_params[:order][:payments_attributes] || @updating_params[:order][:existing_card])
|
|
810
826
|
@updating_params[:order][:payments_attributes] ||= [{}]
|
|
811
827
|
@updating_params[:order][:payments_attributes].first[:amount] = total
|
|
812
828
|
end
|
|
813
829
|
end
|
|
814
|
-
deprecate update_params_payment_source: :set_payment_parameters_amount, deprecator: Spree::Deprecation
|
|
815
830
|
|
|
816
831
|
def associate_store
|
|
817
832
|
self.store ||= Spree::Store.default
|
|
@@ -842,7 +857,7 @@ module Spree
|
|
|
842
857
|
if adjustment_changed
|
|
843
858
|
restart_checkout_flow
|
|
844
859
|
recalculate
|
|
845
|
-
errors.add(:base,
|
|
860
|
+
errors.add(:base, I18n.t('spree.promotion_total_changed_before_complete'))
|
|
846
861
|
end
|
|
847
862
|
errors.empty?
|
|
848
863
|
end
|
|
@@ -854,7 +869,7 @@ module Spree
|
|
|
854
869
|
|
|
855
870
|
def ensure_line_items_present
|
|
856
871
|
unless line_items.present?
|
|
857
|
-
errors.add(:base,
|
|
872
|
+
errors.add(:base, I18n.t('spree.there_are_no_items_for_this_order')) && (return false)
|
|
858
873
|
end
|
|
859
874
|
end
|
|
860
875
|
|
|
@@ -863,13 +878,13 @@ module Spree
|
|
|
863
878
|
# After this point, order redirects back to 'address' state and asks user to pick a proper address
|
|
864
879
|
# Therefore, shipments are not necessary at this point.
|
|
865
880
|
shipments.destroy_all
|
|
866
|
-
errors.add(:base,
|
|
881
|
+
errors.add(:base, I18n.t('spree.items_cannot_be_shipped')) && (return false)
|
|
867
882
|
end
|
|
868
883
|
end
|
|
869
884
|
|
|
870
885
|
def after_cancel
|
|
871
886
|
shipments.each(&:cancel!)
|
|
872
|
-
payments.completed.each
|
|
887
|
+
payments.completed.each { |payment| payment.cancel! unless payment.fully_refunded? }
|
|
873
888
|
payments.store_credits.pending.each(&:void_transaction!)
|
|
874
889
|
|
|
875
890
|
send_cancel_email
|
|
@@ -15,8 +15,6 @@ module Spree
|
|
|
15
15
|
# @param [Hash] :options Options for the adding proccess
|
|
16
16
|
# Valid options:
|
|
17
17
|
# shipment: [Spree::Shipment] LineItem target shipment
|
|
18
|
-
# stock_location_quantities:
|
|
19
|
-
# stock_location_id: The stock location to source from
|
|
20
18
|
#
|
|
21
19
|
# @return [Spree::LineItem]
|
|
22
20
|
def add(variant, quantity = 1, options = {})
|
|
@@ -98,10 +96,6 @@ module Spree
|
|
|
98
96
|
line_item.quantity += quantity.to_i
|
|
99
97
|
line_item.options = ActionController::Parameters.new(options).permit(PermittedAttributes.line_item_attributes).to_h
|
|
100
98
|
|
|
101
|
-
if line_item.new_record?
|
|
102
|
-
create_order_stock_locations(line_item, options[:stock_location_quantities])
|
|
103
|
-
end
|
|
104
|
-
|
|
105
99
|
line_item.target_shipment = options[:shipment]
|
|
106
100
|
line_item.save!
|
|
107
101
|
line_item
|
|
@@ -130,13 +124,5 @@ module Spree
|
|
|
130
124
|
|
|
131
125
|
line_item
|
|
132
126
|
end
|
|
133
|
-
|
|
134
|
-
def create_order_stock_locations(line_item, stock_location_quantities)
|
|
135
|
-
return unless stock_location_quantities.present?
|
|
136
|
-
order = line_item.order
|
|
137
|
-
stock_location_quantities.each do |stock_location_id, quantity|
|
|
138
|
-
order.order_stock_locations.create!(stock_location_id: stock_location_id, quantity: quantity, variant_id: line_item.variant_id) unless quantity.to_i.zero?
|
|
139
|
-
end
|
|
140
|
-
end
|
|
141
127
|
end
|
|
142
128
|
end
|
|
@@ -72,7 +72,6 @@ class Spree::OrderShipping
|
|
|
72
72
|
end
|
|
73
73
|
|
|
74
74
|
send_shipment_emails(carton) if stock_location.fulfillable? && !suppress_mailer # e.g. digital gift cards that aren't actually shipped
|
|
75
|
-
fulfill_order_stock_locations(stock_location)
|
|
76
75
|
@order.recalculate
|
|
77
76
|
|
|
78
77
|
carton
|
|
@@ -80,10 +79,6 @@ class Spree::OrderShipping
|
|
|
80
79
|
|
|
81
80
|
private
|
|
82
81
|
|
|
83
|
-
def fulfill_order_stock_locations(stock_location)
|
|
84
|
-
Spree::OrderStockLocation.fulfill_for_order_with_stock_location(@order, stock_location)
|
|
85
|
-
end
|
|
86
|
-
|
|
87
82
|
def send_shipment_emails(carton)
|
|
88
83
|
carton.orders.each do |order|
|
|
89
84
|
Spree::Config.carton_shipped_email_class.shipped_email(order: order, carton: carton).deliver_later
|
data/app/models/spree/payment.rb
CHANGED
|
@@ -147,6 +147,11 @@ module Spree
|
|
|
147
147
|
credit_allowed > 0
|
|
148
148
|
end
|
|
149
149
|
|
|
150
|
+
# @return [Boolean] true when this payment has been fully refunded
|
|
151
|
+
def fully_refunded?
|
|
152
|
+
refunds.map(&:amount).sum == amount
|
|
153
|
+
end
|
|
154
|
+
|
|
150
155
|
# @return [Array<String>] the actions available on this payment
|
|
151
156
|
def actions
|
|
152
157
|
sa = source_actions
|
|
@@ -200,7 +205,7 @@ module Spree
|
|
|
200
205
|
if source && !source.valid?
|
|
201
206
|
source.errors.each do |field, error|
|
|
202
207
|
field_name = I18n.t("activerecord.attributes.#{source.class.to_s.underscore}.#{field}")
|
|
203
|
-
errors.add(
|
|
208
|
+
errors.add(I18n.t(source.class.to_s.demodulize.underscore, scope: 'spree'), "#{field_name} #{error}")
|
|
204
209
|
end
|
|
205
210
|
end
|
|
206
211
|
if errors.any?
|
|
@@ -143,11 +143,11 @@ module Spree
|
|
|
143
143
|
yield
|
|
144
144
|
else
|
|
145
145
|
invalidate!
|
|
146
|
-
raise Core::GatewayError.new(
|
|
146
|
+
raise Core::GatewayError.new(I18n.t('spree.payment_method_not_supported'))
|
|
147
147
|
end
|
|
148
148
|
end
|
|
149
149
|
else
|
|
150
|
-
raise Core::GatewayError.new(
|
|
150
|
+
raise Core::GatewayError.new(I18n.t('spree.payment_processing_failed'))
|
|
151
151
|
end
|
|
152
152
|
end
|
|
153
153
|
|
|
@@ -205,11 +205,11 @@ module Spree
|
|
|
205
205
|
if error.is_a? ActiveMerchant::Billing::Response
|
|
206
206
|
text = error.params['message'] || error.params['response_reason_text'] || error.message
|
|
207
207
|
elsif error.is_a? ActiveMerchant::ConnectionError
|
|
208
|
-
text =
|
|
208
|
+
text = I18n.t('spree.unable_to_connect_to_gateway')
|
|
209
209
|
else
|
|
210
210
|
text = error.to_s
|
|
211
211
|
end
|
|
212
|
-
logger.error(
|
|
212
|
+
logger.error(I18n.t('spree.gateway_error'))
|
|
213
213
|
logger.error(" #{error.to_yaml}")
|
|
214
214
|
raise Core::GatewayError.new(text)
|
|
215
215
|
end
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
require 'discard'
|
|
1
2
|
require 'spree/preferences/statically_configurable'
|
|
2
3
|
|
|
3
4
|
module Spree
|
|
@@ -16,6 +17,11 @@ module Spree
|
|
|
16
17
|
preference :test_mode, :boolean, default: true
|
|
17
18
|
|
|
18
19
|
acts_as_paranoid
|
|
20
|
+
include Spree::ParanoiaDeprecations
|
|
21
|
+
|
|
22
|
+
include Discard::Model
|
|
23
|
+
self.discard_column = :deleted_at
|
|
24
|
+
|
|
19
25
|
acts_as_list
|
|
20
26
|
DISPLAY = [:both, :front_end, :back_end]
|
|
21
27
|
|
|
@@ -58,7 +64,7 @@ module Spree
|
|
|
58
64
|
def providers
|
|
59
65
|
Spree::Deprecation.warn 'Spree::PaymentMethod.providers is deprecated and will be deleted in Solidus 3.0. ' \
|
|
60
66
|
'Please use Rails.application.config.spree.payment_methods instead'
|
|
61
|
-
|
|
67
|
+
Spree::Config.environment.payment_methods
|
|
62
68
|
end
|
|
63
69
|
|
|
64
70
|
def available(display_on = nil, store: nil)
|
|
@@ -184,7 +190,7 @@ module Spree
|
|
|
184
190
|
# If method_type has been overridden, call it and return the value, otherwise return nil
|
|
185
191
|
def deprecated_method_type_override
|
|
186
192
|
if method(:method_type).owner != Spree::PaymentMethod
|
|
187
|
-
Spree::Deprecation.warn "overriding PaymentMethod#method_type is deprecated and will be removed from Solidus 3.0 (override partial_name instead)", caller
|
|
193
|
+
Spree::Deprecation.warn "#{method(:method_type).owner} is overriding PaymentMethod#method_type. This is deprecated and will be removed from Solidus 3.0 (override partial_name instead).", caller[1..-1]
|
|
188
194
|
method_type
|
|
189
195
|
end
|
|
190
196
|
end
|
|
@@ -258,6 +264,5 @@ module Spree
|
|
|
258
264
|
raise ::NotImplementedError, "You must implement gateway_class method for #{self.class}."
|
|
259
265
|
end
|
|
260
266
|
end
|
|
261
|
-
deprecate provider_class: :gateway_class, deprecator: Spree::Deprecation
|
|
262
267
|
end
|
|
263
268
|
end
|
|
@@ -6,7 +6,7 @@ module Spree
|
|
|
6
6
|
|
|
7
7
|
def authorize(amount_in_cents, provided_store_credit, gateway_options = {})
|
|
8
8
|
if provided_store_credit.nil?
|
|
9
|
-
ActiveMerchant::Billing::Response.new(false,
|
|
9
|
+
ActiveMerchant::Billing::Response.new(false, I18n.t('spree.store_credit.unable_to_find'), {}, {})
|
|
10
10
|
else
|
|
11
11
|
action = ->(store_credit) {
|
|
12
12
|
store_credit.authorize(
|
|
@@ -40,7 +40,7 @@ module Spree
|
|
|
40
40
|
end
|
|
41
41
|
|
|
42
42
|
if event.blank?
|
|
43
|
-
ActiveMerchant::Billing::Response.new(false,
|
|
43
|
+
ActiveMerchant::Billing::Response.new(false, I18n.t('spree.store_credit.unable_to_find'), {}, {})
|
|
44
44
|
else
|
|
45
45
|
capture(amount_in_cents, event.authorization_code, gateway_options)
|
|
46
46
|
end
|
|
@@ -92,7 +92,7 @@ module Spree
|
|
|
92
92
|
if response = action.call(store_credit)
|
|
93
93
|
# note that we only need to return the auth code on an 'auth', but it's innocuous to always return
|
|
94
94
|
ActiveMerchant::Billing::Response.new(true,
|
|
95
|
-
|
|
95
|
+
I18n.t('spree.store_credit.successful_action', action: action_name),
|
|
96
96
|
{}, { authorization: auth_code || response })
|
|
97
97
|
else
|
|
98
98
|
ActiveMerchant::Billing::Response.new(false, store_credit.errors.full_messages.join, {}, {})
|
|
@@ -105,7 +105,7 @@ module Spree
|
|
|
105
105
|
store_credit = Spree::StoreCreditEvent.find_by(authorization_code: auth_code).try(:store_credit)
|
|
106
106
|
|
|
107
107
|
if store_credit.nil?
|
|
108
|
-
ActiveMerchant::Billing::Response.new(false,
|
|
108
|
+
ActiveMerchant::Billing::Response.new(false, I18n.t('spree.store_credit.unable_to_find_for_action', auth_code: auth_code, action: action_name), {}, {})
|
|
109
109
|
else
|
|
110
110
|
handle_action_call(store_credit, action, action_name, auth_code)
|
|
111
111
|
end
|
data/app/models/spree/price.rb
CHANGED
|
@@ -1,6 +1,12 @@
|
|
|
1
|
+
require 'discard'
|
|
2
|
+
|
|
1
3
|
module Spree
|
|
2
4
|
class Price < Spree::Base
|
|
3
5
|
acts_as_paranoid
|
|
6
|
+
include Spree::ParanoiaDeprecations
|
|
7
|
+
|
|
8
|
+
include Discard::Model
|
|
9
|
+
self.discard_column = :deleted_at
|
|
4
10
|
|
|
5
11
|
MAXIMUM_AMOUNT = BigDecimal('99_999_999.99')
|
|
6
12
|
|
|
@@ -18,7 +24,7 @@ module Spree
|
|
|
18
24
|
validates :currency, inclusion: { in: ::Money::Currency.all.map(&:iso_code), message: :invalid_code }
|
|
19
25
|
validates :country, presence: true, unless: -> { for_any_country? }
|
|
20
26
|
|
|
21
|
-
scope :currently_valid, -> { order("country_iso IS NULL, updated_at DESC, id DESC") }
|
|
27
|
+
scope :currently_valid, -> { order(Arel.sql("country_iso IS NULL, updated_at DESC, id DESC")) }
|
|
22
28
|
scope :for_master, -> { joins(:variant).where(spree_variants: { is_master: true }) }
|
|
23
29
|
scope :for_variant, -> { joins(:variant).where(spree_variants: { is_master: false }) }
|
|
24
30
|
scope :for_any_country, -> { where(country: nil) }
|
data/app/models/spree/product.rb
CHANGED
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
require 'discard'
|
|
2
|
+
|
|
1
3
|
module Spree
|
|
2
4
|
# Products represent an entity for sale in a store. Products can have
|
|
3
5
|
# variations, called variants. Product properties include description,
|
|
@@ -12,6 +14,18 @@ module Spree
|
|
|
12
14
|
friendly_id :slug_candidates, use: :history
|
|
13
15
|
|
|
14
16
|
acts_as_paranoid
|
|
17
|
+
include Spree::ParanoiaDeprecations
|
|
18
|
+
|
|
19
|
+
include Discard::Model
|
|
20
|
+
self.discard_column = :deleted_at
|
|
21
|
+
|
|
22
|
+
after_discard do
|
|
23
|
+
variants_including_master.discard_all
|
|
24
|
+
self.product_option_types = []
|
|
25
|
+
self.product_properties = []
|
|
26
|
+
self.classifications = []
|
|
27
|
+
self.product_promotion_rules = []
|
|
28
|
+
end
|
|
15
29
|
|
|
16
30
|
has_many :product_option_types, dependent: :destroy, inverse_of: :product
|
|
17
31
|
has_many :option_types, through: :product_option_types
|
|
@@ -60,23 +74,37 @@ module Spree
|
|
|
60
74
|
end
|
|
61
75
|
|
|
62
76
|
MASTER_ATTRIBUTES = [
|
|
63
|
-
:
|
|
64
|
-
:
|
|
77
|
+
:cost_currency,
|
|
78
|
+
:cost_price,
|
|
79
|
+
:depth,
|
|
80
|
+
:height,
|
|
81
|
+
:price,
|
|
82
|
+
:sku,
|
|
83
|
+
:weight,
|
|
84
|
+
:width,
|
|
65
85
|
]
|
|
66
86
|
MASTER_ATTRIBUTES.each do |attr|
|
|
67
87
|
delegate :"#{attr}", :"#{attr}=", to: :find_or_build_master
|
|
68
88
|
end
|
|
69
89
|
|
|
70
|
-
delegate :
|
|
90
|
+
delegate :amount_in,
|
|
91
|
+
:display_amount,
|
|
92
|
+
:display_price,
|
|
93
|
+
:has_default_price?,
|
|
94
|
+
:images,
|
|
95
|
+
:price_for,
|
|
96
|
+
:price_in,
|
|
97
|
+
:rebuild_vat_prices=,
|
|
98
|
+
to: :find_or_build_master
|
|
71
99
|
|
|
72
|
-
|
|
73
|
-
alias_method :images, :master_images
|
|
100
|
+
alias_method :master_images, :images
|
|
74
101
|
|
|
75
102
|
has_many :variant_images, -> { order(:position) }, source: :images, through: :variants_including_master
|
|
76
103
|
|
|
77
104
|
after_create :build_variants_from_option_values_hash, if: :option_values_hash
|
|
78
105
|
|
|
79
106
|
after_destroy :punch_slug
|
|
107
|
+
after_discard :punch_slug
|
|
80
108
|
|
|
81
109
|
after_initialize :ensure_master
|
|
82
110
|
|
|
@@ -340,7 +368,7 @@ module Spree
|
|
|
340
368
|
run_callbacks(:touch)
|
|
341
369
|
end
|
|
342
370
|
|
|
343
|
-
# Iterate through this
|
|
371
|
+
# Iterate through this product's taxons and taxonomies and touch their timestamps in a batch
|
|
344
372
|
def touch_taxons
|
|
345
373
|
taxons_to_touch = taxons.map(&:self_and_ancestors).flatten.uniq
|
|
346
374
|
unless taxons_to_touch.empty?
|