spree_core 3.0.10 → 3.1.0.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/app/assets/javascripts/spree.js.coffee.erb +12 -3
- data/app/helpers/spree/base_helper.rb +4 -1
- data/app/helpers/spree/products_helper.rb +37 -6
- data/app/mailers/spree/base_mailer.rb +11 -2
- data/app/models/concerns/spree/adjustment_source.rb +3 -10
- data/app/models/concerns/spree/default_price.rb +7 -1
- data/app/models/concerns/spree/named_type.rb +1 -1
- data/app/models/concerns/spree/user_api_authentication.rb +7 -1
- data/app/models/concerns/spree/user_methods.rb +47 -0
- data/app/models/concerns/spree/user_reporting.rb +2 -2
- data/app/models/concerns/spree/vat_price_calculation.rb +47 -0
- data/app/models/spree/address.rb +8 -7
- data/app/models/spree/adjustable/adjuster/base.rb +25 -0
- data/app/models/spree/adjustable/adjuster/promotion.rb +41 -0
- data/app/models/spree/adjustable/adjuster/tax.rb +26 -0
- data/app/models/spree/adjustable/adjustments_updater.rb +22 -45
- data/app/models/spree/adjustment.rb +8 -10
- data/app/models/spree/app_configuration.rb +5 -2
- data/app/models/spree/base.rb +4 -0
- data/app/models/spree/calculator.rb +0 -5
- data/app/models/spree/calculator/default_tax.rb +2 -10
- data/app/models/spree/classification.rb +7 -3
- data/app/models/spree/country.rb +14 -3
- data/app/models/spree/credit_card.rb +21 -31
- data/app/models/spree/customer_return.rb +7 -15
- data/app/models/spree/gateway.rb +7 -6
- data/app/models/spree/image.rb +1 -1
- data/app/models/spree/inventory_unit.rb +9 -6
- data/app/models/spree/legacy_user.rb +1 -6
- data/app/models/spree/line_item.rb +69 -68
- data/app/models/spree/log_entry.rb +1 -4
- data/app/models/spree/option_type.rb +15 -6
- data/app/models/spree/option_type_prototype.rb +9 -0
- data/app/models/spree/option_value.rb +11 -3
- data/app/models/spree/option_value_variant.rb +6 -0
- data/app/models/spree/order.rb +113 -64
- data/app/models/spree/order/checkout.rb +8 -11
- data/app/models/spree/order/currency_updater.rb +1 -1
- data/app/models/spree/order/store_credit.rb +96 -0
- data/app/models/spree/order_contents.rb +6 -1
- data/app/models/spree/order_inventory.rb +4 -8
- data/app/models/spree/order_promotion.rb +6 -0
- data/app/models/spree/order_updater.rb +2 -7
- data/app/models/spree/payment.rb +46 -19
- data/app/models/spree/payment/gateway_options.rb +8 -4
- data/app/models/spree/payment_method.rb +12 -13
- data/app/models/spree/payment_method/store_credit.rb +130 -0
- data/app/models/spree/preference.rb +1 -1
- data/app/models/spree/price.rb +16 -6
- data/app/models/spree/product.rb +52 -49
- data/app/models/spree/product/scopes.rb +7 -2
- data/app/models/spree/product_option_type.rb +7 -2
- data/app/models/spree/product_promotion_rule.rb +9 -0
- data/app/models/spree/product_property.rb +8 -10
- data/app/models/spree/promotion.rb +19 -19
- data/app/models/spree/promotion/rules/product.rb +3 -1
- data/app/models/spree/promotion/rules/taxon.rb +2 -1
- data/app/models/spree/promotion/rules/user.rb +4 -4
- data/app/models/spree/promotion_action.rb +3 -3
- data/app/models/spree/promotion_category.rb +1 -1
- data/app/models/spree/promotion_rule_taxon.rb +9 -0
- data/app/models/spree/promotion_rule_user.rb +9 -0
- data/app/models/spree/property.rb +2 -1
- data/app/models/spree/property_prototype.rb +9 -0
- data/app/models/spree/prototype.rb +8 -3
- data/app/models/spree/prototype_taxon.rb +9 -0
- data/app/models/spree/refund.rb +10 -7
- data/app/models/spree/refund_reason.rb +1 -1
- data/app/models/spree/reimbursement.rb +12 -16
- data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +23 -6
- data/app/models/spree/reimbursement_type/store_credit.rb +28 -0
- data/app/models/spree/return_authorization.rb +8 -13
- data/app/models/spree/return_authorization_reason.rb +1 -1
- data/app/models/spree/return_item.rb +13 -12
- data/app/models/spree/return_item/eligibility_validator/time_since_purchase.rb +1 -1
- data/app/models/spree/role.rb +3 -2
- data/app/models/spree/role_user.rb +6 -0
- data/app/models/spree/shipment.rb +18 -23
- data/app/models/spree/shipment_handler.rb +2 -2
- data/app/models/spree/shipping_category.rb +6 -3
- data/app/models/spree/shipping_method.rb +11 -10
- data/app/models/spree/shipping_method_zone.rb +6 -0
- data/app/models/spree/shipping_rate.rb +16 -29
- data/app/models/spree/state.rb +3 -2
- data/app/models/spree/state_change.rb +1 -1
- data/app/models/spree/stock/content_item.rb +10 -12
- data/app/models/spree/stock/coordinator.rb +13 -14
- data/app/models/spree/stock/estimator.rb +28 -30
- data/app/models/spree/stock/inventory_unit_builder.rb +1 -9
- data/app/models/spree/stock/packer.rb +1 -1
- data/app/models/spree/stock/quantifier.rb +5 -5
- data/app/models/spree/stock/splitter/backordered.rb +2 -2
- data/app/models/spree/stock_item.rb +12 -18
- data/app/models/spree/stock_location.rb +4 -7
- data/app/models/spree/stock_movement.rb +11 -9
- data/app/models/spree/stock_transfer.rb +11 -12
- data/app/models/spree/store.rb +14 -6
- data/app/models/spree/store_credit.rb +252 -0
- data/app/models/spree/store_credit_category.rb +22 -0
- data/app/models/spree/store_credit_event.rb +38 -0
- data/app/models/spree/store_credit_type.rb +6 -0
- data/app/models/spree/tax_category.rb +3 -8
- data/app/models/spree/tax_rate.rb +56 -122
- data/app/models/spree/taxon.rb +11 -5
- data/app/models/spree/tracker.rb +12 -1
- data/app/models/spree/validations/db_maximum_length_validator.rb +2 -1
- data/app/models/spree/variant.rb +82 -50
- data/app/models/spree/zone.rb +21 -17
- data/app/models/spree/zone_member.rb +6 -0
- data/app/validators/db_maximum_length_validator.rb +11 -0
- data/app/views/layouts/spree/base_mailer.html.erb +38 -781
- data/app/views/spree/order_mailer/_adjustment.html.erb +8 -0
- data/app/views/spree/order_mailer/_subtotal.html.erb +8 -0
- data/app/views/spree/order_mailer/_total.html.erb +8 -0
- data/app/views/spree/order_mailer/cancel_email.html.erb +13 -28
- data/app/views/spree/order_mailer/cancel_email.text.erb +1 -1
- data/app/views/spree/order_mailer/confirm_email.html.erb +49 -63
- data/app/views/spree/order_mailer/confirm_email.text.erb +1 -1
- data/app/views/spree/shared/_base_mailer_header.html.erb +5 -7
- data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +777 -0
- data/app/views/spree/shared/_error_messages.html.erb +1 -1
- data/app/views/spree/shared/_mailer_line_item.html.erb +12 -0
- data/app/views/spree/shipment_mailer/shipped_email.html.erb +21 -14
- data/app/views/spree/shipment_mailer/shipped_email.text.erb +3 -3
- data/config/initializers/user_class_extensions.rb +7 -38
- data/config/locales/en.yml +113 -13
- data/config/routes.rb +7 -0
- data/db/default/spree/default_reimbursement_type.rb +1 -1
- data/db/default/spree/zones.rb +4 -5
- data/db/migrate/20150118210639_create_spree_store_credits.rb +24 -0
- data/db/migrate/20150118211500_create_spree_store_credit_categories.rb +8 -0
- data/db/migrate/20150118212051_create_spree_store_credit_events.rb +17 -0
- data/db/migrate/20150118212101_create_spree_store_credit_types.rb +10 -0
- data/db/migrate/20150314013438_add_missing_indexes.rb +25 -0
- data/db/migrate/20150317174308_remove_duplicated_indexes_from_multi_columns.rb +18 -0
- data/db/migrate/20150324104002_remove_user_index_from_spree_state_changes.rb +14 -0
- data/db/migrate/20150522071831_add_position_to_spree_payment_methods.rb +5 -0
- data/db/migrate/20150626181949_add_taxable_adjustment_total_to_line_item.rb +19 -0
- data/db/migrate/20150627090949_migrate_payment_methods_display.rb +12 -0
- data/db/migrate/20150714154102_spree_payment_method_store_credits.rb +12 -0
- data/db/migrate/20150726141425_rename_has_and_belongs_to_associations_to_model_names.rb +18 -0
- data/db/migrate/20150727191614_spree_store_credit_types.rb +11 -0
- data/db/migrate/20150819154308_add_discontinued_to_products_and_variants.rb +68 -0
- data/db/migrate/20151220072838_remove_shipping_method_id_from_spree_orders.rb +13 -0
- data/db/migrate/20160207191757_add_id_column_to_earlier_habtm_tables.rb +16 -0
- data/db/migrate/20160219165458_add_indexes.rb +14 -0
- data/lib/generators/spree/dummy/templates/rails/database.yml +31 -24
- data/lib/generators/spree/dummy/templates/rails/test.rb +2 -1
- data/lib/spree/core.rb +16 -0
- data/lib/spree/core/controller_helpers/auth.rb +1 -1
- data/lib/spree/core/controller_helpers/common.rb +3 -3
- data/lib/spree/core/controller_helpers/order.rb +6 -5
- data/lib/spree/core/controller_helpers/search.rb +1 -1
- data/lib/spree/core/controller_helpers/store.rb +29 -0
- data/lib/spree/core/delegate_belongs_to.rb +2 -2
- data/lib/spree/core/engine.rb +30 -25
- data/lib/spree/core/environment.rb +1 -1
- data/lib/spree/core/importer/order.rb +37 -40
- data/lib/spree/core/number_generator.rb +52 -0
- data/lib/spree/core/product_filters.rb +1 -1
- data/lib/spree/core/search/base.rb +4 -3
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/localized_number.rb +3 -1
- data/lib/spree/permitted_attributes.rb +5 -2
- data/lib/spree/testing_support/common_rake.rb +3 -3
- data/lib/spree/testing_support/factories.rb +3 -3
- data/lib/spree/testing_support/factories/address_factory.rb +1 -1
- data/lib/spree/testing_support/factories/country_factory.rb +2 -2
- data/lib/spree/testing_support/factories/order_factory.rb +2 -2
- data/lib/spree/testing_support/factories/payment_factory.rb +5 -0
- data/lib/spree/testing_support/factories/payment_method_factory.rb +8 -0
- data/lib/spree/testing_support/factories/promotion_rule_factory.rb +5 -0
- data/lib/spree/testing_support/factories/refund_factory.rb +9 -1
- data/lib/spree/testing_support/factories/return_authorization_factory.rb +2 -0
- data/lib/spree/testing_support/factories/state_factory.rb +2 -2
- data/lib/spree/testing_support/factories/store_credit_category_factory.rb +9 -0
- data/lib/spree/testing_support/factories/store_credit_event_factory.rb +8 -0
- data/lib/spree/testing_support/factories/store_credit_factory.rb +17 -0
- data/lib/spree/testing_support/factories/store_credit_type_factory.rb +11 -0
- data/lib/spree/testing_support/factories/user_factory.rb +1 -1
- data/lib/spree/testing_support/factories/zone_member_factory.rb +6 -0
- data/lib/spree/testing_support/microdata.rb +189 -0
- data/lib/tasks/core.rake +68 -0
- data/lib/tasks/exchanges.rake +2 -2
- data/spec/fixtures/microdata.html +22 -0
- data/spec/fixtures/microdata_itemref.html +15 -0
- data/spec/fixtures/microdata_no_itemscope.html +20 -0
- data/spec/helpers/base_helper_spec.rb +64 -1
- data/spec/helpers/products_helper_spec.rb +75 -3
- data/spec/lib/i18n_spec.rb +2 -2
- data/spec/lib/search/base_spec.rb +2 -2
- data/spec/lib/spree/core/controller_helpers/auth_spec.rb +4 -2
- data/spec/lib/spree/core/controller_helpers/store_spec.rb +56 -0
- data/spec/lib/spree/core/importer/order_spec.rb +226 -123
- data/spec/lib/spree/core/number_generator_spec.rb +175 -0
- data/spec/lib/spree/core_spec.rb +23 -0
- data/spec/lib/spree/localized_number_spec.rb +10 -0
- data/spec/mailers/order_mailer_spec.rb +11 -13
- data/spec/mailers/shipment_mailer_spec.rb +26 -8
- data/spec/mailers/test_mailer_spec.rb +15 -1
- data/spec/models/option_type_prototype_spec.rb +9 -0
- data/spec/models/spree/ability_spec.rb +6 -13
- data/spec/models/spree/address_spec.rb +1 -1
- 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 +2 -262
- data/spec/models/spree/adjustment_spec.rb +27 -1
- data/spec/models/spree/app_configuration_spec.rb +5 -2
- data/spec/models/spree/calculator/default_tax_spec.rb +39 -14
- data/spec/models/spree/concerns/user_methods_spec.rb +55 -0
- data/spec/models/spree/concerns/vat_price_calculation_spec.rb +66 -0
- data/spec/models/spree/country_spec.rb +45 -8
- data/spec/models/spree/credit_card_spec.rb +8 -8
- data/spec/models/spree/customer_return_spec.rb +4 -26
- data/spec/models/spree/gateway_spec.rb +7 -0
- data/spec/models/spree/image_spec.rb +3 -0
- data/spec/models/spree/inventory_unit_spec.rb +1 -18
- data/spec/models/spree/line_item_spec.rb +78 -18
- data/spec/models/spree/option_type_spec.rb +2 -2
- data/spec/models/spree/option_value_spec.rb +8 -3
- data/spec/models/spree/order/checkout_spec.rb +49 -39
- data/spec/models/spree/order/currency_updater_spec.rb +3 -3
- data/spec/models/spree/order/finalizing_spec.rb +0 -3
- data/spec/models/spree/order/payment_spec.rb +1 -1
- data/spec/models/spree/order/state_machine_spec.rb +1 -6
- data/spec/models/spree/order/store_credit_spec.rb +423 -0
- data/spec/models/spree/order/updating_spec.rb +2 -2
- data/spec/models/spree/order_contents_spec.rb +42 -1
- data/spec/models/spree/order_inventory_spec.rb +27 -17
- data/spec/models/spree/order_spec.rb +65 -52
- data/spec/models/spree/payment/gateway_options_spec.rb +10 -2
- 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 +22 -14
- data/spec/models/spree/payment_spec.rb +37 -44
- data/spec/models/spree/price_spec.rb +86 -0
- data/spec/models/spree/product/scopes_spec.rb +35 -0
- data/spec/models/spree/product_option_type_spec.rb +6 -2
- data/spec/models/spree/product_promotion_rule_spec.rb +9 -0
- data/spec/models/spree/product_property_spec.rb +11 -0
- data/spec/models/spree/product_spec.rb +82 -15
- data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +1 -1
- data/spec/models/spree/promotion/rules/user_spec.rb +8 -0
- data/spec/models/spree/promotion_action_spec.rb +1 -1
- data/spec/models/spree/promotion_rule_spec.rb +1 -1
- 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 +57 -36
- data/spec/models/spree/property_prototype_spec.rb +9 -0
- data/spec/models/spree/prototype_taxon_spec.rb +9 -0
- data/spec/models/spree/refund_reason_spec.rb +7 -0
- data/spec/models/spree/reimbursement_spec.rb +3 -30
- data/spec/models/spree/reimbursement_tax_calculator_spec.rb +17 -5
- 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 +2 -22
- data/spec/models/spree/return_item_spec.rb +50 -1
- data/spec/models/spree/returns_calculator_spec.rb +1 -1
- data/spec/models/spree/role_spec.rb +7 -0
- data/spec/models/spree/shipment_spec.rb +17 -17
- data/spec/models/spree/shipping_calculator_spec.rb +2 -2
- data/spec/models/spree/shipping_category_spec.rb +14 -0
- data/spec/models/spree/shipping_method_spec.rb +9 -2
- data/spec/models/spree/shipping_rate_spec.rb +40 -41
- data/spec/models/spree/state_spec.rb +12 -1
- data/spec/models/spree/stock/content_item_spec.rb +9 -0
- data/spec/models/spree/stock/estimator_spec.rb +56 -8
- data/spec/models/spree/stock/quantifier_spec.rb +61 -32
- data/spec/models/spree/stock_item_spec.rb +19 -1
- 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 +39 -11
- data/spec/models/spree/tax_category_spec.rb +6 -1
- data/spec/models/spree/tax_rate_spec.rb +204 -44
- data/spec/models/spree/user_spec.rb +105 -38
- data/spec/models/spree/variant_spec.rb +281 -9
- data/spec/models/spree/zone_member_spec.rb +38 -0
- data/spec/models/spree/zone_spec.rb +32 -8
- data/spec/spec_helper.rb +3 -0
- data/spec/support/concerns/{adjustment_source_spec.rb → adjustment_source.rb} +0 -0
- data/spec/support/concerns/{default_price_spec.rb → default_price.rb} +9 -0
- data/spec/validators/db_maximum_length_validator_spec.rb +22 -0
- data/spree_core.gemspec +5 -6
- metadata +99 -36
- data/CHANGELOG.md +0 -4
- data/app/models/concerns/spree/number_generator.rb +0 -39
- data/spec/models/spree/validations/db_maximum_length_validator_spec.rb +0 -24
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: f9219224ab5da53304d7ad652d631ab7b0d010b3
|
4
|
+
data.tar.gz: 20e8d4a23103d61d0495758998f4909aae5f3968
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f2f0bb0ccba4cf1bbee4db6545d530b7d42dc73ce10421eb9ec75ad0e55a26db33f353f2af95838d50340cf3158462561213704da6d57347dbeaca27da921b74
|
7
|
+
data.tar.gz: 56bc2c126244a948cf1c2b951161fcabf7604f07551df8451833f65499005e841f193c87248998f5825bb4c6323d4073989fefd86aeaf648d6daad2bfe9bfa1b
|
@@ -10,9 +10,15 @@ class window.Spree
|
|
10
10
|
@mountedAt: ->
|
11
11
|
"<%= Rails.application.routes.url_helpers.spree_path(trailing_slash: true) %>"
|
12
12
|
|
13
|
+
@adminPath: ->
|
14
|
+
'<%= Spree.admin_path.gsub(/\A(\/)?(.*[^\/])(\/)?\z/, '\\2/') %>'
|
15
|
+
|
13
16
|
@pathFor: (path) ->
|
14
17
|
locationOrigin = "#{window.location.protocol}//#{window.location.hostname}" + (if window.location.port then ":#{window.location.port}" else "")
|
15
|
-
"#{locationOrigin}#{@mountedAt()}#{path}"
|
18
|
+
@url("#{locationOrigin}#{@mountedAt()}#{path}", @url_params).toString()
|
19
|
+
|
20
|
+
@adminPathFor: (path) ->
|
21
|
+
@pathFor("#{@adminPath()}#{path}")
|
16
22
|
|
17
23
|
# Helper function to take a URL and add query parameters to it
|
18
24
|
# Uses the JSUri library from here: https://github.com/derek-watson/jsUri
|
@@ -45,6 +51,9 @@ class window.Spree
|
|
45
51
|
$.ajax(Spree.url(url).toString(), url_or_settings)
|
46
52
|
|
47
53
|
@routes:
|
48
|
-
states_search: @pathFor('api/states')
|
54
|
+
states_search: @pathFor('api/v1/states')
|
49
55
|
apply_coupon_code: (order_id) ->
|
50
|
-
Spree.pathFor("api/orders/#{order_id}/apply_coupon_code")
|
56
|
+
Spree.pathFor("api/v1/orders/#{order_id}/apply_coupon_code")
|
57
|
+
|
58
|
+
@url_params:
|
59
|
+
{}
|
@@ -17,7 +17,10 @@ module Spree
|
|
17
17
|
end
|
18
18
|
|
19
19
|
def display_price(product_or_variant)
|
20
|
-
product_or_variant.
|
20
|
+
product_or_variant.
|
21
|
+
price_in(current_currency).
|
22
|
+
display_price_including_vat_for(current_price_options).
|
23
|
+
to_html
|
21
24
|
end
|
22
25
|
|
23
26
|
def link_to_tracking(shipment, options = {})
|
@@ -30,11 +30,12 @@ module Spree
|
|
30
30
|
|
31
31
|
# converts line breaks in product description into <p> tags (for html display purposes)
|
32
32
|
def product_description(product)
|
33
|
-
if Spree::Config[:show_raw_product_description]
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
33
|
+
description = if Spree::Config[:show_raw_product_description]
|
34
|
+
product.description
|
35
|
+
else
|
36
|
+
product.description.to_s.gsub(/(.*?)\r?\n\r?\n/m, '<p>\1</p>')
|
37
|
+
end
|
38
|
+
description.blank? ? Spree.t(:product_has_no_description) : raw(description)
|
38
39
|
end
|
39
40
|
|
40
41
|
def line_item_description(variant)
|
@@ -54,7 +55,37 @@ module Spree
|
|
54
55
|
def cache_key_for_products
|
55
56
|
count = @products.count
|
56
57
|
max_updated_at = (@products.maximum(:updated_at) || Date.today).to_s(:number)
|
57
|
-
"
|
58
|
+
products_cache_keys = "spree/products/all-#{params[:page]}-#{max_updated_at}-#{count}"
|
59
|
+
(common_product_cache_keys + [products_cache_keys]).compact.join("/")
|
60
|
+
end
|
61
|
+
|
62
|
+
def cache_key_for_product(product = @product)
|
63
|
+
(common_product_cache_keys + [product.cache_key, product.possible_promotions]).compact.join("/")
|
64
|
+
end
|
65
|
+
|
66
|
+
def available_status(product) # will return a human readable string
|
67
|
+
return Spree.t(:discontinued) if product.discontinued?
|
68
|
+
return Spree.t(:deleted) if product.deleted?
|
69
|
+
|
70
|
+
if product.available?
|
71
|
+
Spree.t(:available)
|
72
|
+
elsif product.available_on && product.available_on.future?
|
73
|
+
Spree.t(:pending_sale)
|
74
|
+
else
|
75
|
+
Spree.t(:no_available_date_set)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
private
|
80
|
+
|
81
|
+
def common_product_cache_keys
|
82
|
+
[I18n.locale, current_currency] + price_options_cache_key
|
83
|
+
end
|
84
|
+
|
85
|
+
def price_options_cache_key
|
86
|
+
current_price_options.sort.map(&:last).map do |value|
|
87
|
+
value.try(:cache_key) || value
|
88
|
+
end
|
58
89
|
end
|
59
90
|
end
|
60
91
|
end
|
@@ -1,6 +1,5 @@
|
|
1
1
|
module Spree
|
2
2
|
class BaseMailer < ActionMailer::Base
|
3
|
-
|
4
3
|
def from_address
|
5
4
|
Spree::Store.current.mail_from_address
|
6
5
|
end
|
@@ -10,9 +9,19 @@ module Spree
|
|
10
9
|
end
|
11
10
|
helper_method :money
|
12
11
|
|
13
|
-
def mail(headers={}, &block)
|
12
|
+
def mail(headers = {}, &block)
|
13
|
+
ensure_default_action_mailer_url_host
|
14
14
|
super if Spree::Config[:send_core_emails]
|
15
15
|
end
|
16
16
|
|
17
|
+
private
|
18
|
+
|
19
|
+
# this ensures that ActionMailer::Base.default_url_options[:host] is always set
|
20
|
+
# this is only a fail-safe solution if developer didn't set this in environment files
|
21
|
+
# http://guides.rubyonrails.org/action_mailer_basics.html#generating-urls-in-action-mailer-views
|
22
|
+
def ensure_default_action_mailer_url_host
|
23
|
+
ActionMailer::Base.default_url_options ||= {}
|
24
|
+
ActionMailer::Base.default_url_options[:host] ||= Spree::Store.current.url
|
25
|
+
end
|
17
26
|
end
|
18
27
|
end
|
@@ -14,7 +14,7 @@ module Spree
|
|
14
14
|
return if amount == 0
|
15
15
|
adjustments.new(order: order,
|
16
16
|
adjustable: adjustable,
|
17
|
-
label: label
|
17
|
+
label: label,
|
18
18
|
amount: amount,
|
19
19
|
included: included).save
|
20
20
|
end
|
@@ -41,20 +41,13 @@ module Spree
|
|
41
41
|
end
|
42
42
|
|
43
43
|
def deals_with_adjustments_for_deleted_source
|
44
|
-
adjustment_scope = adjustments.includes(:order).references(:spree_orders)
|
45
|
-
|
46
44
|
# For incomplete orders, remove the adjustment completely.
|
47
|
-
|
45
|
+
adjustments.for_incomplete_order.destroy_all
|
48
46
|
|
49
47
|
# For complete orders, the source will be invalid.
|
50
48
|
# Therefore we nullify the source_id, leaving the adjustment in place.
|
51
49
|
# This would mean that the order's total is not altered at all.
|
52
|
-
|
53
|
-
adjustment.update_columns(
|
54
|
-
source_id: nil,
|
55
|
-
updated_at: Time.now,
|
56
|
-
)
|
57
|
-
end
|
50
|
+
adjustments.for_complete_order.update_all(source_id: nil, updated_at: Time.current)
|
58
51
|
end
|
59
52
|
end
|
60
53
|
end
|
@@ -8,7 +8,13 @@ module Spree
|
|
8
8
|
class_name: 'Spree::Price',
|
9
9
|
dependent: :destroy
|
10
10
|
|
11
|
-
delegate_belongs_to :default_price,
|
11
|
+
delegate_belongs_to :default_price,
|
12
|
+
:display_price,
|
13
|
+
:display_amount,
|
14
|
+
:price,
|
15
|
+
:price=,
|
16
|
+
:price_including_vat_for,
|
17
|
+
:currency
|
12
18
|
|
13
19
|
after_save :save_default_price
|
14
20
|
|
@@ -6,7 +6,7 @@ module Spree
|
|
6
6
|
scope :active, -> { where(active: true) }
|
7
7
|
default_scope { order("LOWER(#{self.table_name}.name)") }
|
8
8
|
|
9
|
-
validates :name, presence: true, uniqueness: { case_sensitive: false }
|
9
|
+
validates :name, presence: true, uniqueness: { case_sensitive: false, allow_blank: true }
|
10
10
|
end
|
11
11
|
end
|
12
12
|
end
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module Spree
|
2
2
|
module UserApiAuthentication
|
3
3
|
def generate_spree_api_key!
|
4
|
-
self.spree_api_key =
|
4
|
+
self.spree_api_key = generate_spree_api_key
|
5
5
|
save!
|
6
6
|
end
|
7
7
|
|
@@ -9,5 +9,11 @@ module Spree
|
|
9
9
|
self.spree_api_key = nil
|
10
10
|
save!
|
11
11
|
end
|
12
|
+
|
13
|
+
private
|
14
|
+
|
15
|
+
def generate_spree_api_key
|
16
|
+
SecureRandom.hex(24)
|
17
|
+
end
|
12
18
|
end
|
13
19
|
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Spree
|
2
|
+
module UserMethods
|
3
|
+
extend ActiveSupport::Concern
|
4
|
+
|
5
|
+
include Spree::UserApiAuthentication
|
6
|
+
include Spree::UserPaymentSource
|
7
|
+
include Spree::UserReporting
|
8
|
+
include Spree::RansackableAttributes
|
9
|
+
|
10
|
+
included do
|
11
|
+
has_many :role_users, class_name: 'Spree::RoleUser', foreign_key: :user_id, dependent: :destroy
|
12
|
+
has_many :spree_roles, through: :role_users, class_name: 'Spree::Role', source: :role
|
13
|
+
|
14
|
+
has_many :promotion_rule_users, class_name: 'Spree::PromotionRuleUser', foreign_key: :user_id, dependent: :destroy
|
15
|
+
has_many :promotion_rules, through: :promotion_rule_users, class_name: 'Spree::PromotionRule'
|
16
|
+
|
17
|
+
has_many :orders, foreign_key: :user_id, class_name: "Spree::Order"
|
18
|
+
has_many :store_credits, foreign_key: :user_id, class_name: 'Spree::StoreCredit'
|
19
|
+
|
20
|
+
belongs_to :ship_address, class_name: 'Spree::Address'
|
21
|
+
belongs_to :bill_address, class_name: 'Spree::Address'
|
22
|
+
|
23
|
+
self.whitelisted_ransackable_associations = %w[bill_address ship_address]
|
24
|
+
self.whitelisted_ransackable_attributes = %w[id email]
|
25
|
+
end
|
26
|
+
|
27
|
+
# has_spree_role? simply needs to return true or false whether a user has a role or not.
|
28
|
+
def has_spree_role?(role_in_question)
|
29
|
+
spree_roles.any? { |role| role.name == role_in_question.to_s }
|
30
|
+
end
|
31
|
+
|
32
|
+
def last_incomplete_spree_order
|
33
|
+
orders.incomplete.
|
34
|
+
includes(line_items: [variant: [:images, :option_values, :product]]).
|
35
|
+
order('created_at DESC').
|
36
|
+
first
|
37
|
+
end
|
38
|
+
|
39
|
+
def analytics_id
|
40
|
+
id
|
41
|
+
end
|
42
|
+
|
43
|
+
def total_available_store_credit
|
44
|
+
store_credits.reload.to_a.sum(&:amount_remaining)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
@@ -4,11 +4,11 @@ module Spree
|
|
4
4
|
money_methods :lifetime_value, :average_order_value
|
5
5
|
|
6
6
|
def lifetime_value
|
7
|
-
orders.complete.
|
7
|
+
orders.complete.sum(:total)
|
8
8
|
end
|
9
9
|
|
10
10
|
def order_count
|
11
|
-
BigDecimal(orders.complete.
|
11
|
+
BigDecimal(orders.complete.size)
|
12
12
|
end
|
13
13
|
|
14
14
|
def average_order_value
|
@@ -0,0 +1,47 @@
|
|
1
|
+
module Spree
|
2
|
+
module VatPriceCalculation
|
3
|
+
def gross_amount(amount, price_options)
|
4
|
+
return amount unless outside_default_vat_zone?(price_options)
|
5
|
+
round_to_two_places(add_foreign_vat_for(amount, price_options))
|
6
|
+
end
|
7
|
+
|
8
|
+
private
|
9
|
+
|
10
|
+
def add_foreign_vat_for(amount, price_options)
|
11
|
+
amount = net_amount(amount, price_options[:tax_category])
|
12
|
+
amount_with_foreign_vat(amount, price_options)
|
13
|
+
end
|
14
|
+
|
15
|
+
def net_amount(amount, tax_category)
|
16
|
+
amount / (1 + default_vat(tax_category))
|
17
|
+
end
|
18
|
+
|
19
|
+
def default_vat(tax_category)
|
20
|
+
included_tax_amount(tax_zone: default_zone, tax_category: tax_category)
|
21
|
+
end
|
22
|
+
|
23
|
+
def foreign_vat(price_options)
|
24
|
+
included_tax_amount(price_options)
|
25
|
+
end
|
26
|
+
|
27
|
+
def amount_with_foreign_vat(amount, price_options)
|
28
|
+
amount * (1 + foreign_vat(price_options))
|
29
|
+
end
|
30
|
+
|
31
|
+
def outside_default_vat_zone?(price_options)
|
32
|
+
price_options[:tax_zone] && default_zone && price_options[:tax_zone] != default_zone
|
33
|
+
end
|
34
|
+
|
35
|
+
def included_tax_amount(price_options)
|
36
|
+
Spree::TaxRate.included_tax_amount_for(price_options).to_f
|
37
|
+
end
|
38
|
+
|
39
|
+
def default_zone
|
40
|
+
@_default_zone ||= Spree::Zone.default_tax
|
41
|
+
end
|
42
|
+
|
43
|
+
def round_to_two_places(amount)
|
44
|
+
BigDecimal.new(amount.to_s).round(2, BigDecimal::ROUND_HALF_UP)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
data/app/models/spree/address.rb
CHANGED
@@ -7,16 +7,17 @@ module Spree
|
|
7
7
|
|
8
8
|
has_many :shipments, inverse_of: :address
|
9
9
|
|
10
|
-
|
11
|
-
|
12
|
-
|
10
|
+
with_options presence: true do
|
11
|
+
validates :firstname, :lastname, :address1, :city, :country
|
12
|
+
validates :zipcode, if: :require_zipcode?
|
13
|
+
validates :phone, if: :require_phone?
|
14
|
+
end
|
13
15
|
|
14
16
|
validate :state_validate, :postal_code_validate
|
15
17
|
|
16
18
|
alias_attribute :first_name, :firstname
|
17
19
|
alias_attribute :last_name, :lastname
|
18
20
|
|
19
|
-
|
20
21
|
self.whitelisted_ransackable_attributes = %w[firstname lastname company]
|
21
22
|
|
22
23
|
def self.build_default
|
@@ -25,7 +26,7 @@ module Spree
|
|
25
26
|
end
|
26
27
|
|
27
28
|
def self.default(user = nil, kind = "bill")
|
28
|
-
if user && user_address = user.
|
29
|
+
if user && user_address = user.public_send(:"#{kind}_address")
|
29
30
|
user_address.clone
|
30
31
|
else
|
31
32
|
build_default
|
@@ -64,13 +65,13 @@ module Spree
|
|
64
65
|
self_attrs = self.attributes
|
65
66
|
other_attrs = other_address.respond_to?(:attributes) ? other_address.attributes : {}
|
66
67
|
|
67
|
-
[self_attrs, other_attrs].each { |attrs| attrs.except!('id', 'created_at', 'updated_at'
|
68
|
+
[self_attrs, other_attrs].each { |attrs| attrs.except!('id', 'created_at', 'updated_at') }
|
68
69
|
|
69
70
|
self_attrs == other_attrs
|
70
71
|
end
|
71
72
|
|
72
73
|
def empty?
|
73
|
-
attributes.except('id', 'created_at', 'updated_at', '
|
74
|
+
attributes.except('id', 'created_at', 'updated_at', 'country_id').all? { |_, v| v.nil? }
|
74
75
|
end
|
75
76
|
|
76
77
|
# Generates an ActiveMerchant compatible address hash
|
@@ -0,0 +1,25 @@
|
|
1
|
+
module Spree
|
2
|
+
module Adjustable
|
3
|
+
module Adjuster
|
4
|
+
class Base
|
5
|
+
def self.adjust(adjustable, totals)
|
6
|
+
new(adjustable, totals).update
|
7
|
+
end
|
8
|
+
|
9
|
+
def initialize(adjustable, totals)
|
10
|
+
@adjustable = adjustable
|
11
|
+
@totals = totals
|
12
|
+
end
|
13
|
+
|
14
|
+
def update
|
15
|
+
raise NotImplementedError, "Please implement 'update' in your adjuster: #{self.class.name}"
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
attr_reader :adjustable
|
21
|
+
delegate :adjustments, to: :adjustable
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
module Spree
|
2
|
+
module Adjustable
|
3
|
+
module Adjuster
|
4
|
+
class Promotion < Spree::Adjustable::Adjuster::Base
|
5
|
+
def update
|
6
|
+
promo_adjustments = adjustments.competing_promos.reload.map { |a| a.update!(adjustable) }
|
7
|
+
promos_total = promo_adjustments.compact.sum
|
8
|
+
choose_best_promo_adjustment unless promos_total == 0
|
9
|
+
promo_total = best_promo_adjustment.try(:amount).to_f if best_promo_adjustment.try(:promotion?)
|
10
|
+
|
11
|
+
update_totals(promo_total)
|
12
|
+
end
|
13
|
+
|
14
|
+
private
|
15
|
+
|
16
|
+
# Picks one (and only one) competing discount to be eligible for
|
17
|
+
# this order. This adjustment provides the most discount, and if
|
18
|
+
# two adjustments have the same amount, then it will pick the
|
19
|
+
# latest one.
|
20
|
+
def choose_best_promo_adjustment
|
21
|
+
if best_promo_adjustment
|
22
|
+
other_promotions = adjustments.competing_promos.where.not(id: best_promo_adjustment.id)
|
23
|
+
other_promotions.update_all(eligible: false)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def best_promo_adjustment
|
28
|
+
@best_promo_adjustment ||= begin
|
29
|
+
adjustments.competing_promos.eligible.reorder("amount ASC, created_at DESC, id DESC").first
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def update_totals(promo_total)
|
34
|
+
promo_total ||= 0.0
|
35
|
+
@totals[:promo_total] = promo_total
|
36
|
+
@totals[:taxable_adjustment_total] += promo_total
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|