spree_core 3.1.14 → 3.2.0.rc1
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/app/assets/javascripts/{spree.js.coffee.erb → spree.js.coffee} +2 -2
- data/app/helpers/spree/base_helper.rb +1 -1
- data/app/helpers/spree/products_helper.rb +0 -6
- data/app/mailers/spree/reimbursement_mailer.rb +6 -6
- data/app/models/concerns/spree/acts_as_taggable.rb +11 -0
- data/app/models/concerns/spree/adjustment_source.rb +1 -1
- data/app/models/concerns/spree/ransackable_attributes.rb +0 -5
- data/app/models/spree/address.rb +67 -38
- data/app/models/spree/app_configuration.rb +9 -6
- data/app/models/spree/base.rb +1 -1
- data/app/models/spree/calculator.rb +1 -1
- data/app/models/spree/country.rb +5 -4
- data/app/models/spree/credit_card.rb +3 -3
- data/app/models/spree/gateway/bogus.rb +11 -11
- data/app/models/spree/gateway/bogus_simple.rb +4 -4
- data/app/models/spree/gateway.rb +1 -1
- data/app/models/spree/image.rb +2 -2
- data/app/models/spree/inventory_unit.rb +6 -10
- data/app/models/spree/line_item.rb +17 -6
- data/app/models/spree/order/checkout.rb +2 -2
- data/app/models/spree/order.rb +12 -25
- data/app/models/spree/order_contents.rb +7 -6
- data/app/models/spree/order_inventory.rb +12 -1
- data/app/models/spree/order_updater.rb +1 -2
- data/app/models/spree/payment/processing.rb +3 -3
- data/app/models/spree/payment_method.rb +7 -1
- data/app/models/spree/preferences/store.rb +3 -3
- data/app/models/spree/product/scopes.rb +16 -20
- data/app/models/spree/product.rb +11 -3
- data/app/models/spree/promotion/actions/create_line_items.rb +21 -3
- data/app/models/spree/promotion/rules/country.rb +23 -0
- data/app/models/spree/promotion/rules/option_value.rb +13 -10
- data/app/models/spree/promotion/rules/taxon.rb +1 -1
- data/app/models/spree/promotion.rb +35 -1
- data/app/models/spree/promotion_handler/cart.rb +3 -17
- data/app/models/spree/promotion_handler/coupon.rb +22 -22
- data/app/models/spree/promotion_handler/page.rb +2 -2
- data/app/models/spree/refund.rb +1 -1
- data/app/models/spree/refund_reason.rb +1 -1
- data/app/models/spree/reimbursement_type.rb +5 -1
- data/app/models/spree/return_item.rb +1 -1
- data/app/models/spree/shipment.rb +4 -6
- data/app/models/spree/shipment_handler.rb +1 -1
- data/app/models/spree/stock/adjuster.rb +9 -2
- data/app/models/spree/stock/coordinator.rb +11 -4
- data/app/models/spree/stock/inventory_unit_builder.rb +1 -1
- data/app/models/spree/stock/package.rb +11 -3
- data/app/models/spree/stock/packer.rb +15 -5
- data/app/models/spree/stock/prioritizer.rb +25 -15
- data/app/models/spree/stock/splitter/shipping_category.rb +6 -1
- data/app/models/spree/stock_item.rb +2 -1
- data/app/models/spree/stock_movement.rb +11 -6
- data/app/models/spree/store.rb +1 -0
- data/app/models/spree/store_credit.rb +1 -1
- data/app/models/spree/tag.rb +4 -0
- data/app/models/spree/tax_rate.rb +6 -0
- data/app/models/spree/taxon.rb +3 -3
- data/app/models/spree/variant.rb +6 -3
- data/app/models/spree/zone.rb +2 -2
- data/app/views/spree/shared/_paths.html.erb +8 -0
- data/config/initializers/acts_as_taggable_on.rb +9 -0
- data/config/initializers/friendly_id.rb +0 -81
- data/config/locales/en.yml +11 -0
- data/db/default/spree/countries.rb +5 -1
- data/db/default/spree/roles.rb +2 -2
- data/db/default/spree/states.rb +1 -1
- data/db/migrate/20120831092320_spree_one_two.rb +101 -101
- data/db/migrate/20120831092359_spree_promo_one_two.rb +14 -14
- data/db/migrate/20120905145253_add_tax_rate_label.rb +1 -1
- data/db/migrate/20120905151823_add_toggle_tax_rate_display.rb +2 -2
- data/db/migrate/20120929093553_remove_unused_preference_columns.rb +4 -4
- data/db/migrate/20121009142519_add_lock_version_to_variant.rb +2 -2
- data/db/migrate/20121010142909_add_states_required_to_countries.rb +2 -2
- data/db/migrate/20121012071449_add_on_demand_to_product_and_variant.rb +3 -3
- data/db/migrate/20121017010007_remove_not_null_constraint_from_products_on_hand.rb +5 -5
- data/db/migrate/20121031162139_split_prices_from_variants.rb +10 -10
- data/db/migrate/20121107003422_remove_not_null_from_spree_prices_amount.rb +3 -3
- data/db/migrate/20121107184631_add_currency_to_line_items.rb +1 -1
- data/db/migrate/20121107194006_add_currency_to_orders.rb +1 -1
- data/db/migrate/20121109173623_add_cost_currency_to_variants.rb +2 -2
- data/db/migrate/20121111231553_remove_display_on_from_payment_methods.rb +1 -1
- data/db/migrate/20121124203911_add_position_to_taxonomies.rb +2 -2
- data/db/migrate/20121126040517_add_last_ip_to_spree_orders.rb +1 -1
- data/db/migrate/20121213162028_add_state_to_spree_adjustments.rb +1 -1
- data/db/migrate/20130114053446_add_display_on_to_spree_payment_methods.rb +1 -1
- data/db/migrate/20130120201805_add_position_to_product_properties.spree.rb +2 -2
- data/db/migrate/20130203232234_add_identifier_to_spree_payments.rb +1 -1
- data/db/migrate/20130207155350_add_order_id_index_to_payments.rb +1 -1
- data/db/migrate/20130208032954_add_primary_to_spree_products_taxons.rb +1 -1
- data/db/migrate/20130211190146_create_spree_stock_items.rb +2 -2
- data/db/migrate/20130211191120_create_spree_stock_locations.rb +1 -1
- data/db/migrate/20130213191427_create_default_stock.rb +1 -2
- data/db/migrate/20130222032153_add_order_id_index_to_shipments.rb +1 -1
- data/db/migrate/20130226032817_change_meta_description_on_spree_products_to_text.rb +2 -2
- data/db/migrate/20130226191231_add_stock_location_id_to_spree_shipments.rb +1 -1
- data/db/migrate/20130227143905_add_pending_to_inventory_unit.rb +3 -3
- data/db/migrate/20130228164411_remove_on_demand_from_product_and_variant.rb +1 -1
- data/db/migrate/20130228210442_create_shipping_method_zone.rb +3 -3
- data/db/migrate/20130301162745_remove_shipping_category_id_from_shipping_method.rb +1 -1
- data/db/migrate/20130301162924_create_shipping_method_categories.rb +3 -3
- data/db/migrate/20130301205200_add_tracking_url_to_spree_shipping_methods.rb +1 -1
- data/db/migrate/20130304162240_create_spree_shipping_rates.rb +5 -5
- data/db/migrate/20130304192936_remove_category_match_attributes_from_shipping_method.rb +1 -1
- data/db/migrate/20130305143310_create_stock_movements.rb +1 -1
- data/db/migrate/20130306181701_add_address_fields_to_stock_location.rb +3 -3
- data/db/migrate/20130306191917_add_active_field_to_stock_locations.rb +2 -2
- data/db/migrate/20130306195650_add_backorderable_to_stock_item.rb +2 -2
- data/db/migrate/20130307161754_add_default_quantity_to_stock_movement.rb +2 -2
- data/db/migrate/20130318151756_add_source_and_destination_to_stock_movements.rb +1 -1
- data/db/migrate/20130319062004_change_orders_total_precision.rb +5 -5
- data/db/migrate/20130319063911_change_spree_payments_amount_precision.rb +2 -2
- data/db/migrate/20130319064308_change_spree_return_authorization_amount_precision.rb +2 -2
- data/db/migrate/20130319082943_change_adjustments_amount_precision.rb +2 -2
- data/db/migrate/20130319183250_add_originator_to_stock_movement.rb +1 -1
- data/db/migrate/20130319190507_drop_source_and_destination_from_stock_movement.rb +3 -3
- data/db/migrate/20130325163316_migrate_inventory_unit_sold_to_on_hand.rb +3 -3
- data/db/migrate/20130326175857_add_stock_location_to_rma.rb +1 -1
- data/db/migrate/20130328130308_update_shipment_state_for_canceled_orders.rb +1 -1
- data/db/migrate/20130328195253_add_seo_metas_to_taxons.rb +1 -1
- data/db/migrate/20130329134939_remove_stock_item_and_variant_lock.rb +1 -1
- data/db/migrate/20130413230529_add_name_to_spree_credit_cards.rb +1 -1
- data/db/migrate/20130414000512_update_name_fields_on_spree_credit_cards.rb +2 -2
- data/db/migrate/20130417120034_add_index_to_source_columns_on_adjustments.rb +1 -1
- data/db/migrate/20130417120035_update_adjustment_states.rb +3 -3
- data/db/migrate/20130417123427_add_shipping_rates_to_shipments.rb +4 -4
- data/db/migrate/20130418125341_create_spree_stock_transfers.rb +1 -1
- data/db/migrate/20130423110707_drop_products_count_on_hand.rb +1 -1
- data/db/migrate/20130423223847_set_default_shipping_rate_cost.rb +1 -1
- data/db/migrate/20130509115210_add_number_to_stock_transfer.rb +1 -1
- data/db/migrate/20130514151929_add_sku_index_to_spree_variants.rb +1 -1
- data/db/migrate/20130515180736_add_backorderable_default_to_spree_stock_location.rb +1 -1
- data/db/migrate/20130516151222_add_propage_all_variants_to_spree_stock_location.rb +1 -1
- data/db/migrate/20130611054351_rename_shipping_methods_zones_to_spree_shipping_methods_zones.rb +1 -1
- data/db/migrate/20130611185927_add_user_id_index_to_spree_orders.rb +1 -1
- data/db/migrate/20130618041418_add_updated_at_to_spree_countries.rb +1 -1
- data/db/migrate/20130619012236_add_updated_at_to_spree_states.rb +1 -1
- data/db/migrate/20130626232741_add_cvv_result_code_and_cvv_result_message_to_spree_payments.rb +1 -1
- data/db/migrate/20130628021056_add_unique_index_to_permalink_on_spree_products.rb +2 -2
- data/db/migrate/20130628022817_add_unique_index_to_orders_shipments_and_stock_transfers.rb +4 -4
- data/db/migrate/20130708052307_add_deleted_at_to_spree_tax_rates.rb +1 -1
- data/db/migrate/20130711200933_remove_lock_version_from_inventory_units.rb +1 -1
- data/db/migrate/20130718042445_add_cost_price_to_line_item.rb +2 -2
- data/db/migrate/20130718233855_set_backorderable_to_default_to_false.rb +3 -3
- data/db/migrate/20130725031716_add_created_by_id_to_spree_orders.rb +1 -1
- data/db/migrate/20130729214043_index_completed_at_on_spree_orders.rb +1 -1
- data/db/migrate/20130802014537_add_tax_category_id_to_spree_line_items.rb +1 -1
- data/db/migrate/20130802022321_migrate_tax_categories_to_line_items.rb +1 -1
- data/db/migrate/20130806022521_drop_spree_mail_methods.rb +1 -1
- data/db/migrate/20130806145853_set_default_stock_location_on_shipments.rb +1 -1
- data/db/migrate/20130807024301_upgrade_adjustments.rb +4 -4
- data/db/migrate/20130807024302_rename_adjustment_fields.rb +1 -1
- data/db/migrate/20130809164245_add_admin_name_column_to_spree_shipping_methods.rb +1 -1
- data/db/migrate/20130809164330_add_admin_name_column_to_spree_stock_locations.rb +1 -1
- data/db/migrate/20130813004002_add_shipment_total_to_spree_orders.rb +2 -2
- data/db/migrate/20130813140619_expand_order_number_size.rb +3 -3
- data/db/migrate/20130813232134_rename_activators_to_promotions.rb +1 -1
- data/db/migrate/20130815000406_add_adjustment_total_to_line_items.rb +2 -2
- data/db/migrate/20130815024413_add_adjustment_total_to_shipments.rb +2 -2
- data/db/migrate/20130826062534_add_depth_to_spree_taxons.rb +1 -1
- data/db/migrate/20130828234942_add_tax_total_to_line_items_shipments_and_orders.rb +2 -2
- data/db/migrate/20130830001033_add_shipping_category_to_shipping_methods_and_products.rb +2 -2
- data/db/migrate/20130830001159_migrate_old_shipping_calculators.rb +1 -1
- data/db/migrate/20130903183026_add_code_to_spree_promotion_rules.rb +1 -1
- data/db/migrate/20130909115621_change_states_required_for_countries.rb +1 -1
- data/db/migrate/20130915032339_add_deleted_at_to_spree_stock_items.rb +1 -1
- data/db/migrate/20130917024658_remove_promotions_event_name_field.rb +1 -1
- data/db/migrate/20130924040529_add_promo_total_to_line_items_and_shipments_and_orders.rb +1 -1
- data/db/migrate/20131001013410_remove_unused_credit_card_fields.rb +2 -2
- data/db/migrate/20131026154747_add_track_inventory_to_variant.rb +2 -2
- data/db/migrate/20131107132123_add_tax_category_to_variants.rb +1 -1
- data/db/migrate/20131113035136_add_channel_to_spree_orders.rb +1 -1
- data/db/migrate/20131118043959_add_included_to_adjustments.rb +2 -2
- data/db/migrate/20131118050234_rename_tax_total_fields.rb +1 -1
- data/db/migrate/20131118183431_add_line_item_id_to_spree_inventory_units.rb +1 -1
- data/db/migrate/20131120234456_add_updated_at_to_variants.rb +1 -1
- data/db/migrate/20131127001002_add_position_to_classifications.rb +1 -1
- data/db/migrate/20131211112807_create_spree_orders_promotions.rb +2 -2
- data/db/migrate/20131211192741_unique_shipping_method_categories.rb +1 -1
- data/db/migrate/20131218054603_add_item_count_to_spree_orders.rb +2 -2
- data/db/migrate/20140106065820_remove_value_type_from_spree_preferences.rb +1 -1
- data/db/migrate/20140106224208_rename_permalink_to_slug_for_products.rb +1 -1
- data/db/migrate/20140120160805_add_index_to_variant_id_and_currency_on_prices.rb +1 -1
- data/db/migrate/20140124023232_rename_activator_id_in_rules_and_actions_to_promotion_id.rb +1 -1
- data/db/migrate/20140129024326_add_deleted_at_to_spree_prices.rb +1 -1
- data/db/migrate/20140203161722_add_approver_id_and_approved_at_to_orders.rb +1 -1
- data/db/migrate/20140204115338_add_confirmation_delivered_to_spree_orders.rb +1 -1
- data/db/migrate/20140204192230_add_auto_capture_to_payment_methods.rb +1 -1
- data/db/migrate/20140205120320_create_spree_payment_capture_events.rb +1 -1
- data/db/migrate/20140205144710_add_uncaptured_amount_to_payments.rb +1 -1
- data/db/migrate/20140205181631_default_variant_weight_to_zero.rb +1 -1
- data/db/migrate/20140207085910_add_tax_category_id_to_shipping_methods.rb +1 -1
- data/db/migrate/20140207093021_add_tax_rate_id_to_shipping_rates.rb +1 -1
- data/db/migrate/20140211040159_add_pre_tax_amount_to_line_items_and_shipments.rb +1 -1
- data/db/migrate/20140213184916_add_more_indexes.rb +1 -1
- data/db/migrate/20140219060952_add_considered_risky_to_orders.rb +2 -2
- data/db/migrate/20140227112348_add_preference_store_to_everything.rb +1 -1
- data/db/migrate/20140307235515_add_user_id_to_spree_credit_cards.rb +1 -1
- data/db/migrate/20140309023735_migrate_old_preferences.rb +1 -1
- data/db/migrate/20140309024355_create_spree_stores.rb +2 -2
- data/db/migrate/20140309033438_create_store_from_preferences.rb +2 -2
- data/db/migrate/20140315053743_add_timestamps_to_spree_assets.rb +1 -1
- data/db/migrate/20140318191500_create_spree_taxons_promotion_rules.rb +1 -1
- data/db/migrate/20140331100557_add_additional_store_fields.rb +1 -1
- data/db/migrate/20140410141842_add_many_missing_indexes.rb +1 -1
- data/db/migrate/20140410150358_correct_some_polymorphic_index_and_add_more_missing.rb +1 -1
- data/db/migrate/20140415041315_add_user_id_created_by_id_index_to_order.rb +1 -1
- data/db/migrate/20140508151342_change_spree_price_amount_precision.rb +5 -5
- data/db/migrate/20140518174634_add_token_to_spree_orders.rb +1 -1
- data/db/migrate/20140530024945_move_order_token_from_tokenized_permission.rb +2 -2
- data/db/migrate/20140601011216_set_shipment_total_for_users_upgrading.rb +1 -1
- data/db/migrate/20140604135309_drop_credit_card_first_name_and_last_name.rb +1 -1
- data/db/migrate/20140609201656_add_deleted_at_to_spree_promotion_actions.rb +1 -1
- data/db/migrate/20140616202624_remove_uncaptured_amount_from_spree_payments.rb +1 -1
- data/db/migrate/20140625214618_create_spree_refunds.rb +1 -1
- data/db/migrate/20140702140656_create_spree_return_authorization_inventory_unit.rb +1 -1
- data/db/migrate/20140707125621_rename_return_authorization_inventory_unit_to_return_items.rb +1 -1
- data/db/migrate/20140709160534_backfill_line_item_pre_tax_amount.rb +1 -1
- data/db/migrate/20140710041921_recreate_spree_return_authorizations.rb +2 -2
- data/db/migrate/20140710181204_add_amount_fields_to_return_items.rb +1 -1
- data/db/migrate/20140710190048_drop_return_authorization_amount.rb +1 -1
- data/db/migrate/20140713140455_create_spree_return_authorization_reasons.rb +1 -1
- data/db/migrate/20140713140527_create_spree_refund_reasons.rb +1 -1
- data/db/migrate/20140713142214_rename_return_authorization_reason.rb +1 -1
- data/db/migrate/20140715182625_create_spree_promotion_categories.rb +1 -1
- data/db/migrate/20140716204111_drop_received_at_on_return_items.rb +1 -1
- data/db/migrate/20140716212330_add_reception_and_acceptance_status_to_return_items.rb +1 -1
- data/db/migrate/20140717155155_create_default_refund_reason.rb +1 -1
- data/db/migrate/20140717185932_add_default_to_spree_stock_locations.rb +1 -1
- data/db/migrate/20140718133010_create_spree_customer_returns.rb +1 -1
- data/db/migrate/20140718133349_add_customer_return_id_to_return_item.rb +1 -1
- data/db/migrate/20140718195325_create_friendly_id_slugs.rb +5 -5
- data/db/migrate/20140723004419_rename_spree_refund_return_authorization_id.rb +1 -1
- data/db/migrate/20140723152808_increase_return_item_pre_tax_amount_precision.rb +1 -1
- data/db/migrate/20140723214541_copy_product_slugs_to_slug_history.rb +2 -2
- data/db/migrate/20140725131539_create_spree_reimbursements.rb +1 -1
- data/db/migrate/20140728225422_add_promotionable_to_spree_products.rb +1 -1
- data/db/migrate/20140729133613_add_exchange_inventory_unit_foreign_keys.rb +1 -1
- data/db/migrate/20140730155938_add_acceptance_status_errors_to_return_item.rb +1 -1
- data/db/migrate/20140731150017_create_spree_reimbursement_types.rb +1 -1
- data/db/migrate/20140804185157_add_default_to_shipment_cost.rb +1 -1
- data/db/migrate/20140805171035_add_default_to_spree_credit_cards.rb +1 -1
- data/db/migrate/20140805171219_make_existing_credit_cards_default.rb +1 -1
- data/db/migrate/20140806144901_add_type_to_reimbursement_type.rb +1 -1
- data/db/migrate/20140808184039_create_spree_reimbursement_credits.rb +1 -1
- data/db/migrate/20140827170513_add_meta_title_to_spree_products.rb +1 -1
- data/db/migrate/20140911173301_add_kind_to_zone.rb +1 -1
- data/db/migrate/20140924164824_add_code_to_spree_tax_categories.rb +1 -1
- data/db/migrate/20140927193717_default_pre_tax_amount_should_be_zero.rb +1 -1
- data/db/migrate/20141002191113_add_code_to_spree_shipping_methods.rb +1 -1
- data/db/migrate/20141007230328_add_cancel_audit_fields_to_spree_orders.rb +1 -1
- data/db/migrate/20141009204607_add_store_id_to_orders.rb +1 -1
- data/db/migrate/20141012083513_create_spree_taxons_prototypes.rb +1 -1
- data/db/migrate/20141021194502_add_state_lock_version_to_order.rb +1 -1
- data/db/migrate/20141023005240_add_counter_cache_from_spree_variants_to_spree_stock_items.rb +2 -7
- data/db/migrate/20141101231208_fix_adjustment_order_presence.rb +1 -1
- data/db/migrate/20141105213646_update_classifications_positions.rb +1 -1
- data/db/migrate/20141120135441_add_guest_token_index_to_spree_orders.rb +1 -1
- data/db/migrate/20141215232040_remove_token_permissions_table.rb +1 -1
- data/db/migrate/20141215235502_remove_extra_products_slug_index.rb +1 -1
- data/db/migrate/20141217215630_update_product_slug_index.rb +1 -1
- data/db/migrate/20141218025915_rename_identifier_to_number_for_payment.rb +1 -1
- data/db/migrate/20150118210639_create_spree_store_credits.rb +1 -1
- data/db/migrate/20150118211500_create_spree_store_credit_categories.rb +1 -1
- data/db/migrate/20150118212051_create_spree_store_credit_events.rb +1 -1
- data/db/migrate/20150118212101_create_spree_store_credit_types.rb +1 -1
- data/db/migrate/20150121022521_remove_environment_from_payment_method.rb +1 -1
- data/db/migrate/20150122145607_add_resellable_to_return_items.rb +1 -1
- data/db/migrate/20150122202432_add_code_to_spree_promotion_categories.rb +1 -1
- data/db/migrate/20150128032538_remove_environment_from_tracker.rb +1 -1
- data/db/migrate/20150128060325_remove_spree_configurations.rb +1 -1
- data/db/migrate/20150216173445_add_index_to_spree_stock_items_variant_id.rb +1 -1
- data/db/migrate/20150309161154_ensure_payments_have_numbers.rb +1 -1
- data/db/migrate/20150314013438_add_missing_indexes_on_spree_tables.rb +1 -1
- data/db/migrate/20150317174308_remove_duplicated_indexes_from_multi_columns.rb +1 -1
- data/db/migrate/20150324104002_remove_user_index_from_spree_state_changes.rb +1 -1
- data/db/migrate/20150515211137_fix_adjustment_order_id.rb +1 -1
- data/db/migrate/20150522071831_add_position_to_spree_payment_methods.rb +1 -1
- data/db/migrate/20150522181728_add_deleted_at_to_friendly_id_slugs.rb +1 -1
- data/db/migrate/20150609093816_increase_scale_on_pre_tax_amounts.rb +1 -1
- data/db/migrate/20150626181949_add_taxable_adjustment_total_to_line_item.rb +1 -1
- data/db/migrate/20150627090949_migrate_payment_methods_display.rb +1 -1
- data/db/migrate/20150707204155_enable_acts_as_paranoid_on_calculators.rb +1 -1
- data/db/migrate/20150714154102_spree_payment_method_store_credits.rb +1 -1
- data/db/migrate/20150726141425_rename_has_and_belongs_to_associations_to_model_names.rb +1 -1
- data/db/migrate/20150727191614_spree_store_credit_types.rb +1 -1
- data/db/migrate/20150819154308_add_discontinued_to_products_and_variants.rb +1 -1
- data/db/migrate/20151220072838_remove_shipping_method_id_from_spree_orders.rb +1 -1
- data/db/migrate/20160207191757_add_id_column_to_earlier_habtm_tables.rb +1 -1
- data/db/migrate/20160219165458_add_indexes.rb +1 -1
- data/db/migrate/20160509064646_remove_counter_cache_from_spree_variants_to_spree_stock_items.rb +10 -0
- data/db/migrate/20160511071954_acts_as_taggable_on_spree_migration.rb +40 -0
- data/db/migrate/20160511072249_change_collation_for_spree_tag_names.rb +9 -0
- data/db/migrate/20160511072335_add_missing_indexes_to_spree_taggings.rb +14 -0
- data/db/migrate/20160608090604_add_zipcode_required_to_spree_countries.rb +7 -0
- data/db/migrate/20161014145148_add_created_at_to_variant.rb +8 -0
- data/db/migrate/20161014152814_add_null_false_to_spree_variants_timestamps.rb +6 -0
- data/lib/generators/spree/custom_user/custom_user_generator.rb +1 -1
- data/lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt +3 -3
- data/lib/generators/spree/custom_user/templates/migration.rb.tt +2 -2
- data/lib/generators/spree/dummy/dummy_generator.rb +11 -11
- data/lib/generators/spree/dummy/templates/rails/application.rb +1 -1
- data/lib/generators/spree/dummy/templates/rails/database.yml +9 -6
- data/lib/generators/spree/dummy/templates/rails/test.rb +2 -2
- data/lib/generators/spree/install/install_generator.rb +37 -13
- data/lib/spree/core/controller_helpers/common.rb +3 -3
- data/lib/spree/core/controller_helpers/order.rb +2 -5
- data/lib/spree/core/controller_helpers/respond_with.rb +1 -1
- data/lib/spree/core/delegate_belongs_to.rb +2 -2
- data/lib/spree/core/engine.rb +5 -4
- data/lib/spree/core/importer/product.rb +2 -2
- data/lib/spree/core/product_duplicator.rb +1 -1
- data/lib/spree/core/product_filters.rb +1 -1
- data/lib/spree/core/search/base.rb +1 -1
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/i18n/initializer.rb +1 -1
- data/lib/spree/money.rb +1 -15
- data/lib/spree/permitted_attributes.rb +1 -1
- data/lib/spree/testing_support/caching.rb +3 -3
- data/lib/spree/testing_support/common_rake.rb +0 -2
- data/lib/spree/testing_support/controller_requests.rb +4 -4
- data/lib/spree/testing_support/factories/line_item_factory.rb +0 -1
- data/lib/spree/testing_support/factories/order_factory.rb +1 -0
- data/lib/spree/testing_support/factories/tag_factory.rb +5 -0
- data/lib/spree/testing_support/kernel.rb +18 -0
- data/lib/spree/testing_support/order_walkthrough.rb +4 -4
- data/lib/tasks/core.rake +2 -2
- data/spec/helpers/base_helper_spec.rb +200 -0
- data/spec/helpers/products_helper_spec.rb +289 -0
- data/spec/lib/calculated_adjustments_spec.rb +7 -0
- data/spec/lib/i18n_spec.rb +123 -0
- data/spec/lib/search/base_spec.rb +86 -0
- data/spec/lib/spree/core/controller_helpers/auth_spec.rb +103 -0
- data/spec/lib/spree/core/controller_helpers/order_spec.rb +110 -0
- data/spec/lib/spree/core/controller_helpers/search_spec.rb +17 -0
- data/spec/lib/spree/core/controller_helpers/store_spec.rb +72 -0
- data/spec/lib/spree/core/controller_helpers/strong_parameters_spec.rb +39 -0
- data/spec/lib/spree/core/delegate_belongs_to_spec.rb +22 -0
- data/spec/lib/spree/core/importer/order_spec.rb +605 -0
- data/spec/lib/spree/core/number_generator_spec.rb +175 -0
- data/spec/lib/spree/core/token_generator_spec.rb +24 -0
- data/spec/lib/spree/core/validators/email_spec.rb +53 -0
- data/spec/lib/spree/core_spec.rb +23 -0
- data/spec/lib/spree/localized_number_spec.rb +48 -0
- data/spec/lib/spree/migrations_spec.rb +36 -0
- data/spec/lib/spree/money_spec.rb +122 -0
- data/spec/lib/tasks/exchanges_spec.rb +136 -0
- data/spec/mailers/order_mailer_spec.rb +122 -0
- data/spec/mailers/reimbursement_mailer_spec.rb +47 -0
- data/spec/mailers/shipment_mailer_spec.rb +81 -0
- data/spec/mailers/test_mailer_spec.rb +38 -0
- data/spec/models/option_type_prototype_spec.rb +9 -0
- data/spec/models/spree/ability_spec.rb +251 -0
- data/spec/models/spree/address_spec.rb +402 -0
- data/spec/models/spree/adjustable/adjuster/base_spec.rb +10 -0
- data/spec/models/spree/adjustable/adjuster/promotion_spec.rb +211 -0
- data/spec/models/spree/adjustable/adjuster/tax_spec.rb +86 -0
- data/spec/models/spree/adjustable/adjustments_updater_spec.rb +26 -0
- data/spec/models/spree/adjustment_spec.rb +189 -0
- data/spec/models/spree/app_configuration_spec.rb +26 -0
- data/spec/models/spree/asset_spec.rb +28 -0
- data/spec/models/spree/calculator/default_tax_spec.rb +152 -0
- data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +25 -0
- data/spec/models/spree/calculator/flat_rate_spec.rb +47 -0
- data/spec/models/spree/calculator/flexi_rate_spec.rb +41 -0
- data/spec/models/spree/calculator/percent_on_line_item_spec.rb +15 -0
- data/spec/models/spree/calculator/price_sack_spec.rb +30 -0
- data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +47 -0
- data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +23 -0
- data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +13 -0
- data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +52 -0
- data/spec/models/spree/calculator/shipping/per_item_spec.rb +20 -0
- data/spec/models/spree/calculator/shipping/price_sack_spec.rb +29 -0
- data/spec/models/spree/calculator/shipping.rb +8 -0
- data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +40 -0
- data/spec/models/spree/calculator/tiered_percent_spec.rb +51 -0
- data/spec/models/spree/calculator_spec.rb +69 -0
- data/spec/models/spree/classification_spec.rb +93 -0
- data/spec/models/spree/concerns/display_money_spec.rb +43 -0
- data/spec/models/spree/concerns/user_methods_spec.rb +82 -0
- data/spec/models/spree/concerns/vat_price_calculation_spec.rb +66 -0
- data/spec/models/spree/country_spec.rb +55 -0
- data/spec/models/spree/credit_card_spec.rb +328 -0
- data/spec/models/spree/customer_return_spec.rb +240 -0
- data/spec/models/spree/exchange_spec.rb +75 -0
- data/spec/models/spree/gateway/bogus_simple.rb +20 -0
- data/spec/models/spree/gateway/bogus_spec.rb +13 -0
- data/spec/models/spree/gateway_spec.rb +61 -0
- data/spec/models/spree/image_spec.rb +8 -0
- data/spec/models/spree/inventory_unit_spec.rb +256 -0
- data/spec/models/spree/line_item_spec.rb +346 -0
- data/spec/models/spree/option_type_spec.rb +14 -0
- data/spec/models/spree/option_value_spec.rb +18 -0
- data/spec/models/spree/order/address_spec.rb +50 -0
- data/spec/models/spree/order/adjustments_spec.rb +29 -0
- data/spec/models/spree/order/callbacks_spec.rb +42 -0
- data/spec/models/spree/order/checkout_spec.rb +770 -0
- data/spec/models/spree/order/currency_updater_spec.rb +32 -0
- data/spec/models/spree/order/finalizing_spec.rb +114 -0
- data/spec/models/spree/order/helpers_spec.rb +5 -0
- data/spec/models/spree/order/payment_spec.rb +214 -0
- data/spec/models/spree/order/risk_assessment_spec.rb +84 -0
- data/spec/models/spree/order/shipments_spec.rb +43 -0
- data/spec/models/spree/order/state_machine_spec.rb +212 -0
- data/spec/models/spree/order/store_credit_spec.rb +426 -0
- data/spec/models/spree/order/tax_spec.rb +84 -0
- data/spec/models/spree/order/totals_spec.rb +24 -0
- data/spec/models/spree/order/updating_spec.rb +18 -0
- data/spec/models/spree/order/validations_spec.rb +15 -0
- data/spec/models/spree/order_contents_spec.rb +297 -0
- data/spec/models/spree/order_inventory_spec.rb +239 -0
- data/spec/models/spree/order_merger_spec.rb +135 -0
- data/spec/models/spree/order_spec.rb +1046 -0
- data/spec/models/spree/order_updater_spec.rb +294 -0
- data/spec/models/spree/payment/gateway_options_spec.rb +127 -0
- data/spec/models/spree/payment/store_credit_spec.rb +60 -0
- data/spec/models/spree/payment_method/store_credit_spec.rb +291 -0
- data/spec/models/spree/payment_method_spec.rb +103 -0
- data/spec/models/spree/payment_spec.rb +919 -0
- data/spec/models/spree/preference_spec.rb +80 -0
- data/spec/models/spree/preferences/configuration_spec.rb +30 -0
- data/spec/models/spree/preferences/preferable_spec.rb +344 -0
- data/spec/models/spree/preferences/scoped_store_spec.rb +58 -0
- data/spec/models/spree/preferences/store_spec.rb +46 -0
- data/spec/models/spree/price_spec.rb +128 -0
- data/spec/models/spree/product/scopes_spec.rb +183 -0
- data/spec/models/spree/product_duplicator_spec.rb +103 -0
- data/spec/models/spree/product_filter_spec.rb +26 -0
- data/spec/models/spree/product_option_type_spec.rb +9 -0
- data/spec/models/spree/product_promotion_rule_spec.rb +9 -0
- data/spec/models/spree/product_property_spec.rb +22 -0
- data/spec/models/spree/product_spec.rb +619 -0
- data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +50 -0
- data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +148 -0
- data/spec/models/spree/promotion/actions/create_line_items_spec.rb +86 -0
- data/spec/models/spree/promotion/actions/free_shipping_spec.rb +36 -0
- data/spec/models/spree/promotion/rules/country_spec.rb +36 -0
- data/spec/models/spree/promotion/rules/first_order_spec.rb +75 -0
- data/spec/models/spree/promotion/rules/item_total_spec.rb +282 -0
- data/spec/models/spree/promotion/rules/one_use_per_user_spec.rb +42 -0
- data/spec/models/spree/promotion/rules/option_value_spec.rb +90 -0
- data/spec/models/spree/promotion/rules/product_spec.rb +143 -0
- data/spec/models/spree/promotion/rules/taxon_spec.rb +102 -0
- data/spec/models/spree/promotion/rules/user_logged_in_spec.rb +27 -0
- data/spec/models/spree/promotion/rules/user_spec.rb +45 -0
- data/spec/models/spree/promotion_action_spec.rb +10 -0
- data/spec/models/spree/promotion_category_spec.rb +17 -0
- data/spec/models/spree/promotion_handler/cart_spec.rb +102 -0
- data/spec/models/spree/promotion_handler/coupon_spec.rb +323 -0
- data/spec/models/spree/promotion_handler/free_shipping_spec.rb +48 -0
- data/spec/models/spree/promotion_handler/page_spec.rb +44 -0
- data/spec/models/spree/promotion_rule_spec.rb +29 -0
- data/spec/models/spree/promotion_rule_taxon_spec.rb +9 -0
- data/spec/models/spree/promotion_rule_user_spec.rb +9 -0
- data/spec/models/spree/promotion_spec.rb +679 -0
- data/spec/models/spree/property_prototype_spec.rb +9 -0
- data/spec/models/spree/property_spec.rb +5 -0
- data/spec/models/spree/prototype_spec.rb +5 -0
- data/spec/models/spree/prototype_taxon_spec.rb +9 -0
- data/spec/models/spree/refund_reason_spec.rb +20 -0
- data/spec/models/spree/refund_spec.rb +195 -0
- data/spec/models/spree/reimbursement/credit_spec.rb +36 -0
- data/spec/models/spree/reimbursement/reimbursement_type_engine_spec.rb +140 -0
- data/spec/models/spree/reimbursement/reimbursement_type_validator_spec.rb +83 -0
- data/spec/models/spree/reimbursement_performer_spec.rb +30 -0
- data/spec/models/spree/reimbursement_spec.rb +188 -0
- data/spec/models/spree/reimbursement_tax_calculator_spec.rb +63 -0
- data/spec/models/spree/reimbursement_type/credit_spec.rb +53 -0
- data/spec/models/spree/reimbursement_type/exchange_spec.rb +46 -0
- data/spec/models/spree/reimbursement_type/original_payment_spec.rb +55 -0
- data/spec/models/spree/reimbursement_type/store_credit_spec.rb +101 -0
- data/spec/models/spree/return_authorization_reason_spec.rb +7 -0
- data/spec/models/spree/return_authorization_spec.rb +230 -0
- data/spec/models/spree/return_item/eligibility_validator/default_spec.rb +77 -0
- data/spec/models/spree/return_item/eligibility_validator/inventory_shipped_spec.rb +58 -0
- data/spec/models/spree/return_item/eligibility_validator/no_reimbursements_spec.rb +61 -0
- data/spec/models/spree/return_item/eligibility_validator/order_completed_spec.rb +32 -0
- data/spec/models/spree/return_item/eligibility_validator/rma_required_spec.rb +29 -0
- data/spec/models/spree/return_item/eligibility_validator/time_since_purchase_spec.rb +35 -0
- data/spec/models/spree/return_item/exchange_variant_eligibility/same_option_value_spec.rb +65 -0
- data/spec/models/spree/return_item/exchange_variant_eligibility/same_product_spec.rb +43 -0
- data/spec/models/spree/return_item_spec.rb +731 -0
- data/spec/models/spree/returns_calculator_spec.rb +14 -0
- data/spec/models/spree/role_spec.rb +7 -0
- data/spec/models/spree/shipment_spec.rb +742 -0
- data/spec/models/spree/shipping_calculator_spec.rb +45 -0
- data/spec/models/spree/shipping_category_spec.rb +19 -0
- data/spec/models/spree/shipping_method_spec.rb +95 -0
- data/spec/models/spree/shipping_rate_spec.rb +140 -0
- data/spec/models/spree/state_spec.rb +29 -0
- data/spec/models/spree/stock/availability_validator_spec.rb +36 -0
- data/spec/models/spree/stock/content_item_spec.rb +31 -0
- data/spec/models/spree/stock/coordinator_spec.rb +61 -0
- data/spec/models/spree/stock/differentiator_spec.rb +39 -0
- data/spec/models/spree/stock/estimator_spec.rb +202 -0
- data/spec/models/spree/stock/inventory_unit_builder_spec.rb +38 -0
- data/spec/models/spree/stock/package_spec.rb +182 -0
- data/spec/models/spree/stock/packer_spec.rb +70 -0
- data/spec/models/spree/stock/prioritizer_spec.rb +125 -0
- data/spec/models/spree/stock/quantifier_spec.rb +126 -0
- data/spec/models/spree/stock/splitter/backordered_spec.rb +29 -0
- data/spec/models/spree/stock/splitter/base_spec.rb +21 -0
- data/spec/models/spree/stock/splitter/shipping_category_spec.rb +47 -0
- data/spec/models/spree/stock/splitter/weight_spec.rb +32 -0
- data/spec/models/spree/stock_item_spec.rb +432 -0
- data/spec/models/spree/stock_location_spec.rb +243 -0
- data/spec/models/spree/stock_movement_spec.rb +120 -0
- data/spec/models/spree/stock_transfer_spec.rb +50 -0
- data/spec/models/spree/store_credit_event_spec.rb +101 -0
- data/spec/models/spree/store_credit_spec.rb +786 -0
- data/spec/models/spree/store_spec.rb +78 -0
- data/spec/models/spree/tax_category_spec.rb +32 -0
- data/spec/models/spree/tax_rate_spec.rb +561 -0
- data/spec/models/spree/taxon_spec.rb +85 -0
- data/spec/models/spree/taxonomy_spec.rb +18 -0
- data/spec/models/spree/tracker_spec.rb +21 -0
- data/spec/models/spree/user_spec.rb +203 -0
- data/spec/models/spree/variant_spec.rb +809 -0
- data/spec/models/spree/zone_member_spec.rb +38 -0
- data/spec/models/spree/zone_spec.rb +472 -0
- data/spec/spec_helper.rb +79 -0
- data/spec/support/big_decimal.rb +5 -0
- data/spec/support/concerns/adjustment_source.rb +23 -0
- data/spec/support/concerns/default_price.rb +37 -0
- data/spec/support/rake.rb +13 -0
- data/spec/support/test_gateway.rb +2 -0
- data/spree_core.gemspec +12 -12
- metadata +249 -43
- data/config/initializers/premailer_rails.rb +0 -3
data/app/models/spree/order.rb
CHANGED
@@ -236,11 +236,6 @@ module Spree
|
|
236
236
|
updater.update
|
237
237
|
end
|
238
238
|
|
239
|
-
def update!
|
240
|
-
warn "`update!` is deprecated as it conflicts with update! method of rails. Use `update_with_updater!` instead."
|
241
|
-
update_with_updater!
|
242
|
-
end
|
243
|
-
|
244
239
|
def merger
|
245
240
|
@merger ||= Spree::OrderMerger.new(self)
|
246
241
|
end
|
@@ -272,8 +267,8 @@ module Spree
|
|
272
267
|
self.user = user
|
273
268
|
self.email = user.email if override_email
|
274
269
|
self.created_by ||= user
|
275
|
-
self.bill_address ||= user.bill_address
|
276
|
-
self.ship_address ||= user.ship_address
|
270
|
+
self.bill_address ||= user.bill_address
|
271
|
+
self.ship_address ||= user.ship_address
|
277
272
|
|
278
273
|
changes = slice(:user_id, :email, :created_by_id, :bill_address_id, :ship_address_id)
|
279
274
|
|
@@ -405,7 +400,7 @@ module Spree
|
|
405
400
|
end
|
406
401
|
|
407
402
|
def available_payment_methods
|
408
|
-
@available_payment_methods ||=
|
403
|
+
@available_payment_methods ||= collect_payment_methods
|
409
404
|
end
|
410
405
|
|
411
406
|
def insufficient_stock_lines
|
@@ -481,7 +476,6 @@ module Spree
|
|
481
476
|
Spree::Promotion.order_activatable?(self)
|
482
477
|
end
|
483
478
|
|
484
|
-
|
485
479
|
def shipped?
|
486
480
|
%w(partial shipped).include?(shipment_state)
|
487
481
|
end
|
@@ -489,6 +483,11 @@ module Spree
|
|
489
483
|
def create_proposed_shipments
|
490
484
|
all_adjustments.shipping.delete_all
|
491
485
|
shipments.destroy_all
|
486
|
+
|
487
|
+
# Inventory Units which are not associated to any shipment (unshippable)
|
488
|
+
# and are not returned or shipped should be deleted
|
489
|
+
inventory_units.on_hand_or_backordered.delete_all
|
490
|
+
|
492
491
|
self.shipments = Spree::Stock::Coordinator.new(self).shipments
|
493
492
|
end
|
494
493
|
|
@@ -608,22 +607,6 @@ module Spree
|
|
608
607
|
end
|
609
608
|
alias_method :fully_discounted, :fully_discounted?
|
610
609
|
|
611
|
-
def payments_attributes=(attributes)
|
612
|
-
validate_payments_attributes(attributes)
|
613
|
-
super(attributes)
|
614
|
-
end
|
615
|
-
|
616
|
-
def validate_payments_attributes(attributes)
|
617
|
-
# Ensure the payment methods specified are allowed for this user
|
618
|
-
payment_methods = Spree::PaymentMethod.where(id: available_payment_methods.map(&:id))
|
619
|
-
attributes.each do |payment_attributes|
|
620
|
-
payment_method_id = payment_attributes[:payment_method_id]
|
621
|
-
|
622
|
-
# raise RecordNotFound unless it is an allowed payment method
|
623
|
-
payment_methods.find(payment_method_id) if payment_method_id
|
624
|
-
end
|
625
|
-
end
|
626
|
-
|
627
610
|
private
|
628
611
|
|
629
612
|
def link_by_email
|
@@ -681,5 +664,9 @@ module Spree
|
|
681
664
|
def create_token
|
682
665
|
self.guest_token ||= generate_guest_token
|
683
666
|
end
|
667
|
+
|
668
|
+
def collect_payment_methods
|
669
|
+
PaymentMethod.available_on_front_end.select { |pm| pm.available_for_order?(self) }
|
670
|
+
end
|
684
671
|
end
|
685
672
|
end
|
@@ -53,17 +53,16 @@ module Spree
|
|
53
53
|
end
|
54
54
|
|
55
55
|
def filter_order_items(params)
|
56
|
-
|
57
|
-
return filtered_params if filtered_params[:line_items_attributes].nil? || filtered_params[:line_items_attributes][:id]
|
56
|
+
return params if params[:line_items_attributes].nil? || params[:line_items_attributes][:id]
|
58
57
|
|
59
58
|
line_item_ids = order.line_items.pluck(:id)
|
60
59
|
|
61
60
|
params[:line_items_attributes].each_pair do |id, value|
|
62
61
|
unless line_item_ids.include?(value[:id].to_i) || value[:variant_id].present?
|
63
|
-
|
62
|
+
params[:line_items_attributes].delete(id)
|
64
63
|
end
|
65
64
|
end
|
66
|
-
|
65
|
+
params
|
67
66
|
end
|
68
67
|
|
69
68
|
def order_updater
|
@@ -82,8 +81,10 @@ module Spree
|
|
82
81
|
line_item.quantity += quantity.to_i
|
83
82
|
line_item.currency = currency unless currency.nil?
|
84
83
|
else
|
85
|
-
opts =
|
86
|
-
|
84
|
+
opts = ActionController::Parameters.new(options.to_h).
|
85
|
+
permit(PermittedAttributes.line_item_attributes).to_h.
|
86
|
+
merge( { currency: order.currency } )
|
87
|
+
|
87
88
|
line_item = order.line_items.new(quantity: quantity,
|
88
89
|
variant: variant,
|
89
90
|
options: opts)
|
@@ -25,6 +25,8 @@ module Spree
|
|
25
25
|
|
26
26
|
shipment = determine_target_shipment unless shipment
|
27
27
|
add_to_shipment(shipment, quantity)
|
28
|
+
elsif inventory_units.size == line_item.quantity && !line_item.changed?
|
29
|
+
remove(inventory_units, shipment)
|
28
30
|
elsif inventory_units.size > line_item.quantity
|
29
31
|
remove(inventory_units, shipment)
|
30
32
|
end
|
@@ -32,8 +34,9 @@ module Spree
|
|
32
34
|
end
|
33
35
|
|
34
36
|
private
|
37
|
+
|
35
38
|
def remove(item_units, shipment = nil)
|
36
|
-
quantity = item_units
|
39
|
+
quantity = set_quantity_to_remove(item_units)
|
37
40
|
|
38
41
|
if shipment.present?
|
39
42
|
remove_from_shipment(shipment, quantity)
|
@@ -45,6 +48,14 @@ module Spree
|
|
45
48
|
end
|
46
49
|
end
|
47
50
|
|
51
|
+
def set_quantity_to_remove(item_units)
|
52
|
+
if (item_units.size - line_item.quantity).zero?
|
53
|
+
line_item.quantity
|
54
|
+
else
|
55
|
+
item_units.size - line_item.quantity
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
48
59
|
# Returns either one of the shipment:
|
49
60
|
#
|
50
61
|
# first unshipped that already includes this variant
|
@@ -15,7 +15,6 @@ module Spree
|
|
15
15
|
# object with callbacks (otherwise you will end up in an infinite recursion as the
|
16
16
|
# associations try to save and then in turn try to call +update!+ again.)
|
17
17
|
def update
|
18
|
-
update_item_count
|
19
18
|
update_totals
|
20
19
|
if order.completed?
|
21
20
|
update_payment_state
|
@@ -139,7 +138,7 @@ module Spree
|
|
139
138
|
# will return nil if no shipments are found
|
140
139
|
order.shipment_state = shipment_states.first
|
141
140
|
# TODO inventory unit states?
|
142
|
-
# if order.shipment_state && order.inventory_units.where(:
|
141
|
+
# if order.shipment_state && order.inventory_units.where(shipment_id: nil).exists?
|
143
142
|
# shipments exist but there are unassigned inventory units
|
144
143
|
# order.shipment_state = 'partial'
|
145
144
|
# end
|
@@ -29,7 +29,7 @@ module Spree
|
|
29
29
|
# a new pending payment record for the remaining amount to capture later.
|
30
30
|
def capture!(amount = nil)
|
31
31
|
return true if completed?
|
32
|
-
amount ||= money.
|
32
|
+
amount ||= money.money.cents
|
33
33
|
started_processing!
|
34
34
|
protect_from_connection_error do
|
35
35
|
# Standard ActiveMerchant capture usage
|
@@ -115,7 +115,7 @@ module Spree
|
|
115
115
|
|
116
116
|
def gateway_action(source, action, success_state)
|
117
117
|
protect_from_connection_error do
|
118
|
-
response = payment_method.send(action, money.
|
118
|
+
response = payment_method.send(action, money.money.cents,
|
119
119
|
source,
|
120
120
|
gateway_options)
|
121
121
|
handle_response(response, success_state, :failure)
|
@@ -143,7 +143,7 @@ module Spree
|
|
143
143
|
end
|
144
144
|
|
145
145
|
def record_response(response)
|
146
|
-
log_entries.create!(:
|
146
|
+
log_entries.create!(details: response.to_yaml)
|
147
147
|
end
|
148
148
|
|
149
149
|
def protect_from_connection_error
|
@@ -5,7 +5,7 @@ module Spree
|
|
5
5
|
|
6
6
|
DISPLAY = [:both, :front_end, :back_end].freeze
|
7
7
|
|
8
|
-
scope :active, -> { where(active: true) }
|
8
|
+
scope :active, -> { where(active: true).order(position: :asc) }
|
9
9
|
scope :available, -> { active.where(display_on: [:front_end, :back_end, :both]) }
|
10
10
|
scope :available_on_front_end, -> { active.where(display_on: [:front_end, :both]) }
|
11
11
|
scope :available_on_back_end, -> { active.where(display_on: [:back_end, :both]) }
|
@@ -67,5 +67,11 @@ module Spree
|
|
67
67
|
def store_credit?
|
68
68
|
self.class == Spree::PaymentMethod::StoreCredit
|
69
69
|
end
|
70
|
+
|
71
|
+
# Custom PaymentMethod/Gateway can redefine this method to check method
|
72
|
+
# availability for concrete order.
|
73
|
+
def available_for_order?(_order)
|
74
|
+
true
|
75
|
+
end
|
70
76
|
end
|
71
77
|
end
|
@@ -24,7 +24,7 @@ module Spree::Preferences
|
|
24
24
|
|
25
25
|
def exist?(key)
|
26
26
|
@cache.exist?(key) ||
|
27
|
-
should_persist? && Spree::Preference.where(:
|
27
|
+
should_persist? && Spree::Preference.where(key: key).exists?
|
28
28
|
end
|
29
29
|
|
30
30
|
def get(key)
|
@@ -73,7 +73,7 @@ module Spree::Preferences
|
|
73
73
|
def persist(cache_key, value)
|
74
74
|
return unless should_persist?
|
75
75
|
|
76
|
-
preference = Spree::Preference.where(:
|
76
|
+
preference = Spree::Preference.where(key: cache_key).first_or_initialize
|
77
77
|
preference.value = value
|
78
78
|
preference.save
|
79
79
|
end
|
@@ -86,7 +86,7 @@ module Spree::Preferences
|
|
86
86
|
end
|
87
87
|
|
88
88
|
def should_persist?
|
89
|
-
@persistence
|
89
|
+
@persistence and Spree::Preference.table_exists?
|
90
90
|
end
|
91
91
|
|
92
92
|
end
|
@@ -39,34 +39,34 @@ module Spree
|
|
39
39
|
add_simple_scopes simple_scopes
|
40
40
|
|
41
41
|
add_search_scope :ascend_by_master_price do
|
42
|
-
joins(:
|
42
|
+
joins(master: :default_price).order("#{price_table_name}.amount ASC")
|
43
43
|
end
|
44
44
|
|
45
45
|
add_search_scope :descend_by_master_price do
|
46
|
-
joins(:
|
46
|
+
joins(master: :default_price).order("#{price_table_name}.amount DESC")
|
47
47
|
end
|
48
48
|
|
49
49
|
add_search_scope :price_between do |low, high|
|
50
|
-
joins(:
|
50
|
+
joins(master: :default_price).where(Price.table_name => { amount: low..high })
|
51
51
|
end
|
52
52
|
|
53
53
|
add_search_scope :master_price_lte do |price|
|
54
|
-
joins(:
|
54
|
+
joins(master: :default_price).where("#{price_table_name}.amount <= ?", price)
|
55
55
|
end
|
56
56
|
|
57
57
|
add_search_scope :master_price_gte do |price|
|
58
|
-
joins(:
|
58
|
+
joins(master: :default_price).where("#{price_table_name}.amount >= ?", price)
|
59
59
|
end
|
60
60
|
|
61
61
|
# This scope selects products in taxon AND all its descendants
|
62
62
|
# If you need products only within one taxon use
|
63
63
|
#
|
64
|
-
# Spree::Product.joins(:taxons).where(Taxon.table_name => { :
|
64
|
+
# Spree::Product.joins(:taxons).where(Taxon.table_name => { id: taxon.id })
|
65
65
|
#
|
66
66
|
# If you're using count on the result of this scope, you must use the
|
67
67
|
# `:distinct` option as well:
|
68
68
|
#
|
69
|
-
# Spree::Product.in_taxon(taxon).count(:
|
69
|
+
# Spree::Product.in_taxon(taxon).count(distinct: true)
|
70
70
|
#
|
71
71
|
# This is so that the count query is distinct'd:
|
72
72
|
#
|
@@ -162,8 +162,8 @@ module Spree
|
|
162
162
|
# there is alternative faster and more elegant solution, it has small drawback though,
|
163
163
|
# it doesn stack with other scopes :/
|
164
164
|
#
|
165
|
-
# :
|
166
|
-
# :
|
165
|
+
# joins: "LEFT OUTER JOIN (SELECT line_items.variant_id as vid, COUNT(*) as cnt FROM line_items GROUP BY line_items.variant_id) AS popularity_count ON variants.id = vid",
|
166
|
+
# order: 'COALESCE(cnt, 0) DESC'
|
167
167
|
add_search_scope :descend_by_popularity do
|
168
168
|
joins(:master).
|
169
169
|
order(%Q{
|
@@ -186,23 +186,19 @@ module Spree
|
|
186
186
|
where("#{Product.quoted_table_name}.deleted_at IS NULL or #{Product.quoted_table_name}.deleted_at >= ?", Time.zone.now)
|
187
187
|
end
|
188
188
|
|
189
|
-
|
190
|
-
|
191
|
-
where("#{Product.quoted_table_name}.discontinue_on IS NULL or #{Product.quoted_table_name}.discontinue_on >= ?", Time.zone.now)
|
192
|
-
else
|
193
|
-
all
|
194
|
-
end
|
189
|
+
add_search_scope :not_discontinued do
|
190
|
+
where("#{Product.quoted_table_name}.discontinue_on IS NULL or #{Product.quoted_table_name}.discontinue_on >= ?", Time.zone.now)
|
195
191
|
end
|
196
|
-
|
192
|
+
|
197
193
|
# Can't use add_search_scope for this as it needs a default argument
|
198
194
|
def self.available(available_on = nil, currency = nil)
|
199
195
|
available_on ||= Time.current
|
200
|
-
not_discontinued.joins(master: :prices).where("#{Product.quoted_table_name}.available_on <= ?", available_on).
|
196
|
+
not_discontinued.joins(master: :prices).where("#{Product.quoted_table_name}.available_on <= ?", available_on).distinct
|
201
197
|
end
|
202
198
|
search_scopes << :available
|
203
199
|
|
204
200
|
def self.active(currency = nil)
|
205
|
-
|
201
|
+
available(nil, currency)
|
206
202
|
end
|
207
203
|
search_scopes << :active
|
208
204
|
|
@@ -228,7 +224,7 @@ module Spree
|
|
228
224
|
#
|
229
225
|
# Don't allow sort_column, a variable coming from params,
|
230
226
|
# to be anything but a column in the database
|
231
|
-
if
|
227
|
+
if ApplicationRecord.connection.adapter_name == 'PostgreSQL' && !column_names.include?(sort_column)
|
232
228
|
all
|
233
229
|
else
|
234
230
|
distinct
|
@@ -260,7 +256,7 @@ module Spree
|
|
260
256
|
ids_or_records_or_names.flatten.map { |t|
|
261
257
|
case t
|
262
258
|
when Integer then Taxon.find_by(id: t)
|
263
|
-
when
|
259
|
+
when ApplicationRecord then t
|
264
260
|
when String
|
265
261
|
Taxon.find_by(name: t) ||
|
266
262
|
Taxon.where("#{taxons}.permalink LIKE ? OR #{taxons}.permalink = ?", "%/#{t}/", "#{t}/").first
|
data/app/models/spree/product.rb
CHANGED
@@ -21,6 +21,7 @@
|
|
21
21
|
module Spree
|
22
22
|
class Product < Spree::Base
|
23
23
|
extend FriendlyId
|
24
|
+
include ActsAsTaggable
|
24
25
|
friendly_id :slug_candidates, use: :history
|
25
26
|
|
26
27
|
acts_as_paranoid
|
@@ -115,7 +116,6 @@ module Spree
|
|
115
116
|
|
116
117
|
self.whitelisted_ransackable_associations = %w[stores variants_including_master master variants]
|
117
118
|
self.whitelisted_ransackable_attributes = %w[description name slug discontinue_on]
|
118
|
-
self.whitelisted_ransackable_scopes = %w[not_discontinued]
|
119
119
|
|
120
120
|
# the master variant is not a member of the variants array
|
121
121
|
def has_variants?
|
@@ -212,7 +212,7 @@ module Spree
|
|
212
212
|
end
|
213
213
|
|
214
214
|
def set_property(property_name, property_value, property_presentation = property_name)
|
215
|
-
|
215
|
+
ApplicationRecord.transaction do
|
216
216
|
# Works around spree_i18n #301
|
217
217
|
property = Property.create_with(presentation: property_presentation).find_or_create_by(name: property_name)
|
218
218
|
product_property = ProductProperty.where(product: self, property: property).first_or_initialize
|
@@ -236,6 +236,14 @@ module Spree
|
|
236
236
|
super || variants_including_master.with_deleted.find_by(is_master: true)
|
237
237
|
end
|
238
238
|
|
239
|
+
def brand
|
240
|
+
taxons.joins(:taxonomy).find_by(spree_taxonomies: { name: Spree.t(:taxonomy_brands_name) })
|
241
|
+
end
|
242
|
+
|
243
|
+
def category
|
244
|
+
taxons.joins(:taxonomy).find_by(spree_taxonomies: { name: Spree.t(:taxonomy_categories_name) })
|
245
|
+
end
|
246
|
+
|
239
247
|
private
|
240
248
|
|
241
249
|
def add_associations_from_prototype
|
@@ -269,7 +277,7 @@ module Spree
|
|
269
277
|
price: master.price
|
270
278
|
)
|
271
279
|
end
|
272
|
-
save
|
280
|
+
throw(:abort) unless save
|
273
281
|
end
|
274
282
|
|
275
283
|
def ensure_master
|
@@ -5,7 +5,7 @@ module Spree
|
|
5
5
|
has_many :promotion_action_line_items, foreign_key: :promotion_action_id
|
6
6
|
accepts_nested_attributes_for :promotion_action_line_items
|
7
7
|
|
8
|
-
delegate :eligible?, :
|
8
|
+
delegate :eligible?, to: :promotion
|
9
9
|
|
10
10
|
# Adds a line item to the Order if the promotion is eligible
|
11
11
|
#
|
@@ -37,7 +37,7 @@ module Spree
|
|
37
37
|
# needs to be manually removed from the order by the customer
|
38
38
|
def perform(options = {})
|
39
39
|
order = options[:order]
|
40
|
-
return unless
|
40
|
+
return unless eligible? order
|
41
41
|
|
42
42
|
action_taken = false
|
43
43
|
promotion_action_line_items.each do |item|
|
@@ -50,12 +50,30 @@ module Spree
|
|
50
50
|
action_taken
|
51
51
|
end
|
52
52
|
|
53
|
+
# Called by promotion handler when a promotion is removed
|
54
|
+
# This will find any line item matching the ones defined in the PromotionAction
|
55
|
+
# and remove the same quantity as was added by the PromotionAction.
|
56
|
+
# Should help to prevent some of cases listed above the #perform method
|
57
|
+
def revert(options = {})
|
58
|
+
order = options[:order]
|
59
|
+
return if eligible?(order)
|
60
|
+
|
61
|
+
action_taken = false
|
62
|
+
promotion_action_line_items.each do |item|
|
63
|
+
line_item = order.find_line_item_by_variant(item.variant)
|
64
|
+
next unless line_item.present?
|
65
|
+
order.contents.remove(item.variant, (item.quantity || 1))
|
66
|
+
action_taken = true
|
67
|
+
end
|
68
|
+
|
69
|
+
action_taken
|
70
|
+
end
|
71
|
+
|
53
72
|
# Checks that there's enough stock to add the line item to the order
|
54
73
|
def item_available?(item)
|
55
74
|
quantifier = Spree::Stock::Quantifier.new(item.variant)
|
56
75
|
quantifier.can_supply? item.quantity
|
57
76
|
end
|
58
|
-
|
59
77
|
end
|
60
78
|
end
|
61
79
|
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
# A rule to limit a promotion based on shipment country.
|
2
|
+
module Spree
|
3
|
+
class Promotion
|
4
|
+
module Rules
|
5
|
+
class Country < PromotionRule
|
6
|
+
preference :country_id, :integer
|
7
|
+
|
8
|
+
def applicable?(promotable)
|
9
|
+
promotable.is_a?(Spree::Order)
|
10
|
+
end
|
11
|
+
|
12
|
+
def eligible?(order, options = {})
|
13
|
+
country_id = options[:country_id] || order.ship_address.try(:country_id)
|
14
|
+
unless country_id.eql?(preferred_country_id || Spree::Country.default)
|
15
|
+
eligibility_errors.add(:base, eligibility_error_message(:wrong_country))
|
16
|
+
end
|
17
|
+
|
18
|
+
eligibility_errors.empty?
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -1,7 +1,20 @@
|
|
1
1
|
module Spree
|
2
2
|
class Promotion
|
3
3
|
module Rules
|
4
|
+
module OptionValueWithNumerificationSupport
|
5
|
+
def preferred_eligible_values
|
6
|
+
values = super || {}
|
7
|
+
Hash[values.keys.map(&:to_i).zip(
|
8
|
+
values.values.map do |v|
|
9
|
+
(v.is_a?(Array) ? v : v.split(",")).map(&:to_i)
|
10
|
+
end
|
11
|
+
)]
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
4
15
|
class OptionValue < PromotionRule
|
16
|
+
prepend OptionValueWithNumerificationSupport
|
17
|
+
|
5
18
|
MATCH_POLICIES = %w(any)
|
6
19
|
preference :match_policy, :string, default: MATCH_POLICIES.first
|
7
20
|
preference :eligible_values, :hash
|
@@ -24,16 +37,6 @@ module Spree
|
|
24
37
|
product_ids.include?(pid) && (value_ids(pid) - ovids).empty?
|
25
38
|
end
|
26
39
|
|
27
|
-
def preferred_eligible_values_with_numerification
|
28
|
-
values = preferred_eligible_values_without_numerification || {}
|
29
|
-
Hash[values.keys.map(&:to_i).zip(
|
30
|
-
values.values.map do |v|
|
31
|
-
(v.is_a?(Array) ? v : v.split(",")).map(&:to_i)
|
32
|
-
end
|
33
|
-
)]
|
34
|
-
end
|
35
|
-
alias_method_chain :preferred_eligible_values, :numerification
|
36
|
-
|
37
40
|
private
|
38
41
|
|
39
42
|
def product_ids
|
@@ -44,7 +44,7 @@ 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
|
@@ -24,13 +24,14 @@ module Spree
|
|
24
24
|
validates :path, uniqueness: { allow_blank: true }
|
25
25
|
validates :usage_limit, numericality: { greater_than: 0, allow_nil: true }
|
26
26
|
validates :description, length: { maximum: 255 }, allow_blank: true
|
27
|
+
validate :expires_at_must_be_later_than_starts_at, if: -> { starts_at && expires_at }
|
27
28
|
|
28
29
|
before_save :normalize_blank_values
|
29
30
|
|
30
31
|
scope :coupons, -> { where.not(code: nil) }
|
31
32
|
scope :advertised, -> { where(advertise: true) }
|
32
33
|
scope :applied, lambda {
|
33
|
-
joins(<<-SQL).
|
34
|
+
joins(<<-SQL).distinct
|
34
35
|
INNER JOIN spree_order_promotions
|
35
36
|
ON spree_order_promotions.promotion_id = #{table_name}.id
|
36
37
|
SQL
|
@@ -82,6 +83,33 @@ module Spree
|
|
82
83
|
action_taken
|
83
84
|
end
|
84
85
|
|
86
|
+
# Called when a promotion is removed from the cart
|
87
|
+
def deactivate(payload)
|
88
|
+
order = payload[:order]
|
89
|
+
return unless self.class.order_activatable?(order)
|
90
|
+
|
91
|
+
payload[:promotion] = self
|
92
|
+
|
93
|
+
# Track results from actions to see if any action has been taken.
|
94
|
+
# Actions should return nil/false if no action has been taken.
|
95
|
+
# If an action returns true, then an action has been taken.
|
96
|
+
results = actions.map do |action|
|
97
|
+
action.revert(payload) if action.respond_to?(:revert)
|
98
|
+
end
|
99
|
+
|
100
|
+
# If an action has been taken, report back to whatever `d this promotion.
|
101
|
+
action_taken = results.include?(true)
|
102
|
+
|
103
|
+
if action_taken
|
104
|
+
# connect to the order
|
105
|
+
# create the join_table entry.
|
106
|
+
orders << order
|
107
|
+
save
|
108
|
+
end
|
109
|
+
|
110
|
+
action_taken
|
111
|
+
end
|
112
|
+
|
85
113
|
# called anytime order.update_with_updater! happens
|
86
114
|
def eligible?(promotable)
|
87
115
|
return false if expired? || usage_limit_exceeded?(promotable) || blacklisted?(promotable)
|
@@ -194,5 +222,11 @@ module Spree
|
|
194
222
|
def match_all?
|
195
223
|
match_policy == 'all'
|
196
224
|
end
|
225
|
+
|
226
|
+
def expires_at_must_be_later_than_starts_at
|
227
|
+
if expires_at < starts_at
|
228
|
+
errors.add(:expires_at, :invalid_date_range)
|
229
|
+
end
|
230
|
+
end
|
197
231
|
end
|
198
232
|
end
|
@@ -24,6 +24,8 @@ module Spree
|
|
24
24
|
promotions.each do |promotion|
|
25
25
|
if (line_item && promotion.eligible?(line_item)) || promotion.eligible?(order)
|
26
26
|
promotion.activate(line_item: line_item, order: order)
|
27
|
+
else
|
28
|
+
promotion.deactivate(line_item: line_item, order: order)
|
27
29
|
end
|
28
30
|
end
|
29
31
|
end
|
@@ -31,23 +33,7 @@ module Spree
|
|
31
33
|
private
|
32
34
|
|
33
35
|
def promotions
|
34
|
-
#
|
35
|
-
# Also Postgresql requires an aliased table for `SELECT * FROM (subexpression) AS alias`.
|
36
|
-
# And Sqlite3 cannot work on outher parenthesis from `(left UNION right)`.
|
37
|
-
# So this construct makes both happy.
|
38
|
-
select = Arel::SelectManager.new(
|
39
|
-
Promotion,
|
40
|
-
Promotion.arel_table.create_table_alias(
|
41
|
-
order.promotions.active.union(Promotion.active.where(code: nil, path: nil)),
|
42
|
-
Promotion.table_name
|
43
|
-
),
|
44
|
-
)
|
45
|
-
select.project(Arel.star)
|
46
|
-
|
47
|
-
Promotion.find_by_sql(
|
48
|
-
select,
|
49
|
-
order.promotions.bind_values
|
50
|
-
)
|
36
|
+
Promotion.find_by_sql("#{order.promotions.active.to_sql} UNION #{Promotion.active.where(code: nil, path: nil).to_sql}")
|
51
37
|
end
|
52
38
|
end
|
53
39
|
end
|