solidus_core 1.2.3 → 1.3.0.beta1
Sign up to get free protection for your applications and to get access to all the features.
Potentially problematic release.
This version of solidus_core might be problematic. Click here for more details.
- checksums.yaml +4 -4
- data/Gemfile +1 -1
- data/Rakefile +1 -1
- data/app/assets/javascripts/spree.js.coffee.erb +1 -1
- data/app/helpers/spree/base_helper.rb +21 -43
- data/app/helpers/spree/orders_helper.rb +0 -1
- data/app/helpers/spree/products_helper.rb +10 -12
- data/app/helpers/spree/taxons_helper.rb +4 -4
- data/app/mailers/spree/base_mailer.rb +1 -3
- data/app/mailers/spree/carton_mailer.rb +2 -2
- data/app/mailers/spree/order_mailer.rb +2 -2
- data/app/models/concerns/spree/adjustment_source.rb +12 -16
- data/app/models/concerns/spree/calculated_adjustments.rb +17 -14
- data/app/models/concerns/spree/default_price.rb +10 -26
- data/app/models/concerns/spree/display_money.rb +1 -1
- data/app/models/concerns/spree/ordered_property_value_list.rb +10 -12
- data/app/models/concerns/spree/ransackable_attributes.rb +6 -5
- data/app/models/concerns/spree/user_address_book.rb +87 -81
- data/app/models/concerns/spree/user_methods.rb +2 -2
- data/app/models/concerns/spree/user_payment_source.rb +12 -8
- data/app/models/spree/ability.rb +2 -2
- data/app/models/spree/address.rb +37 -38
- data/app/models/spree/adjustment.rb +2 -6
- data/app/models/spree/app_configuration.rb +60 -5
- data/app/models/spree/base.rb +1 -1
- data/app/models/spree/calculator/default_tax.rb +28 -24
- data/app/models/spree/calculator/flat_percent_item_total.rb +1 -1
- data/app/models/spree/calculator/flat_rate.rb +2 -2
- data/app/models/spree/calculator/flexi_rate.rb +4 -4
- data/app/models/spree/calculator/percent_per_item.rb +8 -9
- data/app/models/spree/calculator/price_sack.rb +3 -3
- data/app/models/spree/calculator/returns/default_refund_amount.rb +11 -12
- data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +1 -1
- data/app/models/spree/calculator/shipping/flat_rate.rb +2 -2
- data/app/models/spree/calculator/shipping/flexi_rate.rb +3 -3
- data/app/models/spree/calculator/shipping/per_item.rb +1 -1
- data/app/models/spree/calculator/shipping/price_sack.rb +3 -3
- data/app/models/spree/calculator/tiered_flat_rate.rb +2 -1
- data/app/models/spree/calculator/tiered_percent.rb +2 -1
- data/app/models/spree/calculator.rb +3 -3
- data/app/models/spree/carton.rb +2 -2
- data/app/models/spree/country.rb +7 -4
- data/app/models/spree/credit_card.rb +26 -22
- data/app/models/spree/customer_return.rb +8 -7
- data/app/models/spree/exchange.rb +1 -9
- data/app/models/spree/gateway/bogus.rb +31 -31
- data/app/models/spree/gateway/bogus_simple.rb +6 -8
- data/app/models/spree/gateway.rb +9 -15
- data/app/models/spree/image.rb +3 -3
- data/app/models/spree/inventory_unit.rb +23 -23
- data/app/models/spree/item_adjustments.rb +3 -2
- data/app/models/spree/legacy_user.rb +1 -5
- data/app/models/spree/line_item.rb +95 -84
- data/app/models/spree/option_type.rb +1 -1
- data/app/models/spree/option_value.rb +3 -1
- data/app/models/spree/order/checkout.rb +45 -44
- data/app/models/spree/order/payments.rb +42 -45
- data/app/models/spree/order.rb +70 -75
- data/app/models/spree/order_cancellations.rb +4 -4
- data/app/models/spree/order_capturing.rb +3 -2
- data/app/models/spree/order_contents.rb +61 -59
- data/app/models/spree/order_inventory.rb +59 -54
- data/app/models/spree/order_mutex.rb +0 -1
- data/app/models/spree/order_shipping.rb +8 -9
- data/app/models/spree/order_stock_location.rb +3 -3
- data/app/models/spree/order_update_attributes.rb +0 -2
- data/app/models/spree/order_updater.rb +11 -24
- data/app/models/spree/payment/processing.rb +26 -37
- data/app/models/spree/payment.rb +68 -71
- data/app/models/spree/payment_method/check.rb +2 -2
- data/app/models/spree/payment_method/store_credit.rb +6 -7
- data/app/models/spree/payment_method.rb +11 -8
- data/app/models/spree/preferences/configuration.rb +2 -2
- data/app/models/spree/preferences/preferable.rb +1 -1
- data/app/models/spree/preferences/preferable_class_methods.rb +1 -1
- data/app/models/spree/preferences/scoped_store.rb +6 -5
- data/app/models/spree/preferences/static_model_preferences.rb +1 -1
- data/app/models/spree/preferences/statically_configurable.rb +2 -2
- data/app/models/spree/preferences/store.rb +2 -6
- data/app/models/spree/price.rb +17 -19
- data/app/models/spree/product/scopes.rb +18 -17
- data/app/models/spree/product.rb +28 -11
- data/app/models/spree/product_property.rb +2 -0
- data/app/models/spree/product_scope/scopes.rb +22 -22
- data/app/models/spree/promotion/actions/create_adjustment.rb +3 -4
- data/app/models/spree/promotion/actions/create_item_adjustments.rb +8 -8
- data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +3 -3
- data/app/models/spree/promotion/actions/free_shipping.rb +4 -4
- data/app/models/spree/promotion/rules/first_order.rb +7 -6
- data/app/models/spree/promotion/rules/first_repeat_purchase_since.rb +2 -3
- data/app/models/spree/promotion/rules/item_total.rb +5 -2
- data/app/models/spree/promotion/rules/nth_order.rb +3 -4
- data/app/models/spree/promotion/rules/one_use_per_user.rb +1 -2
- data/app/models/spree/promotion/rules/option_value.rb +1 -2
- data/app/models/spree/promotion/rules/product.rb +4 -4
- data/app/models/spree/promotion/rules/taxon.rb +5 -5
- data/app/models/spree/promotion/rules/user.rb +1 -1
- data/app/models/spree/promotion/rules/user_logged_in.rb +1 -1
- data/app/models/spree/promotion.rb +8 -8
- data/app/models/spree/promotion_action.rb +1 -1
- data/app/models/spree/promotion_builder.rb +2 -2
- data/app/models/spree/promotion_chooser.rb +1 -0
- data/app/models/spree/promotion_code/code_builder.rb +3 -3
- data/app/models/spree/promotion_handler/cart.rb +17 -16
- data/app/models/spree/promotion_handler/coupon.rb +10 -14
- data/app/models/spree/promotion_handler/page.rb +4 -4
- data/app/models/spree/promotion_rule.rb +4 -3
- data/app/models/spree/prototype.rb +0 -1
- data/app/models/spree/refund.rb +3 -3
- data/app/models/spree/reimbursement/reimbursement_type_engine.rb +1 -3
- data/app/models/spree/reimbursement.rb +3 -5
- data/app/models/spree/reimbursement_performer.rb +0 -5
- data/app/models/spree/reimbursement_tax_calculator.rb +2 -7
- data/app/models/spree/reimbursement_type/credit.rb +1 -1
- data/app/models/spree/reimbursement_type/original_payment.rb +1 -1
- data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +3 -3
- data/app/models/spree/reimbursement_type/store_credit.rb +1 -1
- data/app/models/spree/reimbursement_type.rb +1 -1
- data/app/models/spree/return_authorization.rb +38 -37
- data/app/models/spree/return_item/eligibility_validator/default.rb +4 -4
- data/app/models/spree/return_item/eligibility_validator/no_reimbursements.rb +0 -1
- data/app/models/spree/return_item/eligibility_validator/rma_required.rb +0 -1
- data/app/models/spree/return_item.rb +24 -23
- data/app/models/spree/returns_calculator.rb +1 -2
- data/app/models/spree/shipment.rb +80 -74
- data/app/models/spree/shipping_calculator.rb +4 -5
- data/app/models/spree/shipping_manifest.rb +3 -4
- data/app/models/spree/shipping_method.rb +54 -23
- data/app/models/spree/shipping_method_stock_location.rb +4 -0
- data/app/models/spree/shipping_rate.rb +24 -29
- data/app/models/spree/shipping_rate_tax.rb +41 -0
- data/app/models/spree/state.rb +1 -1
- data/app/models/spree/state_change.rb +1 -1
- data/app/models/spree/stock/availability_validator.rb +2 -2
- data/app/models/spree/stock/coordinator.rb +12 -13
- data/app/models/spree/stock/differentiator.rb +1 -0
- data/app/models/spree/stock/estimator.rb +18 -25
- data/app/models/spree/stock/inventory_unit_builder.rb +1 -1
- data/app/models/spree/stock/package.rb +19 -9
- data/app/models/spree/stock/packer.rb +2 -3
- data/app/models/spree/stock/prioritizer.rb +3 -2
- data/app/models/spree/stock/quantifier.rb +2 -3
- data/app/models/spree/stock/shipping_rate_selector.rb +0 -1
- data/app/models/spree/stock/shipping_rate_sorter.rb +0 -1
- data/app/models/spree/stock/splitter/backordered.rb +0 -2
- 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/splitter/weight.rb +2 -2
- data/app/models/spree/stock_item.rb +36 -37
- data/app/models/spree/stock_location.rb +17 -13
- data/app/models/spree/stock_movement.rb +1 -3
- data/app/models/spree/stock_transfer.rb +8 -8
- data/app/models/spree/store.rb +6 -0
- data/app/models/spree/store_credit.rb +24 -24
- data/app/models/spree/store_credit_category.rb +1 -2
- data/app/models/spree/tax/item_adjuster.rb +37 -0
- data/app/models/spree/tax/order_adjuster.rb +38 -0
- data/app/models/spree/tax/shipping_rate_taxer.rb +31 -0
- data/app/models/spree/tax/tax_helpers.rb +49 -0
- data/app/models/spree/tax/tax_location.rb +33 -0
- data/app/models/spree/tax_category.rb +1 -1
- data/app/models/spree/tax_rate.rb +46 -111
- data/app/models/spree/taxon.rb +36 -12
- data/app/models/spree/taxonomy.rb +10 -10
- data/app/models/spree/validations/db_maximum_length_validator.rb +0 -1
- data/app/models/spree/variant/pricer.rb +19 -0
- data/app/models/spree/variant/pricing_options.rb +31 -0
- data/app/models/spree/variant/scopes.rb +9 -9
- data/app/models/spree/variant.rb +95 -89
- data/app/models/spree/variant_property_rule.rb +1 -1
- data/app/models/spree/variant_property_rule_value.rb +2 -0
- data/app/models/spree/zone.rb +60 -24
- data/config/initializers/friendly_id.rb +1 -1
- data/config/locales/en.yml +337 -51
- data/config/routes.rb +1 -1
- data/db/default/spree/countries.rb +9 -15
- data/db/default/spree/roles.rb +1 -2
- data/db/default/spree/states.rb +7 -11
- data/db/default/spree/store_credit.rb +2 -2
- data/db/default/spree/stores.rb +2 -1
- data/db/migrate/20120831092320_spree_one_two.rb +100 -101
- data/db/migrate/20120831092359_spree_promo_one_two.rb +12 -12
- data/db/migrate/20120905151823_add_toggle_tax_rate_display.rb +1 -1
- data/db/migrate/20121009142519_add_lock_version_to_variant.rb +1 -1
- data/db/migrate/20121010142909_add_states_required_to_countries.rb +1 -1
- data/db/migrate/20121012071449_add_on_demand_to_product_and_variant.rb +2 -2
- data/db/migrate/20121017010007_remove_not_null_constraint_from_products_on_hand.rb +4 -4
- data/db/migrate/20121031162139_split_prices_from_variants.rb +8 -8
- data/db/migrate/20121107003422_remove_not_null_from_spree_prices_amount.rb +2 -2
- data/db/migrate/20121109173623_add_cost_currency_to_variants.rb +1 -1
- data/db/migrate/20121124203911_add_position_to_taxonomies.rb +1 -1
- data/db/migrate/20130120201805_add_position_to_product_properties.spree.rb +1 -2
- data/db/migrate/20130211190146_create_spree_stock_items.rb +1 -1
- data/db/migrate/20130213191427_create_default_stock.rb +12 -21
- data/db/migrate/20130226032817_change_meta_description_on_spree_products_to_text.rb +1 -1
- data/db/migrate/20130227143905_add_pending_to_inventory_unit.rb +2 -2
- data/db/migrate/20130228210442_create_shipping_method_zone.rb +1 -1
- data/db/migrate/20130301162924_create_shipping_method_categories.rb +2 -2
- data/db/migrate/20130304162240_create_spree_shipping_rates.rb +4 -4
- data/db/migrate/20130306181701_add_address_fields_to_stock_location.rb +2 -3
- data/db/migrate/20130306191917_add_active_field_to_stock_locations.rb +1 -1
- data/db/migrate/20130306195650_add_backorderable_to_stock_item.rb +1 -1
- data/db/migrate/20130307161754_add_default_quantity_to_stock_movement.rb +1 -1
- data/db/migrate/20130319062004_change_orders_total_precision.rb +4 -4
- data/db/migrate/20130319063911_change_spree_payments_amount_precision.rb +1 -3
- data/db/migrate/20130319064308_change_spree_return_authorization_amount_precision.rb +2 -4
- data/db/migrate/20130319082943_change_adjustments_amount_precision.rb +1 -3
- data/db/migrate/20130319190507_drop_source_and_destination_from_stock_movement.rb +2 -2
- data/db/migrate/20130325163316_migrate_inventory_unit_sold_to_on_hand.rb +2 -2
- data/db/migrate/20130417120035_update_adjustment_states.rb +2 -2
- data/db/migrate/20130417123427_add_shipping_rates_to_shipments.rb +3 -3
- data/db/migrate/20130628021056_add_unique_index_to_permalink_on_spree_products.rb +1 -1
- data/db/migrate/20130628022817_add_unique_index_to_orders_shipments_and_stock_transfers.rb +3 -3
- data/db/migrate/20130718042445_add_cost_price_to_line_item.rb +1 -1
- data/db/migrate/20130718233855_set_backorderable_to_default_to_false.rb +2 -2
- data/db/migrate/20130807024301_upgrade_adjustments.rb +3 -3
- data/db/migrate/20130813004002_add_shipment_total_to_spree_orders.rb +1 -1
- data/db/migrate/20130813140619_expand_order_number_size.rb +2 -2
- data/db/migrate/20130815000406_add_adjustment_total_to_line_items.rb +1 -1
- data/db/migrate/20130815024413_add_adjustment_total_to_shipments.rb +1 -1
- data/db/migrate/20130826062534_add_depth_to_spree_taxons.rb +1 -1
- data/db/migrate/20130830001033_add_shipping_category_to_shipping_methods_and_products.rb +1 -1
- data/db/migrate/20130830001159_migrate_old_shipping_calculators.rb +1 -1
- data/db/migrate/20131001013410_remove_unused_credit_card_fields.rb +1 -0
- data/db/migrate/20131026154747_add_track_inventory_to_variant.rb +1 -1
- data/db/migrate/20131118043959_add_included_to_adjustments.rb +1 -1
- data/db/migrate/20131118183431_add_line_item_id_to_spree_inventory_units.rb +0 -1
- data/db/migrate/20131211112807_create_spree_orders_promotions.rb +1 -1
- data/db/migrate/20131218054603_add_item_count_to_spree_orders.rb +1 -1
- data/db/migrate/20140106065820_remove_value_type_from_spree_preferences.rb +1 -0
- data/db/migrate/20140219060952_add_considered_risky_to_orders.rb +1 -1
- data/db/migrate/20140309023735_migrate_old_preferences.rb +4 -3
- data/db/migrate/20140309033438_create_store_from_preferences.rb +2 -2
- data/db/migrate/20140410141842_add_many_missing_indexes.rb +13 -15
- data/db/migrate/20140410150358_correct_some_polymorphic_index_and_add_more_missing.rb +38 -40
- data/db/migrate/20140508151342_change_spree_price_amount_precision.rb +4 -4
- data/db/migrate/20140530024945_move_order_token_from_tokenized_permission.rb +1 -1
- data/db/migrate/20140710041921_recreate_spree_return_authorizations.rb +0 -1
- data/db/migrate/20140718195325_create_friendly_id_slugs.rb +4 -4
- data/db/migrate/20140723214541_copy_product_slugs_to_slug_history.rb +4 -6
- data/db/migrate/20140805171219_make_existing_credit_cards_default.rb +1 -0
- data/db/migrate/20141217215630_update_product_slug_index.rb +2 -4
- data/db/migrate/20150112194216_add_position_to_stock_location.rb +2 -2
- data/db/migrate/20150225205344_move_promotion_code_to_promotion_code_value.rb +0 -1
- data/db/migrate/20150313201503_copy_shipped_shipments_to_cartons.rb +0 -1
- data/db/migrate/20150506181611_create_spree_store_credit_payment_method.rb +3 -3
- data/db/migrate/20150515211137_fix_adjustment_order_id.rb +0 -1
- data/db/migrate/20150612205731_remove_spree_configurations.rb +2 -2
- data/db/migrate/20150619160613_create_adjustment_reason.rb +1 -1
- data/db/migrate/20150723224133_remove_unnecessary_indexes.rb +10 -2
- data/db/migrate/20150731201146_add_spree_user_addresses.rb +0 -1
- data/db/migrate/20150811211025_add_finalized_to_spree_adjustments.rb +1 -1
- data/db/migrate/20151001121454_create_spree_shipping_method_stock_locations.rb +13 -0
- data/db/migrate/20151002023248_add_foreign_key_to_shipping_method_stock_location.rb +6 -0
- data/db/migrate/20151026093607_change_return_item_pre_tax_amount_to_amount.rb +29 -0
- data/db/migrate/20160111091912_add_column_available_to_all_on_spree_shipping_method.rb +5 -0
- data/db/migrate/20160116133604_add_position_to_spree_payment_methods.rb +5 -0
- data/db/migrate/20160122182105_add_carrier_and_service_level_to_spree_shipping_methods.rb +6 -0
- data/db/migrate/20160224201413_create_spree_shipping_rate_taxes.rb +11 -0
- data/db/migrate/20160229133259_add_cart_tax_country_iso_to_spree_store.rb +5 -0
- data/db/migrate/20160301103333_remove_pre_tax_amount_on_line_item_and_shipment.rb +6 -0
- data/db/migrate/20160308000300_disallow_adjustment_finalized_nulls.rb +19 -0
- data/db/migrate/20160318145302_add_timestamps_to_prices.rb +5 -0
- data/db/migrate/20160330204846_add_missing_timestamp_columns.rb +20 -0
- data/lib/generators/spree/custom_user/custom_user_generator.rb +3 -8
- data/lib/generators/spree/dummy/dummy_generator.rb +17 -19
- data/lib/generators/spree/install/install_generator.rb +15 -15
- data/lib/generators/spree/install/templates/config/initializers/spree.rb +1 -0
- data/lib/spree/core/controller_helpers/auth.rb +2 -4
- data/lib/spree/core/controller_helpers/common.rb +42 -43
- data/lib/spree/core/controller_helpers/order.rb +5 -9
- data/lib/spree/core/controller_helpers/payment_parameters.rb +4 -5
- data/lib/spree/core/controller_helpers/pricing.rb +27 -0
- data/lib/spree/core/controller_helpers/respond_with.rb +4 -4
- data/lib/spree/core/controller_helpers/search.rb +2 -2
- data/lib/spree/core/controller_helpers/store.rb +3 -3
- data/lib/spree/core/controller_helpers/strong_parameters.rb +4 -4
- data/lib/spree/core/current_store.rb +1 -1
- data/lib/spree/core/delegate_belongs_to.rb +19 -21
- data/lib/spree/core/engine.rb +12 -8
- data/lib/spree/core/environment/calculators.rb +0 -1
- data/lib/spree/core/environment_extension.rb +4 -4
- data/lib/spree/core/importer/order.rb +17 -22
- data/lib/spree/core/importer/product.rb +10 -9
- data/lib/spree/core/permalinks.rb +16 -16
- data/lib/spree/core/product_duplicator.rb +2 -3
- data/lib/spree/core/product_filters.rb +15 -16
- data/lib/spree/core/role_configuration.rb +2 -2
- data/lib/spree/core/search/base.rb +71 -57
- data/lib/spree/core/search/variant.rb +2 -4
- data/lib/spree/core/unreturned_item_charger.rb +1 -2
- data/lib/spree/core/validators/email.rb +2 -2
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/core.rb +2 -4
- data/lib/spree/i18n.rb +1 -1
- data/lib/spree/localized_number.rb +3 -1
- data/lib/spree/migrations.rb +27 -26
- data/lib/spree/money.rb +19 -4
- data/lib/spree/permission_sets/base.rb +1 -1
- data/lib/spree/permitted_attributes.rb +7 -7
- data/lib/spree/responder.rb +4 -5
- data/lib/spree/testing_support/authorization_helpers.rb +1 -1
- data/lib/spree/testing_support/caching.rb +8 -8
- data/lib/spree/testing_support/capybara_ext.rb +11 -13
- data/lib/spree/testing_support/common_rake.rb +4 -4
- data/lib/spree/testing_support/controller_requests.rb +1 -1
- data/lib/spree/testing_support/extension_rake.rb +1 -2
- data/lib/spree/testing_support/factories/address_factory.rb +14 -3
- data/lib/spree/testing_support/factories/adjustment_reason_factory.rb +1 -1
- data/lib/spree/testing_support/factories/carton_factory.rb +2 -2
- data/lib/spree/testing_support/factories/credit_card_factory.rb +4 -0
- data/lib/spree/testing_support/factories/customer_return_factory.rb +4 -6
- data/lib/spree/testing_support/factories/line_item_factory.rb +1 -1
- data/lib/spree/testing_support/factories/order_factory.rb +10 -11
- data/lib/spree/testing_support/factories/payment_factory.rb +5 -0
- data/lib/spree/testing_support/factories/promotion_category_factory.rb +0 -1
- data/lib/spree/testing_support/factories/promotion_factory.rb +0 -1
- data/lib/spree/testing_support/factories/refund_factory.rb +1 -1
- data/lib/spree/testing_support/factories/reimbursement_factory.rb +1 -1
- data/lib/spree/testing_support/factories/return_item_factory.rb +1 -1
- data/lib/spree/testing_support/factories/shipping_method_factory.rb +5 -2
- data/lib/spree/testing_support/factories/state_factory.rb +17 -7
- data/lib/spree/testing_support/factories/stock_location_factory.rb +4 -4
- data/lib/spree/testing_support/factories/stock_transfer_factory.rb +1 -1
- data/lib/spree/testing_support/factories/store_credit_category_factory.rb +0 -1
- data/lib/spree/testing_support/factories/store_credit_type_factory.rb +0 -2
- data/lib/spree/testing_support/factories/tax_category_factory.rb +2 -2
- 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 +2 -1
- data/lib/spree/testing_support/i18n.rb +4 -5
- data/lib/spree/testing_support/order_walkthrough.rb +8 -9
- data/lib/spree/testing_support/preferences.rb +1 -1
- data/lib/spree/testing_support/sequences.rb +5 -4
- data/lib/tasks/core.rake +15 -19
- data/lib/tasks/email.rake +3 -3
- data/lib/tasks/exchanges.rake +12 -14
- data/lib/tasks/migrations/assure_store_on_orders.rake +38 -0
- data/lib/tasks/migrations/copy_order_bill_address_to_credit_card.rake +2 -2
- data/lib/tasks/migrations/copy_shipped_shipments_to_cartons.rake +1 -11
- data/lib/tasks/migrations/migrate_shipping_rate_taxes.rake +17 -0
- data/lib/tasks/migrations/migrate_user_addresses.rake +1 -1
- data/lib/tasks/order_capturing.rake +1 -1
- data/lib/tasks/upgrade.rake +11 -0
- data/script/rails +0 -1
- data/solidus_core.gemspec +6 -8
- data/spec/helpers/base_helper_spec.rb +15 -18
- data/spec/helpers/order_helper_spec.rb +2 -2
- data/spec/helpers/products_helper_spec.rb +43 -51
- data/spec/helpers/taxons_helper_spec.rb +1 -1
- data/spec/lib/i18n_spec.rb +11 -11
- data/spec/lib/search/base_spec.rb +12 -14
- data/spec/lib/search/variant_spec.rb +1 -0
- data/spec/lib/spree/core/controller_helpers/order_spec.rb +1 -7
- data/spec/lib/spree/core/controller_helpers/payment_parameters_spec.rb +26 -28
- data/spec/lib/spree/core/controller_helpers/pricing_spec.rb +63 -0
- data/spec/lib/spree/core/controller_helpers/search_spec.rb +4 -2
- data/spec/lib/spree/core/delegate_belongs_to_spec.rb +1 -1
- data/spec/lib/spree/core/importer/order_spec.rb +95 -90
- data/spec/lib/spree/core/role_configuration_spec.rb +16 -16
- data/spec/lib/spree/core/testing_support/factories/address_factory_spec.rb +35 -0
- data/spec/lib/spree/core/testing_support/factories/customer_return_factory_spec.rb +10 -1
- data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +0 -1
- data/spec/lib/spree/core/testing_support/factories/shipping_method_factory_spec.rb +6 -1
- data/spec/lib/spree/core/testing_support/factories/state_factory_spec.rb +37 -1
- data/spec/lib/spree/core/testing_support/factories/stock_package_factory_spec.rb +2 -2
- data/spec/lib/spree/core/testing_support/factories/stock_packer_factory_spec.rb +1 -1
- data/spec/lib/spree/core/testing_support/factories/store_credit_event_factory_spec.rb +1 -2
- data/spec/lib/spree/core/testing_support/preferences_spec.rb +26 -0
- data/spec/lib/spree/core/unreturned_item_charger_spec.rb +7 -9
- data/spec/lib/spree/core/validators/email_spec.rb +8 -6
- data/spec/lib/spree/localized_number_spec.rb +1 -3
- data/spec/lib/spree/migrations_spec.rb +2 -2
- data/spec/lib/spree/money_spec.rb +75 -6
- data/spec/lib/tasks/exchanges_spec.rb +2 -12
- data/spec/lib/tasks/migrations/copy_shipped_shipments_to_cartons_spec.rb +0 -1
- data/spec/lib/tasks/order_capturing_spec.rb +1 -1
- data/spec/mailers/carton_mailer_spec.rb +3 -3
- data/spec/mailers/order_mailer_spec.rb +9 -11
- data/spec/mailers/reimbursement_mailer_spec.rb +2 -2
- data/spec/mailers/test_mailer_spec.rb +1 -1
- data/spec/models/spree/ability_spec.rb +4 -7
- data/spec/models/spree/address_spec.rb +32 -35
- data/spec/models/spree/adjustment_reason_spec.rb +0 -2
- data/spec/models/spree/adjustment_spec.rb +2 -2
- data/spec/models/spree/app_configuration_spec.rb +33 -3
- data/spec/models/spree/asset_spec.rb +1 -2
- data/spec/models/spree/calculator/default_tax_spec.rb +141 -52
- data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +1 -1
- data/spec/models/spree/calculator/flexi_rate_spec.rb +6 -6
- data/spec/models/spree/calculator/percent_on_line_item_spec.rb +1 -1
- data/spec/models/spree/calculator/price_sack_spec.rb +2 -2
- data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +9 -11
- data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +4 -4
- data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +2 -2
- data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +6 -7
- data/spec/models/spree/calculator/shipping/per_item_spec.rb +2 -2
- data/spec/models/spree/calculator/shipping/price_sack_spec.rb +2 -2
- data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +1 -2
- data/spec/models/spree/calculator/tiered_percent_spec.rb +1 -1
- data/spec/models/spree/calculator_spec.rb +3 -8
- data/spec/models/spree/carton_spec.rb +1 -1
- data/spec/models/spree/classification_spec.rb +1 -1
- data/spec/models/spree/concerns/display_money_spec.rb +0 -1
- data/spec/models/spree/concerns/ordered_property_value_list_spec.rb +26 -1
- data/spec/models/spree/concerns/user_address_book_spec.rb +19 -12
- data/spec/models/spree/concerns/user_methods_spec.rb +1 -1
- data/spec/models/spree/country_spec.rb +52 -0
- data/spec/models/spree/credit_card_spec.rb +17 -12
- data/spec/models/spree/customer_return_spec.rb +27 -23
- data/spec/models/spree/exchange_spec.rb +2 -7
- data/spec/models/spree/gateway/bogus_simple.rb +2 -4
- data/spec/models/spree/gateway/bogus_spec.rb +4 -2
- data/spec/models/spree/gateway_spec.rb +8 -3
- data/spec/models/spree/inventory_unit_spec.rb +13 -14
- data/spec/models/spree/item_adjustments_spec.rb +36 -40
- data/spec/models/spree/line_item_spec.rb +92 -48
- data/spec/models/spree/option_type_spec.rb +1 -1
- data/spec/models/spree/option_value_spec.rb +1 -1
- data/spec/models/spree/order/address_spec.rb +1 -1
- data/spec/models/spree/order/callbacks_spec.rb +3 -3
- data/spec/models/spree/order/checkout_spec.rb +55 -48
- data/spec/models/spree/order/finalizing_spec.rb +8 -9
- data/spec/models/spree/order/payment_spec.rb +20 -20
- data/spec/models/spree/order/risk_assessment_spec.rb +1 -1
- data/spec/models/spree/order/state_machine_spec.rb +40 -131
- data/spec/models/spree/order/tax_spec.rb +11 -12
- data/spec/models/spree/order/totals_spec.rb +3 -3
- data/spec/models/spree/order/updating_spec.rb +2 -2
- data/spec/models/spree/order/validations_spec.rb +2 -2
- data/spec/models/spree/order_cancellations_spec.rb +1 -1
- data/spec/models/spree/order_capturing_spec.rb +1 -1
- data/spec/models/spree/order_contents_spec.rb +10 -11
- data/spec/models/spree/order_inventory_spec.rb +11 -11
- data/spec/models/spree/order_merger_spec.rb +1 -0
- data/spec/models/spree/order_shipping_spec.rb +8 -10
- data/spec/models/spree/order_spec.rb +137 -124
- data/spec/models/spree/order_stock_location_spec.rb +2 -2
- data/spec/models/spree/order_update_attributes_spec.rb +6 -10
- data/spec/models/spree/order_updater_spec.rb +4 -8
- data/spec/models/spree/payment_create_spec.rb +11 -12
- data/spec/models/spree/payment_method/store_credit_spec.rb +10 -6
- data/spec/models/spree/payment_method_spec.rb +4 -5
- data/spec/models/spree/payment_spec.rb +61 -69
- data/spec/models/spree/permission_sets/base_spec.rb +1 -1
- data/spec/models/spree/permission_sets/configuration_display.rb +0 -1
- data/spec/models/spree/permission_sets/configuration_management_spec.rb +0 -1
- data/spec/models/spree/permission_sets/dashboard_display_spec.rb +0 -1
- data/spec/models/spree/permission_sets/order_display_spec.rb +0 -1
- data/spec/models/spree/permission_sets/order_management_spec.rb +0 -1
- data/spec/models/spree/permission_sets/product_display_spec.rb +0 -1
- data/spec/models/spree/permission_sets/product_management_spec.rb +0 -1
- data/spec/models/spree/permission_sets/promotion_display_spec.rb +0 -1
- data/spec/models/spree/permission_sets/promotion_management_spec.rb +0 -1
- data/spec/models/spree/permission_sets/report_display_spec.rb +0 -1
- data/spec/models/spree/permission_sets/restricted_stock_display_spec.rb +0 -1
- data/spec/models/spree/permission_sets/restricted_stock_management_spec.rb +0 -1
- data/spec/models/spree/permission_sets/restricted_stock_transfer_display_spec.rb +0 -1
- data/spec/models/spree/permission_sets/restricted_stock_transfer_management_spec.rb +6 -6
- data/spec/models/spree/permission_sets/stock_display_spec.rb +0 -1
- data/spec/models/spree/permission_sets/stock_management_spec.rb +0 -1
- data/spec/models/spree/permission_sets/stock_transfer_display_spec.rb +0 -1
- data/spec/models/spree/permission_sets/stock_transfer_management_spec.rb +0 -2
- data/spec/models/spree/permission_sets/user_display_spec.rb +0 -1
- data/spec/models/spree/permission_sets/user_management_spec.rb +0 -1
- data/spec/models/spree/preference_spec.rb +1 -4
- data/spec/models/spree/preferences/configuration_spec.rb +2 -7
- data/spec/models/spree/preferences/preferable_spec.rb +13 -24
- data/spec/models/spree/preferences/scoped_store_spec.rb +1 -1
- data/spec/models/spree/preferences/static_model_preferences_spec.rb +5 -6
- data/spec/models/spree/preferences/statically_configurable_spec.rb +2 -6
- data/spec/models/spree/preferences/store_spec.rb +2 -3
- data/spec/models/spree/price_spec.rb +6 -6
- data/spec/models/spree/product/scopes_spec.rb +20 -20
- data/spec/models/spree/product_duplicator_spec.rb +16 -29
- data/spec/models/spree/product_filter_spec.rb +2 -2
- data/spec/models/spree/product_spec.rb +53 -20
- data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +10 -12
- data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +4 -4
- data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +9 -9
- data/spec/models/spree/promotion/actions/free_shipping_spec.rb +1 -1
- data/spec/models/spree/promotion/rules/first_order_spec.rb +10 -10
- data/spec/models/spree/promotion/rules/item_total_spec.rb +63 -19
- data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +1 -1
- data/spec/models/spree/promotion/rules/product_spec.rb +8 -8
- data/spec/models/spree/promotion/rules/taxon_spec.rb +4 -4
- data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +3 -4
- data/spec/models/spree/promotion/rules/user_spec.rb +7 -7
- data/spec/models/spree/promotion_builder_spec.rb +10 -8
- data/spec/models/spree/promotion_category_spec.rb +1 -1
- data/spec/models/spree/promotion_code/code_builder_spec.rb +1 -3
- data/spec/models/spree/promotion_code_spec.rb +8 -7
- data/spec/models/spree/promotion_handler/cart_spec.rb +1 -1
- data/spec/models/spree/promotion_handler/coupon_spec.rb +28 -28
- data/spec/models/spree/promotion_handler/page_spec.rb +6 -7
- data/spec/models/spree/promotion_rule_spec.rb +1 -2
- data/spec/models/spree/promotion_spec.rb +25 -21
- data/spec/models/spree/refund_spec.rb +8 -11
- data/spec/models/spree/reimbursement/credit_spec.rb +2 -2
- data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +6 -4
- data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +1 -1
- data/spec/models/spree/reimbursement_performer_spec.rb +2 -2
- data/spec/models/spree/reimbursement_spec.rb +9 -11
- data/spec/models/spree/reimbursement_tax_calculator_spec.rb +4 -5
- data/spec/models/spree/reimbursement_type/credit_spec.rb +2 -2
- data/spec/models/spree/reimbursement_type/exchange_spec.rb +2 -3
- data/spec/models/spree/reimbursement_type/original_payment_spec.rb +4 -4
- data/spec/models/spree/reimbursement_type/store_credit_spec.rb +1 -1
- data/spec/models/spree/return_authorization_spec.rb +18 -21
- data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +7 -7
- data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +0 -1
- data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +0 -1
- 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 +1 -1
- data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +1 -2
- data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +3 -5
- data/spec/models/spree/return_item_spec.rb +29 -31
- data/spec/models/spree/returns_calculator_spec.rb +1 -1
- data/spec/models/spree/shipment_spec.rb +59 -43
- data/spec/models/spree/shipping_calculator_spec.rb +3 -3
- data/spec/models/spree/shipping_manifest_spec.rb +8 -7
- data/spec/models/spree/shipping_method_spec.rb +149 -24
- data/spec/models/spree/shipping_rate_spec.rb +116 -76
- data/spec/models/spree/shipping_rate_tax_spec.rb +83 -0
- data/spec/models/spree/state_spec.rb +2 -2
- data/spec/models/spree/stock/availability_validator_spec.rb +4 -4
- data/spec/models/spree/stock/coordinator_spec.rb +33 -49
- data/spec/models/spree/stock/differentiator_spec.rb +1 -1
- data/spec/models/spree/stock/estimator_spec.rb +83 -54
- data/spec/models/spree/stock/inventory_unit_builder_spec.rb +1 -3
- data/spec/models/spree/stock/package_spec.rb +27 -10
- data/spec/models/spree/stock/packer_spec.rb +4 -4
- data/spec/models/spree/stock/prioritizer_spec.rb +1 -1
- data/spec/models/spree/stock/quantifier_spec.rb +2 -6
- data/spec/models/spree/stock/splitter/backordered_spec.rb +1 -1
- data/spec/models/spree/stock/splitter/base_spec.rb +1 -2
- data/spec/models/spree/stock/splitter/shipping_category_spec.rb +1 -3
- data/spec/models/spree/stock/splitter/weight_spec.rb +3 -3
- data/spec/models/spree/stock_item_spec.rb +16 -16
- data/spec/models/spree/stock_location_spec.rb +6 -8
- data/spec/models/spree/stock_movement_spec.rb +1 -1
- data/spec/models/spree/stock_transfer_spec.rb +1 -3
- data/spec/models/spree/store_credit_category_spec.rb +1 -1
- data/spec/models/spree/store_credit_event_spec.rb +3 -5
- data/spec/models/spree/store_credit_spec.rb +24 -23
- data/spec/models/spree/store_spec.rb +21 -2
- data/spec/models/spree/tax/item_adjuster_spec.rb +74 -0
- data/spec/models/spree/tax/order_adjuster_spec.rb +49 -0
- data/spec/models/spree/tax/shipping_rate_taxer_spec.rb +50 -0
- data/spec/models/spree/tax/tax_location_spec.rb +68 -0
- data/spec/models/spree/tax/taxation_integration_spec.rb +787 -0
- data/spec/models/spree/tax_category_spec.rb +2 -2
- data/spec/models/spree/tax_rate_spec.rb +185 -536
- data/spec/models/spree/taxon_spec.rb +69 -5
- data/spec/models/spree/taxonomy_spec.rb +2 -3
- data/spec/models/spree/tracker_spec.rb +1 -1
- data/spec/models/spree/transfer_item_spec.rb +1 -1
- data/spec/models/spree/unit_cancel_spec.rb +9 -14
- data/spec/models/spree/user_spec.rb +19 -24
- data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +1 -1
- data/spec/models/spree/variant/pricer_spec.rb +48 -0
- data/spec/models/spree/variant/pricing_options_spec.rb +106 -0
- data/spec/models/spree/variant/scopes_spec.rb +31 -8
- data/spec/models/spree/variant_property_rule_spec.rb +1 -1
- data/spec/models/spree/variant_spec.rb +166 -52
- data/spec/models/spree/zone_spec.rb +135 -10
- data/spec/support/big_decimal.rb +1 -1
- data/spec/support/concerns/working_factories.rb +2 -2
- data/spec/support/dummy_ability.rb +0 -1
- metadata +55 -44
- data/lib/generators/spree/dummy/templates/initializers/devise.rb +0 -3
- data/lib/spree/migration_helpers.rb +0 -19
- data/vendor/assets/stylesheets/skeleton.css +0 -242
data/app/models/spree/product.rb
CHANGED
@@ -48,7 +48,7 @@ module Spree
|
|
48
48
|
class_name: 'Spree::Variant',
|
49
49
|
dependent: :destroy
|
50
50
|
|
51
|
-
has_many :prices, -> { order(Spree::Variant.arel_table[:position].asc, Spree::Variant.arel_table[:id].asc, :currency) }, through: :
|
51
|
+
has_many :prices, -> { order(Spree::Variant.arel_table[:position].asc, Spree::Variant.arel_table[:id].asc, :currency) }, through: :variants_including_master
|
52
52
|
|
53
53
|
has_many :stock_items, through: :variants_including_master
|
54
54
|
|
@@ -59,7 +59,7 @@ module Spree
|
|
59
59
|
master || build_master
|
60
60
|
end
|
61
61
|
|
62
|
-
MASTER_ATTRIBUTES = [:sku, :price, :currency, :display_amount, :display_price, :weight, :height, :width, :depth, :cost_currency, :price_in, :amount_in, :cost_price]
|
62
|
+
MASTER_ATTRIBUTES = [:sku, :price, :currency, :display_amount, :display_price, :weight, :height, :width, :depth, :cost_currency, :price_in, :price_for, :amount_in, :cost_price]
|
63
63
|
MASTER_ATTRIBUTES.each do |attr|
|
64
64
|
delegate :"#{attr}", :"#{attr}=", to: :find_or_build_master
|
65
65
|
end
|
@@ -161,12 +161,16 @@ module Spree
|
|
161
161
|
|
162
162
|
# Groups variants by the specified option type.
|
163
163
|
#
|
164
|
+
# @deprecated This method is not called in the Solidus codebase
|
164
165
|
# @param opt_type [String] the name of the option type to group by
|
166
|
+
# @param pricing_options [Spree::Config.pricing_options_class] the pricing options to search
|
167
|
+
# for, default: the default pricing options
|
165
168
|
# @return [Hash] option_type as keys, array of variants as values.
|
166
|
-
def categorise_variants_from_option(opt_type)
|
169
|
+
def categorise_variants_from_option(opt_type, pricing_options = Spree::Config.default_pricing_options)
|
167
170
|
return {} unless option_types.include?(opt_type)
|
168
|
-
variants.
|
171
|
+
variants.with_prices(pricing_options).group_by { |v| v.option_values.detect { |o| o.option_type == opt_type } }
|
169
172
|
end
|
173
|
+
deprecate :categorise_variants_from_option, deprecator: Spree::Deprecation
|
170
174
|
|
171
175
|
# Poor man's full text search.
|
172
176
|
#
|
@@ -184,12 +188,24 @@ module Spree
|
|
184
188
|
end
|
185
189
|
|
186
190
|
# @param current_currency [String] currency to filter variants by; defaults to Spree's default
|
191
|
+
# @deprecated This method can only handle prices for currencies
|
187
192
|
# @return [Array<Spree::Variant>] all variants with at least one option value
|
188
193
|
def variants_and_option_values(current_currency = nil)
|
189
194
|
variants.includes(:option_values).active(current_currency).select do |variant|
|
190
195
|
variant.option_values.any?
|
191
196
|
end
|
192
197
|
end
|
198
|
+
deprecate variants_and_option_values: :variants_and_option_values_for,
|
199
|
+
deprecator: Spree::Deprecation
|
200
|
+
|
201
|
+
# @param pricing_options [Spree::Variant::PricingOptions] the pricing options to search
|
202
|
+
# for, default: the default pricing options
|
203
|
+
# @return [Array<Spree::Variant>] all variants with at least one option value
|
204
|
+
def variants_and_option_values_for(pricing_options = Spree::Config.default_pricing_options)
|
205
|
+
variants.includes(:option_values).with_prices(pricing_options).select do |variant|
|
206
|
+
variant.option_values.any?
|
207
|
+
end
|
208
|
+
end
|
193
209
|
|
194
210
|
# Groups all of the option values that are associated to the product's variants, grouped by
|
195
211
|
# option type.
|
@@ -199,10 +215,10 @@ module Spree
|
|
199
215
|
# @return [Hash<Spree::OptionType, Array<Spree::OptionValue>>] all option types and option values
|
200
216
|
# associated with the products variants grouped by option type
|
201
217
|
def variant_option_values_by_option_type(variant_scope = nil)
|
202
|
-
|
203
|
-
.where(spree_variants: { product_id:
|
204
|
-
|
205
|
-
|
218
|
+
option_value_scope = Spree::OptionValuesVariant.joins(:variant)
|
219
|
+
.where(spree_variants: { product_id: id })
|
220
|
+
option_value_scope = option_value_scope.merge(variant_scope) if variant_scope
|
221
|
+
option_value_ids = option_value_scope.distinct.pluck(:option_value_id)
|
206
222
|
Spree::OptionValue.where(id: option_value_ids).
|
207
223
|
includes(:option_type).
|
208
224
|
order("#{Spree::OptionType.table_name}.position, #{Spree::OptionValue.table_name}.position").
|
@@ -319,14 +335,15 @@ module Spree
|
|
319
335
|
end
|
320
336
|
|
321
337
|
def punch_slug
|
322
|
-
|
338
|
+
# punch slug with date prefix to allow reuse of original
|
339
|
+
update_column :slug, "#{Time.current.to_i}_#{slug}" unless frozen?
|
323
340
|
end
|
324
341
|
|
325
342
|
# If the master is invalid, the Product object will be assigned its errors
|
326
343
|
def validate_master
|
327
344
|
unless master.valid?
|
328
345
|
master.errors.each do |att, error|
|
329
|
-
|
346
|
+
errors.add(att, error)
|
330
347
|
end
|
331
348
|
end
|
332
349
|
end
|
@@ -354,7 +371,7 @@ module Spree
|
|
354
371
|
|
355
372
|
def remove_taxon(taxon)
|
356
373
|
removed_classifications = classifications.where(taxon: taxon)
|
357
|
-
removed_classifications.each
|
374
|
+
removed_classifications.each(&:remove_from_list)
|
358
375
|
end
|
359
376
|
end
|
360
377
|
end
|
@@ -2,6 +2,8 @@ module Spree
|
|
2
2
|
class ProductProperty < Spree::Base
|
3
3
|
include Spree::OrderedPropertyValueList
|
4
4
|
|
5
|
+
acts_as_list scope: :product
|
6
|
+
|
5
7
|
belongs_to :product, touch: true, class_name: 'Spree::Product', inverse_of: :product_properties
|
6
8
|
belongs_to :property, class_name: 'Spree::Property', inverse_of: :product_properties
|
7
9
|
|
@@ -1,45 +1,45 @@
|
|
1
1
|
module Spree
|
2
2
|
class ProductScope < Spree::Base
|
3
|
-
before_validation(:
|
3
|
+
before_validation(on: :create) do
|
4
4
|
# Add default empty arguments so scope validates and errors aren't caused when previewing it
|
5
5
|
if name && args = self.class.arguments_for_scope_name(name)
|
6
|
-
self.arguments ||= ['']*args.length
|
6
|
+
self.arguments ||= [''] * args.length
|
7
7
|
end
|
8
8
|
end
|
9
9
|
|
10
10
|
def self.all_scopes
|
11
11
|
{
|
12
12
|
# Scopes for selecting products based on taxon
|
13
|
-
:
|
14
|
-
:
|
15
|
-
:
|
13
|
+
taxon: {
|
14
|
+
taxons_name_eq: [:taxon_name],
|
15
|
+
in_taxons: [:taxon_names]
|
16
16
|
},
|
17
17
|
# product selection based on name, or search
|
18
|
-
:
|
19
|
-
:
|
20
|
-
:
|
21
|
-
:
|
22
|
-
:
|
18
|
+
search: {
|
19
|
+
in_name: [:words],
|
20
|
+
in_name_or_keywords: [:words],
|
21
|
+
in_name_or_description: [:words],
|
22
|
+
with_ids: [:ids]
|
23
23
|
},
|
24
24
|
# Scopes for selecting products based on option types and properties
|
25
|
-
:
|
26
|
-
:
|
27
|
-
:
|
28
|
-
:
|
29
|
-
:
|
30
|
-
:
|
25
|
+
values: {
|
26
|
+
with: [:value],
|
27
|
+
with_property: [:property],
|
28
|
+
with_property_value: [:property, :value],
|
29
|
+
with_option: [:option],
|
30
|
+
with_option_value: [:option, :value]
|
31
31
|
},
|
32
32
|
# product selection based upon master price
|
33
|
-
:
|
34
|
-
:
|
35
|
-
:
|
36
|
-
:
|
37
|
-
}
|
33
|
+
price: {
|
34
|
+
price_between: [:low, :high],
|
35
|
+
master_price_lte: [:amount],
|
36
|
+
master_price_gte: [:amount]
|
37
|
+
}
|
38
38
|
}
|
39
39
|
end
|
40
40
|
|
41
41
|
def self.arguments_for_scope_name(name)
|
42
|
-
if group = all_scopes.detect { |
|
42
|
+
if group = all_scopes.detect { |_k, v| v[name.to_sym] }
|
43
43
|
group[1][name.to_sym]
|
44
44
|
end
|
45
45
|
end
|
@@ -22,7 +22,6 @@ module Spree
|
|
22
22
|
return if promotion_credit_exists?(order)
|
23
23
|
|
24
24
|
amount = compute_amount(order)
|
25
|
-
return if amount == 0
|
26
25
|
Spree::Adjustment.create!(
|
27
26
|
amount: amount,
|
28
27
|
order: order,
|
@@ -37,7 +36,7 @@ module Spree
|
|
37
36
|
# Ensure a negative amount which does not exceed the sum of the order's
|
38
37
|
# item_total and ship_total
|
39
38
|
def compute_amount(calculable)
|
40
|
-
amount =
|
39
|
+
amount = calculator.compute(calculable).to_f.abs
|
41
40
|
[(calculable.item_total + calculable.ship_total), amount].min * -1
|
42
41
|
end
|
43
42
|
|
@@ -50,11 +49,11 @@ module Spree
|
|
50
49
|
# Receives an adjustment +source+ (here a PromotionAction object) and tells
|
51
50
|
# if the order has adjustments from that already
|
52
51
|
def promotion_credit_exists?(adjustable)
|
53
|
-
|
52
|
+
adjustments.where(adjustable_id: adjustable.id).exists?
|
54
53
|
end
|
55
54
|
|
56
55
|
def ensure_action_has_calculator
|
57
|
-
return if
|
56
|
+
return if calculator
|
58
57
|
self.calculator = Calculator::FlatPercentItemTotal.new
|
59
58
|
end
|
60
59
|
end
|
@@ -23,7 +23,7 @@ module Spree
|
|
23
23
|
current_result = create_adjustment(line_item, order, promotion_code)
|
24
24
|
result ||= current_result
|
25
25
|
end
|
26
|
-
|
26
|
+
result
|
27
27
|
end
|
28
28
|
|
29
29
|
# Ensure a negative amount which does not exceed the sum of the order's
|
@@ -31,21 +31,21 @@ module Spree
|
|
31
31
|
def compute_amount(adjustable)
|
32
32
|
order = adjustable.is_a?(Order) ? adjustable : adjustable.order
|
33
33
|
return 0 unless promotion.line_item_actionable?(order, adjustable)
|
34
|
-
promotion_amount =
|
34
|
+
promotion_amount = calculator.compute(adjustable).to_f.abs
|
35
35
|
[adjustable.amount, promotion_amount].min * -1
|
36
36
|
end
|
37
37
|
|
38
38
|
private
|
39
39
|
|
40
40
|
def create_adjustment(adjustable, order, promotion_code)
|
41
|
-
amount =
|
41
|
+
amount = compute_amount(adjustable)
|
42
42
|
return if amount == 0
|
43
|
-
|
43
|
+
adjustments.create!(
|
44
44
|
amount: amount,
|
45
45
|
adjustable: adjustable,
|
46
46
|
order: order,
|
47
47
|
promotion_code: promotion_code,
|
48
|
-
label: "#{Spree.t(:promotion)} (#{promotion.name})"
|
48
|
+
label: "#{Spree.t(:promotion)} (#{promotion.name})"
|
49
49
|
)
|
50
50
|
true
|
51
51
|
end
|
@@ -57,16 +57,16 @@ module Spree
|
|
57
57
|
# Receives an adjustment +source+ (here a PromotionAction object) and tells
|
58
58
|
# if the order has adjustments from that already
|
59
59
|
def promotion_credit_exists?(adjustable)
|
60
|
-
|
60
|
+
adjustments.where(adjustable_id: adjustable.id).exists?
|
61
61
|
end
|
62
62
|
|
63
63
|
def ensure_action_has_calculator
|
64
|
-
return if
|
64
|
+
return if calculator
|
65
65
|
self.calculator = Calculator::PercentOnLineItem.new
|
66
66
|
end
|
67
67
|
|
68
68
|
def line_items_to_adjust(promotion, order)
|
69
|
-
excluded_ids =
|
69
|
+
excluded_ids = adjustments.
|
70
70
|
where(adjustable_id: order.line_items.pluck(:id), adjustable_type: 'Spree::LineItem').
|
71
71
|
pluck(:adjustable_id)
|
72
72
|
|
@@ -59,7 +59,7 @@ module Spree::Promotion::Actions
|
|
59
59
|
order = line_item.order
|
60
60
|
line_items = actionable_line_items(order)
|
61
61
|
|
62
|
-
actioned_line_items = order.line_item_adjustments
|
62
|
+
actioned_line_items = order.line_item_adjustments.reload.
|
63
63
|
select { |a| a.source == self && a.amount < 0 }.
|
64
64
|
map(&:adjustable)
|
65
65
|
other_line_items = actioned_line_items - [line_item]
|
@@ -71,7 +71,7 @@ module Spree::Promotion::Actions
|
|
71
71
|
line_item.quantity
|
72
72
|
].min
|
73
73
|
|
74
|
-
persist_quantity(usable_quantity,
|
74
|
+
persist_quantity(usable_quantity, line_item)
|
75
75
|
|
76
76
|
amount = adjustment_amount * usable_quantity
|
77
77
|
[line_item.amount, amount].min * -1
|
@@ -80,7 +80,7 @@ module Spree::Promotion::Actions
|
|
80
80
|
private
|
81
81
|
|
82
82
|
def actionable_line_items(order)
|
83
|
-
order.line_items
|
83
|
+
order.line_items.reload.select do |item|
|
84
84
|
promotion.line_item_actionable? order, item
|
85
85
|
end
|
86
86
|
end
|
@@ -2,7 +2,7 @@ module Spree
|
|
2
2
|
class Promotion
|
3
3
|
module Actions
|
4
4
|
class FreeShipping < Spree::PromotionAction
|
5
|
-
def perform(payload={})
|
5
|
+
def perform(payload = {})
|
6
6
|
order = payload[:order]
|
7
7
|
promotion_code = payload[:promotion_code]
|
8
8
|
|
@@ -13,7 +13,7 @@ module Spree
|
|
13
13
|
amount: compute_amount(shipment),
|
14
14
|
source: self,
|
15
15
|
promotion_code: promotion_code,
|
16
|
-
label: label
|
16
|
+
label: label
|
17
17
|
)
|
18
18
|
true
|
19
19
|
end
|
@@ -33,9 +33,9 @@ module Spree
|
|
33
33
|
private
|
34
34
|
|
35
35
|
def promotion_credit_exists?(shipment)
|
36
|
-
shipment.adjustments.where(:
|
36
|
+
shipment.adjustments.where(source_id: id).exists?
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
40
40
|
end
|
41
|
-
end
|
41
|
+
end
|
@@ -24,13 +24,14 @@ module Spree
|
|
24
24
|
end
|
25
25
|
|
26
26
|
private
|
27
|
-
def completed_orders
|
28
|
-
user ? user.orders.complete : orders_by_email
|
29
|
-
end
|
30
27
|
|
31
|
-
|
32
|
-
|
33
|
-
|
28
|
+
def completed_orders
|
29
|
+
user ? user.orders.complete : orders_by_email
|
30
|
+
end
|
31
|
+
|
32
|
+
def orders_by_email
|
33
|
+
Spree::Order.where(email: email).complete
|
34
|
+
end
|
34
35
|
end
|
35
36
|
end
|
36
37
|
end
|
@@ -15,7 +15,7 @@ module Spree
|
|
15
15
|
# This is eligible if the user's most recently completed order is more than the preferred days ago
|
16
16
|
# @param order [Spree::Order]
|
17
17
|
# @option options
|
18
|
-
def eligible?(order,
|
18
|
+
def eligible?(order, _options = {})
|
19
19
|
return false unless order.user
|
20
20
|
|
21
21
|
last_order = last_completed_order(order.user)
|
@@ -26,11 +26,10 @@ module Spree
|
|
26
26
|
|
27
27
|
private
|
28
28
|
|
29
|
-
def last_completed_order
|
29
|
+
def last_completed_order(user)
|
30
30
|
user.orders.complete.order(:completed_at).last
|
31
31
|
end
|
32
32
|
end
|
33
33
|
end
|
34
34
|
end
|
35
35
|
end
|
36
|
-
|
@@ -5,6 +5,7 @@ module Spree
|
|
5
5
|
# a specific amount
|
6
6
|
class ItemTotal < PromotionRule
|
7
7
|
preference :amount, :decimal, default: 100.00
|
8
|
+
preference :currency, :string, default: ->{ Spree::Config[:currency] }
|
8
9
|
preference :operator, :string, default: '>'
|
9
10
|
|
10
11
|
OPERATORS = ['gt', 'gte']
|
@@ -13,7 +14,8 @@ module Spree
|
|
13
14
|
promotable.is_a?(Spree::Order)
|
14
15
|
end
|
15
16
|
|
16
|
-
def eligible?(order,
|
17
|
+
def eligible?(order, _options = {})
|
18
|
+
return false unless order.currency == preferred_currency
|
17
19
|
item_total = order.item_total
|
18
20
|
unless item_total.send(preferred_operator == 'gte' ? :>= : :>, BigDecimal.new(preferred_amount.to_s))
|
19
21
|
eligibility_errors.add(:base, ineligible_message)
|
@@ -23,8 +25,9 @@ module Spree
|
|
23
25
|
end
|
24
26
|
|
25
27
|
private
|
28
|
+
|
26
29
|
def formatted_amount
|
27
|
-
Spree::Money.new(preferred_amount).to_s
|
30
|
+
Spree::Money.new(preferred_amount, currency: preferred_currency).to_s
|
28
31
|
end
|
29
32
|
|
30
33
|
def ineligible_message
|
@@ -17,7 +17,7 @@ module Spree
|
|
17
17
|
# Use the first order rule if you want a promotion to be applied to the first order for a user.
|
18
18
|
# @param order [Spree::Order]
|
19
19
|
# @option options
|
20
|
-
def eligible?(order,
|
20
|
+
def eligible?(order, _options = {})
|
21
21
|
return false unless order.user
|
22
22
|
|
23
23
|
nth_order?(order)
|
@@ -25,7 +25,7 @@ module Spree
|
|
25
25
|
|
26
26
|
private
|
27
27
|
|
28
|
-
def completed_order_count
|
28
|
+
def completed_order_count(order)
|
29
29
|
order.
|
30
30
|
user.
|
31
31
|
orders.
|
@@ -34,7 +34,7 @@ module Spree
|
|
34
34
|
count
|
35
35
|
end
|
36
36
|
|
37
|
-
def nth_order?
|
37
|
+
def nth_order?(order)
|
38
38
|
count = completed_order_count(order) + 1
|
39
39
|
count == preferred_nth_order
|
40
40
|
end
|
@@ -42,4 +42,3 @@ module Spree
|
|
42
42
|
end
|
43
43
|
end
|
44
44
|
end
|
45
|
-
|
@@ -6,7 +6,7 @@ module Spree
|
|
6
6
|
promotable.is_a?(Spree::Order)
|
7
7
|
end
|
8
8
|
|
9
|
-
def eligible?(order,
|
9
|
+
def eligible?(order, _options = {})
|
10
10
|
if order.user.present?
|
11
11
|
if promotion.used_by?(order.user, [order])
|
12
12
|
eligibility_errors.add(:base, eligibility_error_message(:limit_once_per_user))
|
@@ -21,4 +21,3 @@ module Spree
|
|
21
21
|
end
|
22
22
|
end
|
23
23
|
end
|
24
|
-
|
@@ -10,7 +10,7 @@ module Spree
|
|
10
10
|
promotable.is_a?(Spree::Order)
|
11
11
|
end
|
12
12
|
|
13
|
-
def eligible?(promotable,
|
13
|
+
def eligible?(promotable, _options = {})
|
14
14
|
case preferred_match_policy
|
15
15
|
when 'any'
|
16
16
|
promotable.line_items.any? { |item| actionable?(item) }
|
@@ -18,7 +18,6 @@ module Spree
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def actionable?(line_item)
|
21
|
-
|
22
21
|
pid = line_item.product.id
|
23
22
|
ovids = line_item.variant.option_values.pluck(:id)
|
24
23
|
|
@@ -22,19 +22,19 @@ module Spree
|
|
22
22
|
promotable.is_a?(Spree::Order)
|
23
23
|
end
|
24
24
|
|
25
|
-
def eligible?(order,
|
25
|
+
def eligible?(order, _options = {})
|
26
26
|
return true if eligible_products.empty?
|
27
27
|
|
28
28
|
if preferred_match_policy == 'all'
|
29
|
-
unless eligible_products.all? {|p| order.products.include?(p) }
|
29
|
+
unless eligible_products.all? { |p| order.products.include?(p) }
|
30
30
|
eligibility_errors.add(:base, eligibility_error_message(:missing_product))
|
31
31
|
end
|
32
32
|
elsif preferred_match_policy == 'any'
|
33
|
-
unless order.products.any? {|p| eligible_products.include?(p) }
|
33
|
+
unless order.products.any? { |p| eligible_products.include?(p) }
|
34
34
|
eligibility_errors.add(:base, eligibility_error_message(:no_applicable_products))
|
35
35
|
end
|
36
36
|
else
|
37
|
-
unless order.products.none? {|p| eligible_products.include?(p) }
|
37
|
+
unless order.products.none? { |p| eligible_products.include?(p) }
|
38
38
|
eligibility_errors.add(:base, eligibility_error_message(:has_excluded_product))
|
39
39
|
end
|
40
40
|
end
|
@@ -12,7 +12,7 @@ module Spree
|
|
12
12
|
promotable.is_a?(Spree::Order)
|
13
13
|
end
|
14
14
|
|
15
|
-
def eligible?(order,
|
15
|
+
def eligible?(order, _options = {})
|
16
16
|
if preferred_match_policy == 'all'
|
17
17
|
unless (taxons.to_a - taxons_in_order_including_parents(order)).empty?
|
18
18
|
eligibility_errors.add(:base, eligibility_error_message(:missing_taxon))
|
@@ -44,12 +44,12 @@ module Spree
|
|
44
44
|
|
45
45
|
# All taxons in an order
|
46
46
|
def order_taxons(order)
|
47
|
-
Spree::Taxon.joins(products: {variants_including_master: :line_items}).where(spree_line_items: {order_id: order.id}).
|
47
|
+
Spree::Taxon.joins(products: { variants_including_master: :line_items }).where(spree_line_items: { order_id: order.id }).distinct
|
48
48
|
end
|
49
49
|
|
50
50
|
# ids of taxons rules and taxons rules children
|
51
51
|
def taxons_including_children_ids
|
52
|
-
taxons.
|
52
|
+
taxons.flat_map { |taxon| taxon.self_and_descendants.ids }
|
53
53
|
end
|
54
54
|
|
55
55
|
# taxons order vs taxons rules and taxons rules children
|
@@ -58,11 +58,11 @@ module Spree
|
|
58
58
|
end
|
59
59
|
|
60
60
|
def taxons_in_order_including_parents(order)
|
61
|
-
order_taxons_in_taxons_and_children(order).
|
61
|
+
order_taxons_in_taxons_and_children(order).flat_map(&:self_and_ancestors).uniq
|
62
62
|
end
|
63
63
|
|
64
64
|
def taxon_product_ids
|
65
|
-
Spree::Product.joins(:taxons).where(spree_taxons: {id: taxons.pluck(:id)}).pluck(:id).uniq
|
65
|
+
Spree::Product.joins(:taxons).where(spree_taxons: { id: taxons.pluck(:id) }).pluck(:id).uniq
|
66
66
|
end
|
67
67
|
end
|
68
68
|
end
|
@@ -35,12 +35,12 @@ module Spree
|
|
35
35
|
scope :coupons, -> { where.not(code: nil) }
|
36
36
|
scope :advertised, -> { where(advertise: true) }
|
37
37
|
scope :active, -> do
|
38
|
-
table =
|
38
|
+
table = arel_table
|
39
39
|
time = Time.current
|
40
40
|
where(table[:starts_at].eq(nil).or(table[:starts_at].lt(time))).
|
41
41
|
where(table[:expires_at].eq(nil).or(table[:expires_at].gt(time)))
|
42
42
|
end
|
43
|
-
scope :applied, -> { joins(:order_promotions).
|
43
|
+
scope :applied, -> { joins(:order_promotions).distinct }
|
44
44
|
|
45
45
|
self.whitelisted_ransackable_associations = ['codes']
|
46
46
|
self.whitelisted_ransackable_attributes = ['path', 'promotion_category_id']
|
@@ -58,7 +58,7 @@ module Spree
|
|
58
58
|
raise "Attempted to call code on a Spree::Promotion. Promotions are now tied to multiple code records"
|
59
59
|
end
|
60
60
|
|
61
|
-
def code=(
|
61
|
+
def code=(_val)
|
62
62
|
raise "Attempted to call code= on a Spree::Promotion. Promotions are now tied to multiple code records"
|
63
63
|
end
|
64
64
|
|
@@ -68,7 +68,7 @@ module Spree
|
|
68
68
|
).first
|
69
69
|
end
|
70
70
|
|
71
|
-
def as_json(options={})
|
71
|
+
def as_json(options = {})
|
72
72
|
options[:except] ||= :code
|
73
73
|
super
|
74
74
|
end
|
@@ -91,7 +91,7 @@ module Spree
|
|
91
91
|
line_item: line_item,
|
92
92
|
user: user,
|
93
93
|
path: path,
|
94
|
-
promotion_code: promotion_code
|
94
|
+
promotion_code: promotion_code
|
95
95
|
}
|
96
96
|
|
97
97
|
# Track results from actions to see if any action has been taken.
|
@@ -107,11 +107,11 @@ module Spree
|
|
107
107
|
# connect to the order
|
108
108
|
order_promotions.find_or_create_by!(
|
109
109
|
order_id: order.id,
|
110
|
-
promotion_code_id: promotion_code.try!(:id)
|
110
|
+
promotion_code_id: promotion_code.try!(:id)
|
111
111
|
)
|
112
112
|
end
|
113
113
|
|
114
|
-
|
114
|
+
action_taken
|
115
115
|
end
|
116
116
|
|
117
117
|
# called anytime order.update! happens
|
@@ -218,7 +218,7 @@ module Spree
|
|
218
218
|
!promotable.product.promotionable?
|
219
219
|
when Spree::Order
|
220
220
|
promotable.line_items.any? &&
|
221
|
-
promotable.line_items.joins(:product).where(spree_products: {promotionable: false}).any?
|
221
|
+
promotable.line_items.joins(:product).where(spree_products: { promotionable: false }).any?
|
222
222
|
end
|
223
223
|
end
|
224
224
|
|
@@ -16,7 +16,7 @@ module Spree
|
|
16
16
|
# user based actions to be performed in addition to actions on the order
|
17
17
|
#
|
18
18
|
# @note This method should be overriden in subclassses.
|
19
|
-
def perform(
|
19
|
+
def perform(_options = {})
|
20
20
|
raise 'perform should be implemented in a sub-class of PromotionAction'
|
21
21
|
end
|
22
22
|
end
|
@@ -16,7 +16,7 @@ class Spree::PromotionBuilder
|
|
16
16
|
# @param promotion_attrs [Hash] The desired attributes for the newly promotion
|
17
17
|
# @param attributes [Hash] The desired attributes for this builder
|
18
18
|
# @param user [Spree::User] The user who triggered this promotion build
|
19
|
-
def initialize(attributes={}, promotion_attributes={})
|
19
|
+
def initialize(attributes = {}, promotion_attributes = {})
|
20
20
|
@promotion = Spree::Promotion.new(promotion_attributes)
|
21
21
|
super(attributes)
|
22
22
|
end
|
@@ -31,7 +31,7 @@ class Spree::PromotionBuilder
|
|
31
31
|
@promotion.save
|
32
32
|
end
|
33
33
|
|
34
|
-
def number_of_codes=
|
34
|
+
def number_of_codes=(value)
|
35
35
|
@number_of_codes = value.presence.try(:to_i)
|
36
36
|
end
|
37
37
|
|
@@ -10,7 +10,7 @@ class ::Spree::PromotionCode::CodeBuilder
|
|
10
10
|
# +promotion+ Must be a Spree::Promotion.
|
11
11
|
# +base_code+ Must be a String.
|
12
12
|
# +num_codes+ Must be a positive integer greater than zero.
|
13
|
-
def initialize
|
13
|
+
def initialize(promotion, base_code, num_codes)
|
14
14
|
@base_code = base_code
|
15
15
|
@num_codes = num_codes
|
16
16
|
@promotion = promotion
|
@@ -36,8 +36,8 @@ class ::Spree::PromotionCode::CodeBuilder
|
|
36
36
|
def generate_random_codes
|
37
37
|
valid_codes = Set.new
|
38
38
|
|
39
|
-
while valid_codes.size < num_codes
|
40
|
-
new_codes = num_codes
|
39
|
+
while valid_codes.size < num_codes
|
40
|
+
new_codes = Array.new(num_codes) { generate_random_code }.to_set
|
41
41
|
valid_codes += get_unique_codes(new_codes)
|
42
42
|
end
|
43
43
|
|