solidus_core 1.2.3 → 1.3.0.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +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
|
|