solidus_core 3.0.0 → 4.5.1
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/README.md +1 -2
- data/Rakefile +7 -2
- data/app/assets/images/logo/solidus.svg +18 -1
- data/app/assets/images/logo/solidus_logo.png +0 -0
- data/app/controllers/spree/base_controller.rb +1 -3
- data/app/helpers/spree/base_helper.rb +3 -3
- data/app/helpers/spree/core/controller_helpers/auth.rb +66 -0
- data/app/helpers/spree/core/controller_helpers/common.rb +82 -0
- data/app/helpers/spree/core/controller_helpers/order.rb +86 -0
- data/app/helpers/spree/core/controller_helpers/payment_parameters.rb +165 -0
- data/{lib/spree/core/controller_helpers/current_host.rb → app/helpers/spree/core/controller_helpers/pricing.rb} +6 -4
- data/app/helpers/spree/core/controller_helpers/search.rb +16 -0
- data/app/helpers/spree/core/controller_helpers/store.rb +19 -0
- data/app/helpers/spree/core/controller_helpers/strong_parameters.rb +74 -0
- data/app/helpers/spree/products_helper.rb +2 -2
- data/app/mailers/spree/base_mailer.rb +1 -1
- data/app/mailers/spree/carton_mailer.rb +1 -1
- data/app/mailers/spree/order_mailer.rb +3 -3
- data/app/mailers/spree/reimbursement_mailer.rb +1 -1
- data/app/models/concerns/spree/active_storage_adapter/attachment.rb +30 -11
- data/app/models/concerns/spree/active_storage_adapter/normalization.rb +1 -1
- data/app/models/concerns/spree/active_storage_adapter.rb +1 -18
- data/app/models/concerns/spree/default_price.rb +30 -10
- data/app/models/concerns/spree/display_money.rb +1 -1
- data/app/models/concerns/spree/metadata.rb +64 -0
- data/app/models/concerns/spree/named_type.rb +2 -0
- data/app/models/concerns/spree/ordered_property_value_list.rb +2 -2
- data/app/models/concerns/spree/ransackable_attributes.rb +9 -5
- data/app/models/concerns/spree/user_address_book.rb +19 -10
- data/app/models/concerns/spree/user_methods.rb +40 -6
- data/app/models/spree/address.rb +11 -9
- data/app/models/spree/adjustment.rb +15 -76
- data/app/models/spree/adjustment_reason.rb +2 -0
- data/app/models/spree/calculator/flat_fee.rb +21 -0
- data/app/models/spree/calculator/returns/default_refund_amount.rb +1 -1
- data/app/models/spree/carton.rb +3 -3
- data/app/models/spree/core/state_machines/inventory_unit.rb +42 -0
- data/app/models/spree/core/state_machines/order/class_methods.rb +217 -0
- data/app/models/spree/core/state_machines/order.rb +42 -0
- data/app/models/spree/core/state_machines/payment.rb +61 -0
- data/app/models/spree/core/state_machines/reimbursement.rb +33 -0
- data/app/models/spree/core/state_machines/return_authorization.rb +32 -0
- data/app/models/spree/core/state_machines/return_item/acceptance_status.rb +51 -0
- data/app/models/spree/core/state_machines/return_item/reception_status.rb +42 -0
- data/app/models/spree/core/state_machines/shipment.rb +58 -0
- data/app/models/spree/country.rb +1 -1
- data/app/models/spree/credit_card.rb +13 -10
- data/app/models/spree/customer_return.rb +6 -3
- data/app/models/spree/deprecated_configurable_class.rb +40 -0
- data/app/models/spree/fulfilment_changer.rb +56 -29
- data/app/models/spree/image/active_storage_attachment.rb +2 -7
- data/app/models/spree/image/paperclip_attachment.rb +2 -2
- data/app/models/spree/inventory_unit.rb +2 -2
- data/app/models/spree/item_total.rb +28 -0
- data/app/models/spree/legacy_user.rb +1 -0
- data/app/models/spree/line_item.rb +26 -8
- data/app/models/spree/log_entry.rb +98 -1
- data/app/models/spree/money.rb +120 -0
- data/app/models/spree/null_promotion_adjuster.rb +13 -0
- data/app/models/spree/null_promotion_advertiser.rb +9 -0
- data/app/models/spree/null_promotion_finder.rb +9 -0
- data/app/models/spree/null_promotion_handler.rb +44 -0
- data/app/models/spree/option_type.rb +1 -1
- data/app/models/spree/option_value.rb +4 -3
- data/app/models/spree/order/number_generator.rb +7 -1
- data/app/models/spree/order.rb +143 -96
- data/app/models/spree/order_cancellations.rb +8 -8
- data/app/models/spree/order_inventory.rb +7 -5
- data/app/models/spree/order_merger.rb +5 -7
- data/app/models/spree/order_mutex.rb +2 -2
- data/app/models/spree/order_shipping.rb +15 -19
- data/app/models/spree/order_taxation.rb +7 -4
- data/app/models/spree/order_update_attributes.rb +3 -1
- data/app/models/spree/order_updater.rb +25 -63
- data/app/models/spree/payment/processing.rb +60 -57
- data/app/models/spree/payment.rb +14 -27
- data/app/models/spree/payment_create.rb +1 -1
- data/app/models/spree/payment_method/bogus_credit_card.rb +18 -14
- data/app/models/spree/payment_method/credit_card.rb +0 -4
- data/app/models/spree/payment_method/simple_bogus_credit_card.rb +18 -4
- data/app/models/spree/payment_method/store_credit.rb +1 -1
- data/app/models/spree/payment_method.rb +29 -10
- data/app/models/spree/payment_source.rb +5 -1
- data/app/models/spree/permission_set.rb +11 -0
- data/app/models/spree/permission_sets/base.rb +45 -0
- data/app/models/spree/permission_sets/configuration_display.rb +53 -0
- data/app/models/spree/permission_sets/configuration_management.rb +52 -0
- data/app/models/spree/permission_sets/dashboard_display.rb +28 -0
- data/app/models/spree/permission_sets/default_customer.rb +83 -0
- data/app/models/spree/permission_sets/order_display.rb +50 -0
- data/app/models/spree/permission_sets/order_management.rb +50 -0
- data/app/models/spree/permission_sets/product_display.rb +43 -0
- data/app/models/spree/permission_sets/product_management.rb +47 -0
- data/app/models/spree/permission_sets/restricted_stock_display.rb +33 -0
- data/app/models/spree/permission_sets/restricted_stock_management.rb +33 -0
- data/app/models/spree/permission_sets/stock_display.rb +26 -0
- data/app/models/spree/permission_sets/stock_management.rb +26 -0
- data/app/models/spree/permission_sets/super_user.rb +26 -0
- data/app/models/spree/permission_sets/user_display.rb +27 -0
- data/app/models/spree/permission_sets/user_management.rb +44 -0
- data/app/models/spree/preference.rb +1 -1
- data/app/models/spree/price.rb +3 -3
- data/app/models/spree/product/scopes.rb +23 -10
- data/app/models/spree/product.rb +30 -23
- data/app/models/spree/product_property.rb +1 -1
- data/app/models/spree/property.rb +1 -1
- data/app/models/spree/refund.rb +13 -3
- data/app/models/spree/refund_reason.rb +6 -1
- data/app/models/spree/reimbursement.rb +6 -6
- data/app/models/spree/reimbursement_performer.rb +3 -3
- data/app/models/spree/reimbursement_tax_calculator.rb +3 -3
- data/app/models/spree/reimbursement_type/credit.rb +1 -1
- data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +6 -6
- data/app/models/spree/reimbursement_type/store_credit.rb +1 -1
- data/app/models/spree/reimbursement_type.rb +6 -1
- data/app/models/spree/return_authorization.rb +3 -1
- data/app/models/spree/return_item.rb +13 -15
- data/app/models/spree/return_reason.rb +6 -1
- data/app/models/spree/role.rb +3 -1
- data/app/models/spree/role_permission.rb +8 -0
- data/app/models/spree/shipment.rb +12 -10
- data/app/models/spree/shipping_category.rb +2 -0
- data/app/models/spree/shipping_rate.rb +2 -3
- data/app/models/spree/shipping_rate_tax.rb +1 -1
- data/app/models/spree/{order_contents.rb → simple_order_contents.rb} +10 -13
- data/app/models/spree/state.rb +1 -1
- data/app/models/spree/stock/allocator/on_hand_first.rb +2 -2
- data/app/models/spree/stock/availability.rb +11 -3
- data/app/models/spree/stock/estimator.rb +1 -1
- data/app/models/spree/stock/inventory_unit_builder.rb +1 -1
- data/app/models/spree/stock/package.rb +2 -2
- data/app/models/spree/stock/quantifier.rb +12 -8
- data/app/models/spree/stock/simple_coordinator.rb +38 -28
- data/app/models/spree/stock/splitter/shipping_category.rb +1 -1
- data/app/models/spree/stock_item.rb +2 -1
- data/app/models/spree/stock_location.rb +7 -7
- data/app/models/spree/stock_movement.rb +2 -2
- data/app/models/spree/store.rb +3 -1
- data/app/models/spree/store_credit.rb +31 -16
- data/app/models/spree/store_credit_event.rb +4 -3
- data/app/models/spree/store_credit_prioritizer.rb +17 -0
- data/app/models/spree/store_credit_reason.rb +6 -1
- data/app/models/spree/store_selector/by_server_name.rb +1 -1
- data/app/models/spree/tax/item_tax.rb +3 -2
- data/app/models/spree/tax/order_tax.rb +3 -1
- data/app/models/spree/tax/tax_helpers.rb +14 -3
- data/app/models/spree/tax/tax_location.rb +4 -7
- data/app/models/spree/tax_calculator/default.rb +32 -1
- data/app/models/spree/tax_calculator/shipping_rate.rb +2 -2
- data/app/models/spree/tax_category.rb +3 -1
- data/app/models/spree/tax_rate.rb +14 -1
- data/app/models/spree/taxon/active_storage_attachment.rb +2 -2
- data/app/models/spree/taxon/paperclip_attachment.rb +4 -4
- data/app/models/spree/taxon.rb +25 -3
- data/app/models/spree/taxon_brand_selector.rb +22 -0
- data/app/models/spree/taxonomy.rb +4 -3
- data/app/models/spree/unauthorized_redirect_handler.rb +24 -0
- data/app/models/spree/unit_cancel.rb +1 -2
- data/app/models/spree/user_address.rb +9 -3
- data/app/models/spree/user_last_url_storer/rules/authentication_rule.rb +1 -1
- data/app/models/spree/variant/price_selector.rb +25 -8
- data/app/models/spree/variant/scopes.rb +4 -0
- data/app/models/spree/variant/vat_price_generator.rb +1 -1
- data/app/models/spree/variant.rb +64 -37
- data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +4 -4
- data/app/models/spree/wallet.rb +2 -2
- data/app/models/spree/zone.rb +1 -1
- data/app/subscribers/spree/order_mailer_subscriber.rb +35 -0
- data/app/views/layouts/spree/base_mailer.html.erb +2 -2
- data/app/views/spree/order_mailer/cancel_email.html.erb +1 -1
- data/app/views/spree/order_mailer/cancel_email.text.erb +1 -1
- data/app/views/spree/order_mailer/confirm_email.html.erb +5 -5
- data/app/views/spree/order_mailer/confirm_email.text.erb +5 -5
- data/app/views/spree/order_mailer/inventory_cancellation_email.html.erb +0 -1
- data/config/i18n-tasks.yml +134 -0
- data/config/locales/en.yml +439 -338
- data/db/default/spree/permission_sets.rb +10 -0
- data/db/default/spree/return_reasons.rb +3 -1
- data/db/default/spree/states.rb +2 -2
- data/db/migrate/20160101010000_solidus_one_four.rb +0 -127
- data/db/migrate/20180710170104_create_spree_store_credit_reasons_table.rb +2 -2
- data/db/migrate/20201127212108_add_type_before_removal_to_spree_payment_methods.rb +7 -0
- data/db/migrate/20210312061050_change_column_null_on_prices.rb +7 -0
- data/db/migrate/20210815004823_add_unique_index_to_option_values_variants.rb +16 -0
- data/db/migrate/20220419170826_remove_archived_user_addresses.rb +12 -0
- data/db/migrate/20220805202442_add_level_to_spree_tax_rates.rb +5 -0
- data/db/migrate/20221123152807_add_shipping_category_to_spree_variants.rb +5 -0
- data/db/migrate/20230321161854_change_column_null_option_values_option_type_id.rb +5 -0
- data/db/migrate/20230425103509_remove_taxon_position.rb +5 -0
- data/db/migrate/20230427095534_drop_deprecated_address_id_from_shipments.rb +11 -0
- data/db/migrate/20240821173254_create_spree_permission_sets_in_core.rb +9 -0
- data/db/migrate/20240821173341_create_spree_roles_permissions_in_core.rb +9 -0
- data/db/migrate/20240821173641_add_description_to_spree_roles.rb +5 -0
- data/db/migrate/20240904152041_add_privilege_and_category_to_spree_permission_sets.rb +6 -0
- data/db/migrate/20250129061658_add_metadata_to_spree_resources.rb +28 -0
- data/db/migrate/20250201172950_add_gtin_and_condition_to_spree_variant.rb +6 -0
- data/db/migrate/20250207104016_add_primary_taxon_to_products.rb +7 -0
- data/db/migrate/20250221152004_add_metadata_to_users.rb +13 -0
- data/db/seeds.rb +5 -1
- data/lib/generators/solidus/install/app_templates/authentication/custom.rb +16 -0
- data/lib/generators/solidus/install/app_templates/authentication/devise.rb +16 -0
- data/lib/generators/solidus/install/app_templates/authentication/existing.rb +10 -0
- data/lib/generators/solidus/install/app_templates/authentication/none.rb +1 -0
- data/lib/generators/solidus/install/app_templates/frontend/none.rb +1 -0
- data/lib/generators/solidus/install/app_templates/frontend/starter.rb +1 -0
- data/lib/generators/solidus/install/app_templates/payment_method/braintree.rb +5 -0
- data/lib/generators/solidus/install/app_templates/payment_method/none.rb +1 -0
- data/lib/generators/solidus/install/app_templates/payment_method/paypal.rb +5 -0
- data/lib/generators/solidus/install/app_templates/payment_method/stripe.rb +5 -0
- data/lib/generators/solidus/install/install_generator.rb +210 -156
- data/lib/generators/solidus/install/templates/config/initializers/spree.rb.tt +27 -33
- data/lib/generators/solidus/install/templates/vendor/assets/javascripts/spree/backend/all.js +2 -2
- data/lib/generators/solidus/update/templates/config/initializers/new_solidus_defaults.rb.tt +30 -0
- data/lib/generators/solidus/update/update_generator.rb +124 -0
- data/lib/generators/spree/custom_user/custom_user_generator.rb +6 -4
- data/lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt +2 -6
- data/lib/generators/spree/custom_user/templates/migration.rb.tt +7 -3
- data/lib/generators/spree/dummy/dummy_generator.rb +12 -9
- data/lib/generators/spree/dummy/templates/rails/application.rb.tt +1 -2
- data/lib/generators/spree/dummy/templates/rails/database.yml +48 -63
- data/lib/generators/spree/dummy/templates/rails/manifest.js +3 -0
- data/lib/generators/spree/dummy/templates/rails/test.rb +7 -2
- data/lib/spree/app_configuration.rb +220 -71
- data/lib/spree/bus.rb +11 -0
- data/lib/spree/core/class_constantizer.rb +2 -2
- data/lib/spree/core/controller_helpers/auth.rb +5 -69
- data/lib/spree/core/controller_helpers/common.rb +5 -80
- data/lib/spree/core/controller_helpers/order.rb +5 -86
- data/lib/spree/core/controller_helpers/payment_parameters.rb +5 -165
- data/lib/spree/core/controller_helpers/pricing.rb +5 -17
- data/lib/spree/core/controller_helpers/search.rb +5 -14
- data/lib/spree/core/controller_helpers/store.rb +5 -17
- data/lib/spree/core/controller_helpers/strong_parameters.rb +5 -71
- data/lib/spree/core/engine.rb +49 -16
- data/lib/spree/core/environment/calculators.rb +35 -3
- data/lib/spree/core/environment/promotions.rb +25 -4
- data/lib/spree/core/environment_extension.rb +16 -2
- data/lib/spree/core/importer/order.rb +6 -6
- data/lib/spree/core/importer/product.rb +3 -3
- data/lib/spree/core/nested_class_set.rb +28 -0
- data/lib/spree/core/null_promotion_configuration.rb +84 -0
- data/lib/spree/core/product_duplicator.rb +1 -1
- data/lib/spree/core/product_filters.rb +2 -2
- data/lib/spree/core/search/base.rb +18 -9
- data/lib/spree/core/search/variant.rb +2 -2
- data/lib/spree/core/state_machines/inventory_unit.rb +5 -40
- data/lib/spree/core/state_machines/order.rb +5 -247
- data/lib/spree/core/state_machines/payment.rb +5 -59
- data/lib/spree/core/state_machines/reimbursement.rb +5 -31
- data/lib/spree/core/state_machines/return_authorization.rb +5 -30
- data/lib/spree/core/state_machines/return_item/acceptance_status.rb +5 -49
- data/lib/spree/core/state_machines/return_item/reception_status.rb +5 -40
- data/lib/spree/core/state_machines/shipment.rb +5 -56
- data/lib/spree/core/state_machines.rb +48 -81
- data/lib/spree/core/stock_configuration.rb +18 -0
- data/lib/spree/core/validators/email.rb +2 -4
- data/lib/spree/core/version.rb +5 -1
- data/lib/spree/core/versioned_value.rb +75 -0
- data/lib/spree/core.rb +40 -16
- data/lib/spree/deprecated_instance_variable_proxy.rb +57 -0
- data/lib/spree/deprecation.rb +3 -51
- data/lib/spree/deprecator.rb +9 -0
- data/lib/spree/i18n.rb +1 -1
- data/lib/spree/mailer_previews/carton_preview.rb +1 -1
- data/lib/spree/migration_helpers.rb +3 -3
- data/lib/spree/migrations.rb +13 -11
- data/lib/spree/money.rb +5 -118
- data/lib/spree/permission_sets/base.rb +5 -30
- data/lib/spree/permission_sets/configuration_display.rb +5 -23
- data/lib/spree/permission_sets/configuration_management.rb +5 -23
- data/lib/spree/permission_sets/dashboard_display.rb +5 -9
- data/lib/spree/permission_sets/default_customer.rb +5 -35
- data/lib/spree/permission_sets/order_display.rb +5 -19
- data/lib/spree/permission_sets/order_management.rb +5 -20
- data/lib/spree/permission_sets/product_display.rb +5 -17
- data/lib/spree/permission_sets/product_management.rb +5 -19
- data/lib/spree/permission_sets/restricted_stock_display.rb +5 -16
- data/lib/spree/permission_sets/restricted_stock_management.rb +5 -16
- data/lib/spree/permission_sets/stock_display.rb +5 -10
- data/lib/spree/permission_sets/stock_management.rb +5 -10
- data/lib/spree/permission_sets/super_user.rb +5 -9
- data/lib/spree/permission_sets/user_display.rb +5 -11
- data/lib/spree/permission_sets/user_management.rb +5 -23
- data/lib/spree/permission_sets.rb +5 -18
- data/lib/spree/permitted_attributes.rb +35 -14
- data/lib/spree/preferences/configuration.rb +88 -0
- data/lib/spree/preferences/persistable.rb +7 -1
- data/lib/spree/preferences/preferable.rb +13 -0
- data/lib/spree/preferences/preferable_class_methods.rb +12 -4
- data/lib/spree/preferences/preference_differentiator.rb +29 -0
- data/lib/spree/preferences/static_model_preferences.rb +25 -10
- data/lib/spree/preferences/store.rb +2 -2
- data/lib/spree/testing_support/blacklist_urls.rb +1 -1
- data/lib/spree/testing_support/bus_helpers.rb +101 -0
- data/lib/spree/testing_support/capybara_ext.rb +11 -1
- data/lib/spree/testing_support/common_rake.rb +76 -23
- data/lib/spree/testing_support/dummy_ability.rb +7 -0
- data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/backend/all.js +1 -1
- data/lib/spree/testing_support/dummy_app/assets/stylesheets/solidus_admin/tailwind.css +1 -0
- data/lib/spree/testing_support/dummy_app/database.yml +39 -28
- data/lib/spree/testing_support/dummy_app/migrations.rb +8 -15
- data/lib/spree/testing_support/dummy_app/rake_tasks.rb +3 -10
- data/lib/spree/testing_support/dummy_app.rb +71 -42
- data/lib/spree/testing_support/extension_rake.rb +2 -2
- data/lib/spree/testing_support/factories/address_factory.rb +9 -13
- data/lib/spree/testing_support/factories/adjustment_factory.rb +1 -13
- data/lib/spree/testing_support/factories/adjustment_reason_factory.rb +0 -5
- data/lib/spree/testing_support/factories/calculator_factory.rb +4 -10
- data/lib/spree/testing_support/factories/carton_factory.rb +2 -10
- data/lib/spree/testing_support/factories/country_factory.rb +1 -7
- data/lib/spree/testing_support/factories/credit_card_factory.rb +0 -5
- data/lib/spree/testing_support/factories/customer_return_factory.rb +2 -11
- data/lib/spree/testing_support/factories/image_factory.rb +0 -5
- data/lib/spree/testing_support/factories/inventory_unit_factory.rb +4 -14
- data/lib/spree/testing_support/factories/line_item_factory.rb +0 -8
- data/lib/spree/testing_support/factories/option_type_factory.rb +0 -8
- data/lib/spree/testing_support/factories/option_value_factory.rb +0 -5
- data/lib/spree/testing_support/factories/order_factory.rb +19 -38
- data/lib/spree/testing_support/factories/payment_factory.rb +0 -10
- data/lib/spree/testing_support/factories/payment_method_factory.rb +0 -5
- data/lib/spree/testing_support/factories/price_factory.rb +0 -7
- data/lib/spree/testing_support/factories/product_factory.rb +5 -13
- data/lib/spree/testing_support/factories/product_option_type_factory.rb +0 -8
- data/lib/spree/testing_support/factories/product_property_factory.rb +0 -8
- data/lib/spree/testing_support/factories/property_factory.rb +0 -5
- data/lib/spree/testing_support/factories/refund_factory.rb +0 -8
- data/lib/spree/testing_support/factories/refund_reason_factory.rb +0 -5
- data/lib/spree/testing_support/factories/reimbursement_factory.rb +0 -7
- data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +0 -5
- data/lib/spree/testing_support/factories/return_authorization_factory.rb +0 -9
- data/lib/spree/testing_support/factories/return_item_factory.rb +0 -9
- data/lib/spree/testing_support/factories/return_reason_factory.rb +0 -5
- data/lib/spree/testing_support/factories/role_factory.rb +0 -5
- data/lib/spree/testing_support/factories/shipment_factory.rb +1 -11
- data/lib/spree/testing_support/factories/shipping_category_factory.rb +0 -5
- data/lib/spree/testing_support/factories/shipping_method_factory.rb +0 -9
- data/lib/spree/testing_support/factories/shipping_rate_factory.rb +0 -8
- data/lib/spree/testing_support/factories/state_factory.rb +8 -10
- data/lib/spree/testing_support/factories/stock_item_factory.rb +5 -9
- data/lib/spree/testing_support/factories/stock_location_factory.rb +0 -9
- data/lib/spree/testing_support/factories/stock_movement_factory.rb +0 -7
- data/lib/spree/testing_support/factories/stock_package_factory.rb +1 -9
- data/lib/spree/testing_support/factories/store_credit_category_factory.rb +0 -5
- data/lib/spree/testing_support/factories/store_credit_event_factory.rb +0 -8
- data/lib/spree/testing_support/factories/store_credit_factory.rb +4 -13
- data/lib/spree/testing_support/factories/store_credit_reason_factory.rb +0 -5
- data/lib/spree/testing_support/factories/store_credit_type_factory.rb +0 -5
- data/lib/spree/testing_support/factories/store_factory.rb +0 -5
- data/lib/spree/testing_support/factories/tax_category_factory.rb +0 -8
- data/lib/spree/testing_support/factories/tax_rate_factory.rb +0 -9
- data/lib/spree/testing_support/factories/taxon_factory.rb +5 -10
- data/lib/spree/testing_support/factories/taxonomy_factory.rb +3 -6
- data/lib/spree/testing_support/factories/user_factory.rb +6 -9
- data/lib/spree/testing_support/factories/variant_factory.rb +0 -10
- data/lib/spree/testing_support/factories/variant_property_rule_condition_factory.rb +0 -8
- data/lib/spree/testing_support/factories/variant_property_rule_factory.rb +0 -9
- data/lib/spree/testing_support/factories/variant_property_rule_value_factory.rb +0 -8
- data/lib/spree/testing_support/factories/zone_factory.rb +1 -9
- data/lib/spree/testing_support/factory_bot.rb +6 -29
- data/lib/spree/testing_support/flaky.rb +22 -0
- data/lib/spree/testing_support/order_walkthrough.rb +7 -6
- data/lib/spree/testing_support/sequences.rb +0 -5
- data/lib/spree/testing_support/shared_examples/calculator.rb +10 -0
- data/lib/spree/testing_support/shared_examples/order_factory.rb +141 -0
- data/lib/spree/testing_support/shared_examples/working_factory.rb +15 -0
- data/lib/spree/testing_support/silence_deprecations.rb +9 -0
- data/lib/spree/user_class_handle.rb +2 -2
- data/lib/tasks/colorado_delivery_fee.rake +28 -0
- data/lib/tasks/payment_method.rake +29 -0
- data/lib/tasks/solidus/delete_prices_with_nil_amount.rake +8 -0
- data/solidus_core.gemspec +18 -8
- metadata +233 -117
- data/app/jobs/spree/promotion_code_batch_job.rb +0 -26
- data/app/mailers/spree/promotion_code_batch_mailer.rb +0 -15
- data/app/models/spree/calculator/distributed_amount.rb +0 -33
- data/app/models/spree/calculator/flat_percent_item_total.rb +0 -23
- data/app/models/spree/calculator/flexi_rate.rb +0 -22
- data/app/models/spree/calculator/percent_on_line_item.rb +0 -13
- data/app/models/spree/calculator/tiered_flat_rate.rb +0 -52
- data/app/models/spree/calculator/tiered_percent.rb +0 -62
- data/app/models/spree/line_item_action.rb +0 -8
- data/app/models/spree/order_promotion.rb +0 -27
- data/app/models/spree/promotion/actions/create_adjustment.rb +0 -77
- data/app/models/spree/promotion/actions/create_item_adjustments.rb +0 -99
- data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +0 -139
- data/app/models/spree/promotion/actions/free_shipping.rb +0 -58
- data/app/models/spree/promotion/rules/first_order.rb +0 -38
- data/app/models/spree/promotion/rules/first_repeat_purchase_since.rb +0 -36
- data/app/models/spree/promotion/rules/item_total.rb +0 -53
- data/app/models/spree/promotion/rules/nth_order.rb +0 -45
- data/app/models/spree/promotion/rules/one_use_per_user.rb +0 -25
- data/app/models/spree/promotion/rules/option_value.rb +0 -50
- data/app/models/spree/promotion/rules/product.rb +0 -74
- data/app/models/spree/promotion/rules/store.rb +0 -22
- data/app/models/spree/promotion/rules/taxon.rb +0 -87
- data/app/models/spree/promotion/rules/user.rb +0 -30
- data/app/models/spree/promotion/rules/user_logged_in.rb +0 -20
- data/app/models/spree/promotion/rules/user_role.rb +0 -45
- data/app/models/spree/promotion.rb +0 -284
- data/app/models/spree/promotion_action.rb +0 -43
- data/app/models/spree/promotion_category.rb +0 -8
- data/app/models/spree/promotion_chooser.rb +0 -34
- data/app/models/spree/promotion_code/batch_builder.rb +0 -64
- data/app/models/spree/promotion_code.rb +0 -50
- data/app/models/spree/promotion_code_batch.rb +0 -27
- data/app/models/spree/promotion_handler/cart.rb +0 -55
- data/app/models/spree/promotion_handler/coupon.rb +0 -123
- data/app/models/spree/promotion_handler/page.rb +0 -26
- data/app/models/spree/promotion_handler/shipping.rb +0 -61
- data/app/models/spree/promotion_rule.rb +0 -55
- data/app/models/spree/promotion_rule_role.rb +0 -8
- data/app/models/spree/promotion_rule_store.rb +0 -10
- data/app/models/spree/promotion_rule_taxon.rb +0 -8
- data/app/models/spree/promotion_rule_user.rb +0 -10
- data/app/models/spree/tax/shipping_rate_taxer.rb +0 -24
- data/app/subscribers/spree/mailer_subscriber.rb +0 -25
- data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_errored.text.erb +0 -2
- data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_finished.text.erb +0 -2
- data/db/migrate/20161017102621_create_spree_promotion_code_batch.rb +0 -38
- data/db/migrate/20180202190713_create_promotion_rule_stores.rb +0 -12
- data/db/migrate/20180328172631_add_join_characters_to_promotion_code_batch.rb +0 -11
- data/db/migrate/20190106184413_remove_code_from_spree_promotions.rb +0 -42
- data/lib/generators/solidus/install/templates/vendor/assets/javascripts/spree/frontend/all.js +0 -10
- data/lib/generators/solidus/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +0 -9
- data/lib/generators/spree/dummy/templates/rails/script/rails +0 -6
- data/lib/solidus/migrations/promotions_with_code_handlers.rb +0 -66
- data/lib/spree/event/adapters/active_support_notifications.rb +0 -67
- data/lib/spree/event/configuration.rb +0 -25
- data/lib/spree/event/subscriber.rb +0 -86
- data/lib/spree/event/subscriber_registry.rb +0 -94
- data/lib/spree/event.rb +0 -119
- data/lib/spree/permission_sets/promotion_display.rb +0 -15
- data/lib/spree/permission_sets/promotion_management.rb +0 -15
- data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/frontend/all.js +0 -10
- data/lib/spree/testing_support/dummy_app/assets/stylesheets/spree/frontend/all.css +0 -9
- data/lib/spree/testing_support/dummy_app/views/layouts/application.html.erb +0 -1
- data/lib/spree/testing_support/factories/order_promotion_factory.rb +0 -16
- data/lib/spree/testing_support/factories/promotion_category_factory.rb +0 -12
- data/lib/spree/testing_support/factories/promotion_code_factory.rb +0 -16
- data/lib/spree/testing_support/factories/promotion_factory.rb +0 -92
- data/lib/spree/testing_support/factories.rb +0 -11
- data/lib/spree/testing_support.rb +0 -31
- data/lib/tasks/upgrade.rake +0 -15
@@ -30,7 +30,7 @@ module Spree
|
|
30
30
|
self.refund_amount_calculator = Calculator::Returns::DefaultRefundAmount
|
31
31
|
|
32
32
|
belongs_to :return_authorization, inverse_of: :return_items, optional: true
|
33
|
-
belongs_to :inventory_unit, inverse_of: :return_items
|
33
|
+
belongs_to :inventory_unit, inverse_of: :return_items
|
34
34
|
belongs_to :exchange_variant, class_name: 'Spree::Variant', optional: true
|
35
35
|
belongs_to :exchange_inventory_unit, class_name: 'Spree::InventoryUnit', inverse_of: :original_return_item, optional: true
|
36
36
|
belongs_to :customer_return, inverse_of: :return_items, optional: true
|
@@ -42,7 +42,6 @@ module Spree
|
|
42
42
|
validate :eligible_exchange_variant
|
43
43
|
validate :belongs_to_same_customer_order
|
44
44
|
validate :validate_acceptance_status_for_reimbursement
|
45
|
-
validates :inventory_unit, presence: true
|
46
45
|
validate :validate_no_other_completed_return_items
|
47
46
|
|
48
47
|
after_create :cancel_others, unless: :cancelled?
|
@@ -54,7 +53,7 @@ module Spree
|
|
54
53
|
scope :not_expired, -> { where.not(reception_status: 'expired') }
|
55
54
|
scope :received, -> { where(reception_status: 'received') }
|
56
55
|
INTERMEDIATE_RECEPTION_STATUSES.each do |reception_status|
|
57
|
-
scope reception_status, -> { where(reception_status:
|
56
|
+
scope reception_status, -> { where(reception_status:) }
|
58
57
|
end
|
59
58
|
scope :pending, -> { where(acceptance_status: 'pending') }
|
60
59
|
scope :accepted, -> { where(acceptance_status: 'accepted') }
|
@@ -68,7 +67,7 @@ module Spree
|
|
68
67
|
scope :exchange_processed, -> { where.not(exchange_inventory_unit: nil) }
|
69
68
|
scope :exchange_required, -> { exchange_requested.where(exchange_inventory_unit: nil) }
|
70
69
|
|
71
|
-
serialize :acceptance_status_errors
|
70
|
+
serialize :acceptance_status_errors, coder: YAML
|
72
71
|
|
73
72
|
delegate :eligible_for_return?, :requires_manual_intervention?, to: :validator
|
74
73
|
delegate :variant, to: :inventory_unit
|
@@ -94,8 +93,8 @@ module Spree
|
|
94
93
|
# @return [Spree::ReturnItem] a valid return item for the given inventory
|
95
94
|
# unit if one exists, or a new one if one does not
|
96
95
|
def self.from_inventory_unit(inventory_unit)
|
97
|
-
valid.find_by(inventory_unit:
|
98
|
-
new(inventory_unit:
|
96
|
+
valid.find_by(inventory_unit:) ||
|
97
|
+
new(inventory_unit:).tap(&:set_default_amount)
|
99
98
|
end
|
100
99
|
|
101
100
|
# @return [Boolean] true when an exchange has been requested on this return
|
@@ -131,7 +130,7 @@ module Spree
|
|
131
130
|
# @return [ActiveRecord::Relation<Spree::Variant>] the variants eligible
|
132
131
|
# for exchange for this return item
|
133
132
|
def eligible_exchange_variants(stock_locations = nil)
|
134
|
-
exchange_variant_engine.eligible_variants(variant, stock_locations:
|
133
|
+
exchange_variant_engine.eligible_variants(variant, stock_locations:)
|
135
134
|
end
|
136
135
|
|
137
136
|
# Builds the exchange inventory unit for this return item, only if an
|
@@ -249,21 +248,20 @@ module Spree
|
|
249
248
|
|
250
249
|
def validate_no_other_completed_return_items
|
251
250
|
other_return_item = Spree::ReturnItem.where({
|
252
|
-
inventory_unit_id
|
251
|
+
inventory_unit_id:,
|
253
252
|
reception_status: COMPLETED_RECEPTION_STATUSES
|
254
|
-
}).where.not(id:
|
253
|
+
}).where.not(id:).first
|
255
254
|
|
256
255
|
if other_return_item && (new_record? || COMPLETED_RECEPTION_STATUSES.include?(reception_status.to_sym))
|
257
|
-
errors.add(:inventory_unit, :other_completed_return_item_exists,
|
258
|
-
inventory_unit_id
|
259
|
-
return_item_id: other_return_item.id
|
260
|
-
})
|
256
|
+
errors.add(:inventory_unit, :other_completed_return_item_exists,
|
257
|
+
inventory_unit_id:,
|
258
|
+
return_item_id: other_return_item.id)
|
261
259
|
end
|
262
260
|
end
|
263
261
|
|
264
262
|
def cancel_others
|
265
|
-
Spree::ReturnItem.where(inventory_unit_id:
|
266
|
-
.where.not(id:
|
263
|
+
Spree::ReturnItem.where(inventory_unit_id:)
|
264
|
+
.where.not(id:)
|
267
265
|
.valid
|
268
266
|
.each(&:cancel!)
|
269
267
|
end
|
@@ -2,10 +2,15 @@
|
|
2
2
|
|
3
3
|
module Spree
|
4
4
|
class ReturnReason < Spree::Base
|
5
|
-
|
5
|
+
scope :active, -> { where(active: true) }
|
6
|
+
default_scope -> { order(arel_table[:name].lower) }
|
7
|
+
|
8
|
+
validates :name, presence: true, uniqueness: { case_sensitive: false, allow_blank: true }
|
6
9
|
|
7
10
|
has_many :return_authorizations
|
8
11
|
|
12
|
+
self.allowed_ransackable_attributes = %w[name]
|
13
|
+
|
9
14
|
def self.reasons_for_return_items(return_items)
|
10
15
|
# Only allow an inactive reason if it's already associated to a return item
|
11
16
|
active | return_items.map(&:return_reason).compact
|
data/app/models/spree/role.rb
CHANGED
@@ -4,8 +4,10 @@ module Spree
|
|
4
4
|
class Role < Spree::Base
|
5
5
|
has_many :role_users, class_name: "Spree::RoleUser", dependent: :destroy
|
6
6
|
has_many :users, through: :role_users
|
7
|
+
has_many :role_permissions, dependent: :destroy
|
8
|
+
has_many :permission_sets, through: :role_permissions
|
7
9
|
|
8
|
-
|
10
|
+
validates :name, presence: true, uniqueness: { case_sensitive: true, allow_blank: true }
|
9
11
|
|
10
12
|
def admin?
|
11
13
|
name == "admin"
|
@@ -4,6 +4,8 @@ module Spree
|
|
4
4
|
# An order's planned shipments including tracking and cost.
|
5
5
|
#
|
6
6
|
class Shipment < Spree::Base
|
7
|
+
include Metadata
|
8
|
+
|
7
9
|
belongs_to :order, class_name: 'Spree::Order', touch: true, inverse_of: :shipments, optional: true
|
8
10
|
belongs_to :stock_location, class_name: 'Spree::StockLocation', optional: true
|
9
11
|
|
@@ -31,7 +33,7 @@ module Spree
|
|
31
33
|
scope :ready, -> { with_state('ready') }
|
32
34
|
scope :shipped, -> { with_state('shipped') }
|
33
35
|
scope :trackable, -> { where("tracking IS NOT NULL AND tracking != ''") }
|
34
|
-
scope :with_state, ->(*state) { where(state:
|
36
|
+
scope :with_state, ->(*state) { where(state:) }
|
35
37
|
# sort by most recent shipped_at, falling back to created_at. add "id desc" to make specs that involve this scope more deterministic.
|
36
38
|
scope :reverse_chronological, -> {
|
37
39
|
order(Arel.sql("coalesce(#{Spree::Shipment.table_name}.shipped_at, #{Spree::Shipment.table_name}.created_at) desc"), id: :desc)
|
@@ -41,8 +43,8 @@ module Spree
|
|
41
43
|
|
42
44
|
include ::Spree::Config.state_machines.shipment
|
43
45
|
|
44
|
-
self.
|
45
|
-
self.
|
46
|
+
self.allowed_ransackable_associations = ['order']
|
47
|
+
self.allowed_ransackable_attributes = ['number']
|
46
48
|
|
47
49
|
delegate :tax_category, :tax_category_id, to: :selected_shipping_rate, allow_nil: true
|
48
50
|
|
@@ -92,7 +94,7 @@ module Spree
|
|
92
94
|
# @return [BigDecimal] the amount of this item, taking into consideration
|
93
95
|
# all non-tax adjustments.
|
94
96
|
def total_before_tax
|
95
|
-
amount + adjustments.
|
97
|
+
amount + adjustments.reject(&:tax?).sum(&:amount)
|
96
98
|
end
|
97
99
|
|
98
100
|
# @return [BigDecimal] the amount of this shipment before VAT tax
|
@@ -175,7 +177,7 @@ module Spree
|
|
175
177
|
end
|
176
178
|
|
177
179
|
def manifest
|
178
|
-
@manifest ||= Spree::ShippingManifest.new(inventory_units:
|
180
|
+
@manifest ||= Spree::ShippingManifest.new(inventory_units:).items
|
179
181
|
end
|
180
182
|
|
181
183
|
def selected_shipping_rate_id
|
@@ -217,7 +219,7 @@ module Spree
|
|
217
219
|
|
218
220
|
def set_up_inventory(state, variant, _order, line_item)
|
219
221
|
inventory_units.create(
|
220
|
-
state
|
222
|
+
state:,
|
221
223
|
variant_id: variant.id,
|
222
224
|
line_item_id: line_item.id
|
223
225
|
)
|
@@ -263,7 +265,7 @@ module Spree
|
|
263
265
|
self.cost = selected_shipping_rate.cost
|
264
266
|
if changed?
|
265
267
|
update_columns(
|
266
|
-
cost
|
268
|
+
cost:,
|
267
269
|
updated_at: Time.current
|
268
270
|
)
|
269
271
|
end
|
@@ -286,7 +288,7 @@ module Spree
|
|
286
288
|
|
287
289
|
# Updates the state of the Shipment bypassing any callbacks.
|
288
290
|
#
|
289
|
-
# If this moves the
|
291
|
+
# If this moves the shipment to the 'shipped' state, after_ship will be
|
290
292
|
# called.
|
291
293
|
def update_state
|
292
294
|
old_state = state
|
@@ -312,7 +314,7 @@ module Spree
|
|
312
314
|
end
|
313
315
|
|
314
316
|
def after_ship
|
315
|
-
order.shipping.ship_shipment(self, suppress_mailer:
|
317
|
+
order.shipping.ship_shipment(self, suppress_mailer:)
|
316
318
|
end
|
317
319
|
|
318
320
|
def can_get_rates?
|
@@ -339,7 +341,7 @@ module Spree
|
|
339
341
|
|
340
342
|
def ensure_can_destroy
|
341
343
|
if shipped? || canceled?
|
342
|
-
errors.add(:state, :cannot_destroy, state:
|
344
|
+
errors.add(:state, :cannot_destroy, state:)
|
343
345
|
throw :abort
|
344
346
|
end
|
345
347
|
end
|
@@ -18,8 +18,7 @@ module Spree
|
|
18
18
|
delegate :name, :tax_category, :tax_category_id, to: :shipping_method
|
19
19
|
delegate :code, to: :shipping_method, prefix: true
|
20
20
|
alias_attribute :amount, :cost
|
21
|
-
|
22
|
-
alias_method :total_before_tax, :amount
|
21
|
+
alias_attribute :total_before_tax, :cost
|
23
22
|
|
24
23
|
extend DisplayMoney
|
25
24
|
money_methods :amount
|
@@ -32,7 +31,7 @@ module Spree
|
|
32
31
|
tax_explanations = taxes.map(&:label).join(tax_label_separator)
|
33
32
|
|
34
33
|
I18n.t 'spree.shipping_rate.display_price.display_price_with_explanations',
|
35
|
-
price
|
34
|
+
price:,
|
36
35
|
explanations: tax_explanations
|
37
36
|
end
|
38
37
|
alias_method :display_cost, :display_price
|
@@ -5,7 +5,7 @@ module Spree
|
|
5
5
|
# @attr [Spree::ShippingRate] shipping_rate The shipping rate to be taxed
|
6
6
|
# @attr [Spree::TaxRate] tax_rate The tax rate used to calculate the tax amount
|
7
7
|
# @since 1.3.0
|
8
|
-
# @see Spree::
|
8
|
+
# @see Spree::Stock::Estimator
|
9
9
|
class ShippingRateTax < Spree::Base
|
10
10
|
belongs_to :shipping_rate, class_name: "Spree::ShippingRate", optional: true
|
11
11
|
belongs_to :tax_rate, class_name: "Spree::TaxRate", optional: true
|
@@ -1,7 +1,7 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
module Spree
|
4
|
-
class
|
4
|
+
class SimpleOrderContents
|
5
5
|
attr_accessor :order
|
6
6
|
|
7
7
|
def initialize(order)
|
@@ -38,12 +38,7 @@ module Spree
|
|
38
38
|
if order.update(params)
|
39
39
|
unless order.completed?
|
40
40
|
order.line_items = order.line_items.select { |li| li.quantity > 0 }
|
41
|
-
|
42
|
-
# If we do not update first, then the item total will be wrong and ItemTotal
|
43
|
-
# promotion rules would not be triggered.
|
44
|
-
reload_totals
|
45
|
-
PromotionHandler::Cart.new(order).activate
|
46
|
-
order.ensure_updated_shipments
|
41
|
+
order.check_shipments_and_restart_checkout
|
47
42
|
end
|
48
43
|
reload_totals
|
49
44
|
true
|
@@ -71,10 +66,8 @@ module Spree
|
|
71
66
|
private
|
72
67
|
|
73
68
|
def after_add_or_remove(line_item, options = {})
|
74
|
-
reload_totals
|
75
69
|
shipment = options[:shipment]
|
76
|
-
shipment.present? ? shipment.update_amounts : order.
|
77
|
-
PromotionHandler::Cart.new(order, line_item).activate
|
70
|
+
shipment.present? ? shipment.update_amounts : order.check_shipments_and_restart_checkout
|
78
71
|
reload_totals
|
79
72
|
line_item
|
80
73
|
end
|
@@ -88,11 +81,15 @@ module Spree
|
|
88
81
|
|
89
82
|
line_item ||= order.line_items.new(
|
90
83
|
quantity: 0,
|
91
|
-
variant
|
84
|
+
variant:,
|
85
|
+
adjustments: []
|
92
86
|
)
|
93
87
|
|
88
|
+
permitted_attributes = Spree::PermittedAttributes.line_item_attributes.dup
|
89
|
+
permitted_attributes << { admin_metadata: {} } if options[:admin_metadata].present?
|
90
|
+
|
94
91
|
line_item.quantity += quantity.to_i
|
95
|
-
line_item.options = ActionController::Parameters.new(options).permit(
|
92
|
+
line_item.options = ActionController::Parameters.new(options).permit(permitted_attributes).to_h
|
96
93
|
|
97
94
|
line_item.target_shipment = options[:shipment]
|
98
95
|
line_item.save!
|
@@ -116,7 +113,7 @@ module Spree
|
|
116
113
|
def grab_line_item_by_variant(variant, raise_error = false, options = {})
|
117
114
|
line_item = order.find_line_item_by_variant(variant, options)
|
118
115
|
|
119
|
-
if
|
116
|
+
if line_item.blank? && raise_error
|
120
117
|
raise ActiveRecord::RecordNotFound, "Line item not found for variant #{variant.sku}"
|
121
118
|
end
|
122
119
|
|
data/app/models/spree/state.rb
CHANGED
@@ -7,11 +7,11 @@ module Spree
|
|
7
7
|
def allocate_inventory(desired)
|
8
8
|
# Allocate any available on hand inventory
|
9
9
|
on_hand = allocate_on_hand(desired)
|
10
|
-
desired -= on_hand.values.
|
10
|
+
desired -= on_hand.values.reduce(&:+) if on_hand.present?
|
11
11
|
|
12
12
|
# Allocate remaining desired inventory from backorders
|
13
13
|
backordered = allocate_backordered(desired)
|
14
|
-
desired -= backordered.values.
|
14
|
+
desired -= backordered.values.reduce(&:+) if backordered.present?
|
15
15
|
|
16
16
|
# If all works at this point desired must be empty
|
17
17
|
[on_hand, backordered, desired]
|
@@ -19,7 +19,7 @@ module Spree
|
|
19
19
|
# Get the on_hand stock quantities
|
20
20
|
# @return [Hash<Integer=>Spree::StockQuantities>] A map of stock_location_ids to the stock quantities available in that location
|
21
21
|
def on_hand_by_stock_location_id
|
22
|
-
counts_on_hand.to_a.group_by do |(_, stock_location_id), _|
|
22
|
+
quantities_by_location_id = counts_on_hand.to_a.group_by do |(_, stock_location_id), _|
|
23
23
|
stock_location_id
|
24
24
|
end.transform_values do |values|
|
25
25
|
Spree::StockQuantities.new(
|
@@ -31,12 +31,13 @@ module Spree
|
|
31
31
|
end.to_h
|
32
32
|
)
|
33
33
|
end
|
34
|
+
restore_location_order(quantities_by_location_id)
|
34
35
|
end
|
35
36
|
|
36
|
-
# Get the
|
37
|
+
# Get the backorderable stock quantities
|
37
38
|
# @return [Hash<Integer=>Spree::StockQuantities>] A map of stock_location_ids to the stock quantities available in that location
|
38
39
|
def backorderable_by_stock_location_id
|
39
|
-
backorderables.group_by(&:second).transform_values do |variant_ids|
|
40
|
+
quantities_by_location_id = backorderables.group_by(&:second).transform_values do |variant_ids|
|
40
41
|
Spree::StockQuantities.new(
|
41
42
|
variant_ids.map do |variant_id, _|
|
42
43
|
variant = @variant_map[variant_id]
|
@@ -44,6 +45,7 @@ module Spree
|
|
44
45
|
end.to_h
|
45
46
|
)
|
46
47
|
end
|
48
|
+
restore_location_order(quantities_by_location_id)
|
47
49
|
end
|
48
50
|
|
49
51
|
private
|
@@ -67,6 +69,12 @@ module Spree
|
|
67
69
|
where(variant_id: @variants).
|
68
70
|
where(stock_location_id: @stock_locations)
|
69
71
|
end
|
72
|
+
|
73
|
+
def restore_location_order(quantities_by_location_id)
|
74
|
+
sorted_location_ids = @stock_locations.map(&:id)
|
75
|
+
|
76
|
+
quantities_by_location_id.sort_by { |key, _value| sorted_location_ids.index(key) }.to_h
|
77
|
+
end
|
70
78
|
end
|
71
79
|
end
|
72
80
|
end
|
@@ -124,8 +124,8 @@ module Spree
|
|
124
124
|
contents.each { |content_item| content_item.inventory_unit.state = content_item.state.to_s }
|
125
125
|
|
126
126
|
Spree::Shipment.new(
|
127
|
-
order
|
128
|
-
stock_location
|
127
|
+
order:,
|
128
|
+
stock_location:,
|
129
129
|
inventory_units: contents.map(&:inventory_unit)
|
130
130
|
)
|
131
131
|
end
|
@@ -6,14 +6,18 @@ module Spree
|
|
6
6
|
attr_reader :stock_items
|
7
7
|
|
8
8
|
# @param [Variant] variant The variant to check inventory for.
|
9
|
-
# @param [StockLocation, Integer]
|
10
|
-
|
9
|
+
# @param [StockLocation, Integer] stock_location_or_id
|
10
|
+
# The stock_location or stock location ID to check inventory in.
|
11
|
+
# If unspecified it will check inventory in all available StockLocations
|
12
|
+
def initialize(variant, stock_location_or_id = nil)
|
11
13
|
@variant = variant
|
12
|
-
@stock_items =
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
14
|
+
@stock_items = variant.stock_items.select do |stock_item|
|
15
|
+
if stock_location_or_id
|
16
|
+
stock_item.stock_location == stock_location_or_id ||
|
17
|
+
stock_item.stock_location_id == stock_location_or_id
|
18
|
+
else
|
19
|
+
stock_item.stock_location.active?
|
20
|
+
end
|
17
21
|
end
|
18
22
|
end
|
19
23
|
|
@@ -23,7 +27,7 @@ module Spree
|
|
23
27
|
# inventory is not tracked on the variant.
|
24
28
|
def total_on_hand
|
25
29
|
if @variant.should_track_inventory?
|
26
|
-
stock_items.sum(
|
30
|
+
stock_items.sum(&:count_on_hand)
|
27
31
|
else
|
28
32
|
Float::INFINITY
|
29
33
|
end
|
@@ -22,38 +22,65 @@ module Spree
|
|
22
22
|
class SimpleCoordinator
|
23
23
|
attr_reader :order
|
24
24
|
|
25
|
+
# @api private
|
26
|
+
attr_reader :inventory_units, :splitters, :stock_locations,
|
27
|
+
:filtered_stock_locations, :inventory_units_by_variant, :desired,
|
28
|
+
:availability, :allocator, :packages
|
29
|
+
|
25
30
|
def initialize(order, inventory_units = nil)
|
26
31
|
@order = order
|
27
|
-
@inventory_units =
|
32
|
+
@inventory_units =
|
33
|
+
inventory_units || Spree::Config.stock.inventory_unit_builder_class.new(order).units
|
28
34
|
@splitters = Spree::Config.environment.stock_splitters
|
29
35
|
|
30
|
-
filtered_stock_locations = Spree::Config.stock.location_filter_class.new(
|
36
|
+
@filtered_stock_locations = Spree::Config.stock.location_filter_class.new(load_stock_locations, order).filter
|
31
37
|
sorted_stock_locations = Spree::Config.stock.location_sorter_class.new(filtered_stock_locations).sort
|
32
38
|
@stock_locations = sorted_stock_locations
|
33
39
|
|
34
40
|
@inventory_units_by_variant = @inventory_units.group_by(&:variant)
|
35
|
-
@desired = Spree::StockQuantities.new(
|
41
|
+
@desired = Spree::StockQuantities.new(inventory_units_by_variant.transform_values(&:count))
|
36
42
|
@availability = Spree::Stock::Availability.new(
|
37
|
-
variants:
|
38
|
-
stock_locations:
|
43
|
+
variants: desired.variants,
|
44
|
+
stock_locations:
|
39
45
|
)
|
40
46
|
|
41
|
-
@allocator = Spree::Config.stock.allocator_class.new(
|
47
|
+
@allocator = Spree::Config.stock.allocator_class.new(availability)
|
42
48
|
end
|
43
49
|
|
44
50
|
def shipments
|
45
|
-
@shipments ||=
|
51
|
+
@shipments ||= begin
|
52
|
+
@packages = build_packages
|
53
|
+
shipments = build_shipments
|
54
|
+
|
55
|
+
# Make sure we don't add the proposed shipments to the order
|
56
|
+
order.shipments = order.shipments - shipments
|
57
|
+
|
58
|
+
shipments
|
59
|
+
end
|
46
60
|
end
|
47
61
|
|
48
62
|
private
|
49
63
|
|
64
|
+
def load_stock_locations
|
65
|
+
Spree::StockLocation.all
|
66
|
+
end
|
67
|
+
|
50
68
|
def build_shipments
|
69
|
+
# Turn the Stock::Packages into a Shipment with rates
|
70
|
+
packages.map do |package|
|
71
|
+
shipment = package.shipment = package.to_shipment
|
72
|
+
shipment.shipping_rates = Spree::Config.stock.estimator_class.new.shipping_rates(package)
|
73
|
+
shipment
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def build_packages
|
51
78
|
# Allocate any available on hand inventory and remaining desired inventory from backorders
|
52
|
-
on_hand_packages, backordered_packages, leftover =
|
79
|
+
on_hand_packages, backordered_packages, leftover = allocator.allocate_inventory(desired)
|
53
80
|
|
54
81
|
raise Spree::Order::InsufficientStock.new(items: leftover.quantities) unless leftover.empty?
|
55
82
|
|
56
|
-
packages =
|
83
|
+
packages = stock_locations.map do |stock_location|
|
57
84
|
# Combine on_hand and backorders into a single package per-location
|
58
85
|
on_hand = on_hand_packages[stock_location.id] || Spree::StockQuantities.new
|
59
86
|
backordered = backordered_packages[stock_location.id] || Spree::StockQuantities.new
|
@@ -70,14 +97,7 @@ module Spree
|
|
70
97
|
end.compact
|
71
98
|
|
72
99
|
# Split the packages
|
73
|
-
|
74
|
-
|
75
|
-
# Turn the Stock::Packages into a Shipment with rates
|
76
|
-
packages.map do |package|
|
77
|
-
shipment = package.shipment = package.to_shipment
|
78
|
-
shipment.shipping_rates = Spree::Config.stock.estimator_class.new.shipping_rates(package)
|
79
|
-
shipment
|
80
|
-
end
|
100
|
+
split_packages(packages)
|
81
101
|
end
|
82
102
|
|
83
103
|
def split_packages(initial_packages)
|
@@ -87,20 +107,10 @@ module Spree
|
|
87
107
|
end
|
88
108
|
end
|
89
109
|
|
90
|
-
def sort_availability(availability)
|
91
|
-
sorted_availability = availability.sort_by do |stock_location_id, _|
|
92
|
-
@stock_locations.find_index do |stock_location|
|
93
|
-
stock_location.id == stock_location_id
|
94
|
-
end
|
95
|
-
end
|
96
|
-
|
97
|
-
Hash[sorted_availability]
|
98
|
-
end
|
99
|
-
|
100
110
|
def get_units(quantities)
|
101
111
|
# Change our raw quantities back into inventory units
|
102
112
|
quantities.flat_map do |variant, quantity|
|
103
|
-
|
113
|
+
inventory_units_by_variant[variant].shift(quantity)
|
104
114
|
end
|
105
115
|
end
|
106
116
|
end
|
@@ -20,7 +20,8 @@ module Spree
|
|
20
20
|
after_save :conditional_variant_touch, if: :saved_changes?
|
21
21
|
after_touch { variant.touch }
|
22
22
|
|
23
|
-
self.
|
23
|
+
self.allowed_ransackable_attributes = ['count_on_hand', 'stock_location_id']
|
24
|
+
self.allowed_ransackable_associations = %w[variant]
|
24
25
|
|
25
26
|
# @return [Array<Spree::InventoryUnit>] the backordered inventory units
|
26
27
|
# associated with this stock item
|
@@ -26,12 +26,12 @@ module Spree
|
|
26
26
|
validates_uniqueness_of :code, allow_blank: true, case_sensitive: false
|
27
27
|
|
28
28
|
scope :active, -> { where(active: true) }
|
29
|
-
scope :order_default, -> { order(default: :desc,
|
29
|
+
scope :order_default, -> { order(default: :desc, position: :asc) }
|
30
30
|
|
31
31
|
after_create :create_stock_items, if: :propagate_all_variants?
|
32
32
|
after_save :ensure_one_default
|
33
33
|
|
34
|
-
self.
|
34
|
+
self.allowed_ransackable_attributes = %w[name]
|
35
35
|
|
36
36
|
def state_text
|
37
37
|
state.try(:abbr) || state.try(:name) || state_name
|
@@ -39,7 +39,7 @@ module Spree
|
|
39
39
|
|
40
40
|
# Wrapper for creating a new stock item respecting the backorderable config
|
41
41
|
def propagate_variant(variant)
|
42
|
-
stock_items.create!(variant
|
42
|
+
stock_items.create!(variant:, backorderable: backorderable_default)
|
43
43
|
end
|
44
44
|
|
45
45
|
# Return either an existing stock item or create a new one. Useful in
|
@@ -55,7 +55,7 @@ module Spree
|
|
55
55
|
#
|
56
56
|
# @return [StockItem] Corresponding StockItem for the StockLocation's variant.
|
57
57
|
def stock_item(variant_id)
|
58
|
-
stock_items.where(variant_id:
|
58
|
+
stock_items.where(variant_id:).order(:id).first
|
59
59
|
end
|
60
60
|
|
61
61
|
# Attempts to look up StockItem for the variant, and creates one if not found.
|
@@ -101,8 +101,8 @@ module Spree
|
|
101
101
|
if quantity < 1 && !stock_item(variant)
|
102
102
|
raise InvalidMovementError.new(I18n.t('spree.negative_movement_absent_item'))
|
103
103
|
end
|
104
|
-
stock_item_or_create(variant).stock_movements.create!(quantity
|
105
|
-
originator:
|
104
|
+
stock_item_or_create(variant).stock_movements.create!(quantity:,
|
105
|
+
originator:)
|
106
106
|
end
|
107
107
|
|
108
108
|
def fill_status(variant, quantity)
|
@@ -121,7 +121,7 @@ module Spree
|
|
121
121
|
|
122
122
|
def ensure_one_default
|
123
123
|
if default
|
124
|
-
Spree::StockLocation.where(default: true).where.not(id:
|
124
|
+
Spree::StockLocation.where(default: true).where.not(id:).find_each do |stock_location|
|
125
125
|
stock_location.default = false
|
126
126
|
stock_location.save!
|
127
127
|
end
|
@@ -13,8 +13,8 @@ module Spree
|
|
13
13
|
|
14
14
|
scope :recent, -> { order(created_at: :desc) }
|
15
15
|
|
16
|
-
self.
|
17
|
-
self.
|
16
|
+
self.allowed_ransackable_associations = %w[variant]
|
17
|
+
self.allowed_ransackable_attributes = ['quantity']
|
18
18
|
|
19
19
|
def readonly?
|
20
20
|
!new_record?
|