spree_core 2.1.12 → 2.2.0
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/helpers/spree/base_helper.rb +4 -7
- data/app/helpers/spree/products_helper.rb +11 -9
- data/app/helpers/spree/store_helper.rb +5 -0
- data/app/models/spree/ability.rb +4 -0
- data/app/models/spree/address.rb +6 -6
- data/app/models/spree/adjustment.rb +40 -61
- data/app/models/spree/app_configuration.rb +1 -14
- data/app/models/spree/calculator.rb +12 -4
- data/app/models/spree/calculator/default_tax.rb +42 -38
- data/app/models/spree/calculator/flat_percent_item_total.rb +2 -4
- data/app/models/spree/calculator/free_shipping.rb +5 -2
- data/app/models/spree/calculator/percent_on_line_item.rb +15 -0
- data/app/models/spree/calculator/percent_per_item.rb +3 -0
- data/app/models/spree/classification.rb +3 -2
- data/app/models/spree/credit_card.rb +7 -25
- data/app/models/spree/gateway/bogus.rb +5 -5
- data/app/models/spree/gateway/bogus_simple.rb +0 -8
- data/app/models/spree/image.rb +0 -9
- data/app/models/spree/inventory_unit.rb +10 -4
- data/app/models/spree/item_adjustments.rb +65 -0
- data/app/models/spree/legacy_user.rb +1 -0
- data/app/models/spree/line_item.rb +33 -13
- data/app/models/spree/option_type.rb +2 -2
- data/app/models/spree/option_value.rb +1 -1
- data/app/models/spree/order.rb +109 -89
- data/app/models/spree/order/checkout.rb +48 -0
- data/app/models/spree/order_contents.rb +72 -37
- data/app/models/spree/order_inventory.rb +65 -68
- data/app/models/spree/order_populator.rb +3 -17
- data/app/models/spree/order_updater.rb +63 -44
- data/app/models/spree/payment.rb +20 -5
- data/app/models/spree/payment/processing.rb +19 -25
- data/app/models/spree/payment_capture_event.rb +9 -0
- data/app/models/spree/payment_method/check.rb +0 -2
- data/app/models/spree/price.rb +1 -1
- data/app/models/spree/product.rb +14 -16
- data/app/models/spree/product/scopes.rb +4 -6
- data/app/models/spree/product_option_type.rb +2 -2
- data/app/models/spree/product_property.rb +2 -2
- data/app/models/spree/promotion.rb +71 -50
- data/app/models/spree/promotion/actions/create_adjustment.rb +31 -32
- data/app/models/spree/promotion/actions/create_item_adjustments.rb +83 -0
- data/app/models/spree/promotion/actions/free_shipping.rb +36 -0
- data/app/models/spree/promotion/rules/first_order.rb +4 -0
- data/app/models/spree/promotion/rules/item_total.rb +5 -1
- data/app/models/spree/promotion/rules/product.rb +4 -0
- data/app/models/spree/promotion/rules/user.rb +5 -6
- data/app/models/spree/promotion/rules/user_logged_in.rb +4 -0
- data/app/models/spree/promotion_action.rb +1 -5
- data/app/models/spree/promotion_handler/cart.rb +38 -0
- data/app/models/spree/promotion_handler/coupon.rb +76 -0
- data/app/models/spree/promotion_handler/free_shipping.rb +31 -0
- data/app/models/spree/promotion_handler/page.rb +24 -0
- data/app/models/spree/promotion_rule.rb +15 -7
- data/app/models/spree/property.rb +1 -1
- data/app/models/spree/return_authorization.rb +7 -1
- data/app/models/spree/shipment.rb +113 -49
- data/app/models/spree/shipping_calculator.rb +4 -5
- data/app/models/spree/shipping_category.rb +2 -2
- data/app/models/spree/shipping_method.rb +12 -6
- data/app/models/spree/shipping_rate.rb +27 -7
- data/app/models/spree/stock/availability_validator.rb +1 -1
- data/app/models/spree/stock/estimator.rb +13 -1
- data/app/models/spree/stock/package.rb +11 -7
- data/app/models/spree/stock/packer.rb +3 -3
- data/app/models/spree/stock/quantifier.rb +9 -1
- data/app/models/spree/stock_item.rb +11 -6
- data/app/models/spree/stock_movement.rb +1 -2
- data/app/models/spree/tax_category.rb +6 -1
- data/app/models/spree/tax_rate.rb +57 -49
- data/app/models/spree/taxon.rb +10 -5
- data/app/models/spree/taxonomy.rb +5 -2
- data/app/models/spree/variant.rb +33 -16
- data/app/models/spree/zone.rb +24 -24
- data/app/views/spree/shared/_routes.html.erb +3 -0
- data/config/locales/en.yml +42 -26
- data/db/migrate/20130213191427_create_default_stock.rb +3 -3
- data/db/migrate/20130413230529_add_name_to_spree_credit_cards.rb +5 -0
- data/db/migrate/20130414000512_update_name_fields_on_spree_credit_cards.rb +13 -0
- data/db/migrate/20130417120035_update_adjustment_states.rb +2 -2
- data/db/migrate/20130417123427_add_shipping_rates_to_shipments.rb +1 -1
- data/db/migrate/20130509115210_add_number_to_stock_transfer.rb +1 -1
- data/db/migrate/20130611054351_rename_shipping_methods_zones_to_spree_shipping_methods_zones.rb +0 -5
- data/db/migrate/20130802022321_migrate_tax_categories_to_line_items.rb +7 -5
- data/db/migrate/20130807024301_upgrade_adjustments.rb +39 -0
- data/db/migrate/20130807024302_rename_adjustment_fields.rb +17 -0
- data/db/migrate/20130813004002_add_shipment_total_to_spree_orders.rb +5 -0
- data/db/migrate/20130813232134_rename_activators_to_promotions.rb +5 -0
- data/db/migrate/20130815000406_add_adjustment_total_to_line_items.rb +5 -0
- data/db/migrate/20130815024413_add_adjustment_total_to_shipments.rb +5 -0
- data/db/migrate/20130828234942_add_tax_total_to_line_items_shipments_and_orders.rb +8 -0
- data/db/migrate/20130830001159_migrate_old_shipping_calculators.rb +1 -1
- data/db/migrate/20130903183026_add_code_to_spree_promotion_rules.rb +5 -0
- data/db/migrate/20130917024658_remove_promotions_event_name_field.rb +5 -0
- data/db/migrate/20130924040529_add_promo_total_to_line_items_and_shipments_and_orders.rb +7 -0
- data/db/migrate/20131001013410_remove_unused_credit_card_fields.rb +7 -3
- data/db/migrate/20131107132123_add_tax_category_to_variants.rb +6 -0
- data/db/migrate/20131118043959_add_included_to_adjustments.rb +5 -0
- data/db/migrate/20131118050234_rename_tax_total_fields.rb +11 -0
- data/db/migrate/20131118183431_add_line_item_id_to_spree_inventory_units.rb +21 -0
- data/db/migrate/20131127001002_add_position_to_classifications.rb +5 -0
- data/db/migrate/20131211112807_create_spree_orders_promotions.rb +8 -0
- data/db/migrate/20131218054603_add_item_count_to_spree_orders.rb +5 -0
- data/db/migrate/20140106224208_rename_permalink_to_slug_for_products.rb +5 -0
- data/db/migrate/20140124023232_rename_activator_id_in_rules_and_actions_to_promotion_id.rb +6 -0
- data/db/migrate/20140203161722_add_approver_id_and_approved_at_to_orders.rb +6 -0
- data/db/migrate/20140204115338_add_confirmation_delivered_to_spree_orders.rb +5 -0
- data/db/migrate/20140205120320_create_spree_payment_capture_events.rb +12 -0
- data/db/migrate/20140205144710_add_uncaptured_amount_to_payments.rb +5 -0
- data/db/migrate/20140207085910_add_tax_category_id_to_shipping_methods.rb +5 -0
- data/db/migrate/20140207093021_add_tax_rate_id_to_shipping_rates.rb +5 -0
- data/db/migrate/20140211040159_add_pre_tax_amount_to_line_items_and_shipments.rb +6 -0
- data/db/migrate/20140213184916_add_more_indexes.rb +13 -0
- data/db/migrate/20140219060952_add_considered_risky_to_orders.rb +5 -0
- data/lib/generators/spree/dummy/dummy_generator.rb +1 -6
- data/lib/generators/spree/install/install_generator.rb +6 -6
- data/lib/generators/spree/install/templates/{app/assets/javascripts/admin → vendor/assets/javascripts/spree/backend}/all.js +3 -3
- data/lib/generators/spree/install/templates/{app/assets/javascripts/store → vendor/assets/javascripts/spree/frontend}/all.js +3 -3
- data/lib/generators/spree/install/templates/{app/assets/stylesheets/store → vendor/assets/stylesheets/spree/backend}/all.css +3 -3
- data/lib/generators/spree/install/templates/{app/assets/stylesheets/admin → vendor/assets/stylesheets/spree/frontend}/all.css +3 -3
- data/lib/spree/core.rb +21 -8
- data/lib/spree/core/calculated_adjustments.rb +0 -40
- data/lib/spree/core/controller_helpers.rb +5 -0
- data/lib/spree/core/controller_helpers/auth.rb +2 -2
- data/lib/spree/core/controller_helpers/common.rb +0 -5
- data/lib/spree/core/controller_helpers/order.rb +8 -9
- data/lib/spree/core/engine.rb +10 -17
- data/lib/spree/core/permalinks.rb +1 -1
- data/lib/spree/core/product_duplicator.rb +3 -8
- data/lib/spree/core/user_address.rb +1 -1
- data/lib/spree/core/validators/email.rb +23 -1
- data/lib/spree/core/version.rb +1 -1
- data/lib/spree/money.rb +1 -1
- data/lib/spree/permitted_attributes.rb +2 -2
- data/lib/spree/testing_support/caching.rb +47 -0
- data/lib/spree/testing_support/factories/adjustment_factory.rb +11 -2
- data/lib/spree/testing_support/factories/credit_card_factory.rb +2 -1
- data/lib/spree/testing_support/factories/order_factory.rb +10 -5
- data/lib/spree/testing_support/factories/payment_factory.rb +2 -2
- data/lib/spree/testing_support/factories/payment_method_factory.rb +3 -3
- data/lib/spree/testing_support/factories/promotion_factory.rb +16 -1
- data/lib/spree/testing_support/factories/shipment_factory.rb +8 -4
- data/lib/spree/testing_support/factories/shipping_method_factory.rb +1 -3
- data/lib/spree/testing_support/factories/stock_factory.rb +1 -1
- data/lib/spree/testing_support/factories/tax_rate_factory.rb +2 -2
- data/lib/spree/testing_support/order_walkthrough.rb +1 -1
- data/lib/tasks/core.rake +2 -2
- data/vendor/assets/fonts/FontAwesome.otf +0 -0
- data/vendor/assets/fonts/fontawesome-webfont.eot +0 -0
- data/vendor/assets/fonts/fontawesome-webfont.svg +399 -0
- data/vendor/assets/fonts/fontawesome-webfont.ttf +0 -0
- data/vendor/assets/fonts/fontawesome-webfont.woff +0 -0
- data/vendor/assets/stylesheets/font-awesome.scss +1475 -0
- metadata +73 -44
- data/app/assets/javascripts/admin/handlebar_extensions.js +0 -9
- data/app/helpers/spree/admin/adjustments_helper.rb +0 -26
- data/app/helpers/spree/admin/images_helper.rb +0 -18
- data/app/helpers/spree/promotion_rules_helper.rb +0 -13
- data/app/models/spree/activator.rb +0 -29
- data/app/models/spree/calculator/per_item.rb +0 -41
- data/app/models/spree/stock/remaining_packer.rb +0 -22
- data/app/views/spree/payments/_payment.html.erb +0 -18
- data/db/migrate/20131118041203_add_tax_total_to_spree_orders.rb +0 -5
- data/db/migrate/20131118043021_add_order_id_to_spree_adjustments.rb +0 -6
- data/db/migrate/20131118074808_add_included_to_spree_adjustments.rb +0 -5
- data/db/migrate/20140415041315_add_user_id_created_by_id_index_to_order.rb +0 -5
- data/lib/spree/core/gateway_error.rb +0 -5
- data/lib/spree/core/preference_rescue.rb +0 -25
- data/lib/spree/core/s3_support.rb +0 -25
- data/lib/spree/promo/coupon_applicator.rb +0 -71
- data/lib/spree/testing_support/factories/activator_factory.rb +0 -8
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: bec161c547d1c0a301e068937cff9a461ff7a6cc
|
4
|
+
data.tar.gz: 5ea11fca1a903043e7776db55c5092a676a31c40
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1f618e1c470a7a552a2b6b97d72b2702c52d8beba2298d6ab6400982f024a466bc9b857af1e3b447ca5ab8c079d8d44bac78877516baa1a8962ef7f9eac0b244
|
7
|
+
data.tar.gz: 3be703d2a9d163edb81d227463859a7cb5a181091539780f5b0eb4173ad2f69cf8ff74e824361d312e6571ffbbedef6c8f12eb06fb6649cd2902771f5f537754
|
@@ -13,16 +13,14 @@ module Spree
|
|
13
13
|
end
|
14
14
|
|
15
15
|
def link_to_cart(text = nil)
|
16
|
-
return "" if current_spree_page?(spree.cart_path)
|
17
|
-
|
18
16
|
text = text ? h(text) : Spree.t('cart')
|
19
17
|
css_class = nil
|
20
18
|
|
21
|
-
if
|
19
|
+
if simple_current_order.nil? or simple_current_order.item_count.zero?
|
22
20
|
text = "#{text}: (#{Spree.t('empty')})"
|
23
21
|
css_class = 'empty'
|
24
22
|
else
|
25
|
-
text = "#{text}: (#{
|
23
|
+
text = "#{text}: (#{simple_current_order.item_count}) <span class='amount'>#{simple_current_order.display_total.to_html}</span>".html_safe
|
26
24
|
css_class = 'full'
|
27
25
|
end
|
28
26
|
|
@@ -120,7 +118,7 @@ module Spree
|
|
120
118
|
countries.collect do |country|
|
121
119
|
country.name = Spree.t(country.iso, scope: 'country_names', default: country.name)
|
122
120
|
country
|
123
|
-
end.
|
121
|
+
end.sort { |a, b| a.name.parameterize <=> b.name.parameterize }
|
124
122
|
end
|
125
123
|
|
126
124
|
def seo_url(taxon)
|
@@ -164,10 +162,9 @@ module Spree
|
|
164
162
|
end
|
165
163
|
|
166
164
|
private
|
167
|
-
|
168
165
|
# Returns style of image or nil
|
169
166
|
def image_style_from_method_name(method_name)
|
170
|
-
if
|
167
|
+
if style = method_name.to_s.sub(/_image$/, '')
|
171
168
|
possible_styles = Spree::Image.attachment_definitions[:attachment][:styles]
|
172
169
|
style if style.in? possible_styles.with_indifferent_access
|
173
170
|
end
|
@@ -12,13 +12,14 @@ module Spree
|
|
12
12
|
|
13
13
|
# returns the formatted price for the specified variant as a difference from product price
|
14
14
|
def variant_price_diff(variant)
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
diff
|
19
|
-
|
20
|
-
|
21
|
-
|
15
|
+
diff = variant.amount_in(current_currency) - variant.product.amount_in(current_currency)
|
16
|
+
return nil if diff == 0
|
17
|
+
amount = Spree::Money.new(diff.abs, { currency: current_currency }).to_html
|
18
|
+
if diff > 0
|
19
|
+
"(#{Spree.t(:add)}: #{amount})".html_safe
|
20
|
+
else
|
21
|
+
"(#{Spree.t(:subtract)}: #{amount})".html_safe
|
22
|
+
end
|
22
23
|
end
|
23
24
|
|
24
25
|
# returns the formatted full price for the variant, if at least one variant price differs from product price
|
@@ -52,8 +53,9 @@ module Spree
|
|
52
53
|
end
|
53
54
|
end
|
54
55
|
|
55
|
-
def
|
56
|
-
|
56
|
+
def cache_key_for_products
|
57
|
+
max_updated_at = @products.maximum(:updated_at).to_s(:number)
|
58
|
+
"#{current_currency}/spree/products/all-#{params[:page]}-#{max_updated_at}"
|
57
59
|
end
|
58
60
|
end
|
59
61
|
end
|
data/app/models/spree/ability.rb
CHANGED
@@ -47,6 +47,10 @@ module Spree
|
|
47
47
|
can :update, Order do |order, token|
|
48
48
|
order.user == user || order.token && token == order.token
|
49
49
|
end
|
50
|
+
can [:create, :read], Address
|
51
|
+
can :update, Address do |address|
|
52
|
+
user.bill_address == address || user.ship_address == address
|
53
|
+
end
|
50
54
|
can [:index, :read], Product
|
51
55
|
can [:index, :read], ProductProperty
|
52
56
|
can [:index, :read], Property
|
data/app/models/spree/address.rb
CHANGED
@@ -3,7 +3,7 @@ module Spree
|
|
3
3
|
belongs_to :country, class_name: "Spree::Country"
|
4
4
|
belongs_to :state, class_name: "Spree::State"
|
5
5
|
|
6
|
-
has_many :shipments
|
6
|
+
has_many :shipments, inverse_of: :address
|
7
7
|
|
8
8
|
validates :firstname, :lastname, :address1, :city, :country, presence: true
|
9
9
|
validates :zipcode, presence: true, if: :require_zipcode?
|
@@ -19,11 +19,6 @@ module Spree
|
|
19
19
|
new(country: country)
|
20
20
|
end
|
21
21
|
|
22
|
-
# Can modify an address if it's not been used in an order (but checkouts controller has finer control)
|
23
|
-
# def editable?
|
24
|
-
# new_record? || (shipments.empty? && checkouts.empty?)
|
25
|
-
# end
|
26
|
-
|
27
22
|
def self.default(user = nil, kind = "bill")
|
28
23
|
if user
|
29
24
|
user.send(:"#{kind}_address") || build_default
|
@@ -32,6 +27,11 @@ module Spree
|
|
32
27
|
end
|
33
28
|
end
|
34
29
|
|
30
|
+
# Can modify an address if it's not been used in an order (but checkouts controller has finer control)
|
31
|
+
# def editable?
|
32
|
+
# new_record? || (shipments.empty? && checkouts.empty?)
|
33
|
+
# end
|
34
|
+
|
35
35
|
def full_name
|
36
36
|
"#{firstname} #{lastname}".strip
|
37
37
|
end
|
@@ -1,10 +1,8 @@
|
|
1
1
|
# Adjustments represent a change to the +item_total+ of an Order. Each adjustment
|
2
2
|
# has an +amount+ that can be either positive or negative.
|
3
3
|
#
|
4
|
-
# Adjustments can be
|
5
|
-
#
|
6
|
-
# Once an adjustment is finalized, it cannot be changed, but an adjustment can
|
7
|
-
# toggle between open/closed as needed
|
4
|
+
# Adjustments can be "opened" or "closed".
|
5
|
+
# Once an adjustment is closed, it will not be automatically updated.
|
8
6
|
#
|
9
7
|
# Boolean attributes:
|
10
8
|
#
|
@@ -26,83 +24,67 @@ module Spree
|
|
26
24
|
class Adjustment < ActiveRecord::Base
|
27
25
|
belongs_to :adjustable, polymorphic: true
|
28
26
|
belongs_to :source, polymorphic: true
|
29
|
-
belongs_to :
|
30
|
-
belongs_to :order, :class_name => 'Spree::Order'
|
27
|
+
belongs_to :order, :class_name => "Spree::Order"
|
31
28
|
|
32
29
|
validates :label, presence: true
|
33
30
|
validates :amount, numericality: true
|
34
31
|
|
35
|
-
after_save :update_adjustable
|
36
|
-
after_destroy :update_adjustable
|
37
|
-
|
38
32
|
state_machine :state, initial: :open do
|
39
33
|
event :close do
|
40
34
|
transition from: :open, to: :closed
|
41
35
|
end
|
42
36
|
|
43
|
-
event :
|
44
|
-
transition from: :
|
45
|
-
end
|
46
|
-
|
47
|
-
event :finalize do
|
48
|
-
transition from: [:open, :closed], to: :finalized
|
37
|
+
event :close do
|
38
|
+
transition from: :close, to: :open
|
49
39
|
end
|
50
40
|
end
|
51
41
|
|
52
|
-
|
42
|
+
after_create :update_adjustable_adjustment_total
|
43
|
+
|
44
|
+
scope :open, -> { where(state: 'open') }
|
45
|
+
scope :tax, -> { where(source_type: 'Spree::TaxRate') }
|
53
46
|
scope :price, -> { where(adjustable_type: 'Spree::LineItem') }
|
54
|
-
scope :shipping, -> { where(
|
47
|
+
scope :shipping, -> { where(adjustable_type: 'Spree::Shipment') }
|
55
48
|
scope :optional, -> { where(mandatory: false) }
|
56
49
|
scope :eligible, -> { where(eligible: true) }
|
57
50
|
scope :charge, -> { where("#{quoted_table_name}.amount >= 0") }
|
58
51
|
scope :credit, -> { where("#{quoted_table_name}.amount < 0") }
|
59
|
-
scope :promotion, -> { where(
|
60
|
-
scope :manual, -> { where(originator_type: nil) }
|
52
|
+
scope :promotion, -> { where(source_type: 'Spree::PromotionAction') }
|
61
53
|
scope :return_authorization, -> { where(source_type: "Spree::ReturnAuthorization") }
|
62
54
|
scope :included, -> { where(included: true) }
|
63
55
|
scope :additional, -> { where(included: false) }
|
64
56
|
|
65
|
-
def
|
66
|
-
|
67
|
-
end
|
68
|
-
|
69
|
-
# Update the boolean _eligible_ attribute which determines which adjustments
|
70
|
-
# count towards the order's adjustment_total.
|
71
|
-
def set_eligibility
|
72
|
-
result = mandatory || ((amount != 0 || promotion?) && eligible_for_originator?)
|
73
|
-
update_column(:eligible, result)
|
57
|
+
def closed?
|
58
|
+
state == "closed"
|
74
59
|
end
|
75
60
|
|
76
|
-
|
77
|
-
|
78
|
-
def eligible_for_originator?
|
79
|
-
return true if originator.nil?
|
80
|
-
!originator.respond_to?(:eligible?) || originator.eligible?(source)
|
61
|
+
def promotion?
|
62
|
+
source.class < Spree::PromotionAction
|
81
63
|
end
|
82
64
|
|
83
|
-
#
|
84
|
-
# delegate updating of amount to their Originator when present, but only if
|
85
|
-
# +locked+ is false. Adjustments that are +locked+ will never change their amount.
|
65
|
+
# Recalculate amount given a target e.g. Order, Shipment, LineItem
|
86
66
|
#
|
87
|
-
#
|
88
|
-
#
|
89
|
-
#
|
67
|
+
# Passing a target here would always be recommended as it would avoid
|
68
|
+
# hitting the database again and would ensure you're compute values over
|
69
|
+
# the specific object amount passed here.
|
90
70
|
#
|
91
|
-
#
|
92
|
-
#
|
93
|
-
#
|
94
|
-
#
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
71
|
+
# Noop if the adjustment is locked.
|
72
|
+
#
|
73
|
+
# If the adjustment has no source, do not attempt to re-calculate the amount.
|
74
|
+
# Chances are likely that this was a manually created adjustment in the admin backend.
|
75
|
+
def update!(target = nil)
|
76
|
+
return amount if closed?
|
77
|
+
if source.present?
|
78
|
+
amount = source.compute_amount(target || adjustable)
|
79
|
+
self.update_columns(
|
80
|
+
amount: amount,
|
81
|
+
updated_at: Time.now,
|
82
|
+
)
|
83
|
+
if promotion?
|
84
|
+
self.update_column(:eligible, source.promotion.eligible?(adjustable))
|
85
|
+
end
|
86
|
+
end
|
87
|
+
amount
|
106
88
|
end
|
107
89
|
|
108
90
|
def currency
|
@@ -113,14 +95,11 @@ module Spree
|
|
113
95
|
Spree::Money.new(amount, { currency: currency })
|
114
96
|
end
|
115
97
|
|
116
|
-
def immutable?
|
117
|
-
state != "open"
|
118
|
-
end
|
119
|
-
|
120
98
|
private
|
121
99
|
|
122
|
-
|
123
|
-
|
124
|
-
|
100
|
+
def update_adjustable_adjustment_total
|
101
|
+
# Cause adjustable's total to be recalculated
|
102
|
+
Spree::ItemAdjustments.new(adjustable).update if adjustable
|
103
|
+
end
|
125
104
|
end
|
126
105
|
end
|
@@ -35,6 +35,7 @@ module Spree
|
|
35
35
|
preference :always_include_confirm_step, :boolean, default: false # Ensures confirmation step is always in checkout_progress bar, but does not force a confirm step if your payment methods do not support it.
|
36
36
|
preference :always_put_site_name_in_title, :boolean, default: true
|
37
37
|
preference :auto_capture, :boolean, default: false # automatically capture the credit card (as opposed to just authorize and capture later)
|
38
|
+
preference :binary_inventory_cache, :boolean, default: false # only invalidate product cache when a stock item changes whether it is in_stock
|
38
39
|
preference :check_for_spree_alerts, :boolean, default: true
|
39
40
|
preference :checkout_zone, :string, default: nil # replace with the name of a zone if you would like to limit the countries
|
40
41
|
preference :company, :boolean, default: false # Request company field for billing and shipping addr
|
@@ -70,20 +71,6 @@ module Spree
|
|
70
71
|
preference :tax_using_ship_address, :boolean, default: true
|
71
72
|
preference :track_inventory_levels, :boolean, default: true # Determines whether to track on_hand values for variants / products.
|
72
73
|
|
73
|
-
# Preferences related to image settings
|
74
|
-
preference :attachment_default_url, :string, default: '/spree/products/:id/:style/:basename.:extension'
|
75
|
-
preference :attachment_path, :string, default: ':rails_root/public/spree/products/:id/:style/:basename.:extension'
|
76
|
-
preference :attachment_url, :string, default: '/spree/products/:id/:style/:basename.:extension'
|
77
|
-
preference :attachment_styles, :string, default: "{\"mini\":\"48x48>\",\"small\":\"100x100>\",\"product\":\"240x240>\",\"large\":\"600x600>\"}"
|
78
|
-
preference :attachment_default_style, :string, default: 'product'
|
79
|
-
preference :s3_access_key, :string
|
80
|
-
preference :s3_bucket, :string
|
81
|
-
preference :s3_secret, :string
|
82
|
-
preference :s3_headers, :string, default: "{\"Cache-Control\":\"max-age=31557600\"}"
|
83
|
-
preference :use_s3, :boolean, default: false # Use S3 for images rather than the file system
|
84
|
-
preference :s3_protocol, :string
|
85
|
-
preference :s3_host_alias, :string
|
86
|
-
|
87
74
|
# Default mail headers settings
|
88
75
|
preference :enable_mail_delivery, :boolean, :default => false
|
89
76
|
preference :send_core_emails, :boolean, :default => true
|
@@ -2,11 +2,19 @@ module Spree
|
|
2
2
|
class Calculator < ActiveRecord::Base
|
3
3
|
belongs_to :calculable, polymorphic: true
|
4
4
|
|
5
|
-
# This method must be overriden in concrete calculator.
|
5
|
+
# This method calls a compute_<computable> method. must be overriden in concrete calculator.
|
6
6
|
#
|
7
|
-
# It should return amount computed based on #calculable and
|
8
|
-
def compute(
|
9
|
-
|
7
|
+
# It should return amount computed based on #calculable and the computable parameter
|
8
|
+
def compute(computable)
|
9
|
+
# Spree::LineItem -> :compute_line_item
|
10
|
+
computable_name = computable.class.name.demodulize.underscore
|
11
|
+
method = "compute_#{computable_name}".to_sym
|
12
|
+
calculator_class = self.class
|
13
|
+
begin
|
14
|
+
self.send(method, computable)
|
15
|
+
rescue NoMethodError
|
16
|
+
raise NotImplementedError, "Please implement '#{method}(#{computable_name})' in your calculator: #{calculator_class.name}"
|
17
|
+
end
|
10
18
|
end
|
11
19
|
|
12
20
|
# overwrite to provide description for your calculators
|
@@ -6,54 +6,58 @@ module Spree
|
|
6
6
|
Spree.t(:default_tax)
|
7
7
|
end
|
8
8
|
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
9
|
+
# Default tax calculator still needs to support orders for legacy reasons
|
10
|
+
# Orders created before Spree 2.1 had tax adjustments applied to the order, as a whole.
|
11
|
+
# Orders created with Spree 2.2 and after, have them applied to the line items individually.
|
12
|
+
def compute_order(order)
|
13
|
+
|
14
|
+
matched_line_items = order.line_items.select do |line_item|
|
15
|
+
line_item.tax_category == rate.tax_category
|
16
|
+
end
|
17
|
+
|
18
|
+
line_items_total = matched_line_items.sum(&:total)
|
19
|
+
if rate.included_in_price
|
20
|
+
round_to_two_places(line_items_total - ( line_items_total / (1 + rate.amount) ) )
|
21
|
+
else
|
22
|
+
round_to_two_places(line_items_total * rate.amount)
|
15
23
|
end
|
16
24
|
end
|
17
25
|
|
26
|
+
# When it comes to computing shipments or line items: same same.
|
27
|
+
def compute_shipment_or_line_item(item)
|
28
|
+
if rate.included_in_price
|
29
|
+
deduced_total_by_rate(item.pre_tax_amount, rate)
|
30
|
+
else
|
31
|
+
round_to_two_places(item.discounted_amount * rate.amount)
|
32
|
+
end
|
33
|
+
end
|
18
34
|
|
19
|
-
|
35
|
+
alias_method :compute_shipment, :compute_shipment_or_line_item
|
36
|
+
alias_method :compute_line_item, :compute_shipment_or_line_item
|
20
37
|
|
21
|
-
|
22
|
-
|
38
|
+
def compute_shipping_rate(shipping_rate)
|
39
|
+
if rate.included_in_price
|
40
|
+
pre_tax_amount = shipping_rate.cost / (1 + rate.amount)
|
41
|
+
deduced_total_by_rate(pre_tax_amount, rate)
|
42
|
+
else
|
43
|
+
with_tax_amount = shipping_rate.cost * rate.amount
|
44
|
+
round_to_two_places(with_tax_amount)
|
23
45
|
end
|
46
|
+
end
|
24
47
|
|
25
|
-
|
26
|
-
matched_line_items = order.line_items.select do |line_item|
|
27
|
-
line_item.tax_category == rate.tax_category
|
28
|
-
end
|
29
|
-
|
30
|
-
line_items_total = matched_line_items.sum(&:total)
|
31
|
-
if rate.included_in_price
|
32
|
-
deduced_total_by_rate(line_items_total, rate)
|
33
|
-
else
|
34
|
-
round_to_two_places(line_items_total * rate.amount)
|
35
|
-
end
|
36
|
-
end
|
48
|
+
private
|
37
49
|
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
deduced_total_by_rate(line_item.total, rate)
|
42
|
-
else
|
43
|
-
round_to_two_places(line_item.total * rate.amount)
|
44
|
-
end
|
45
|
-
else
|
46
|
-
0
|
47
|
-
end
|
48
|
-
end
|
50
|
+
def rate
|
51
|
+
self.calculable
|
52
|
+
end
|
49
53
|
|
50
|
-
|
51
|
-
|
52
|
-
|
54
|
+
def round_to_two_places(amount)
|
55
|
+
BigDecimal.new(amount.to_s).round(2, BigDecimal::ROUND_HALF_UP)
|
56
|
+
end
|
53
57
|
|
54
|
-
|
55
|
-
|
56
|
-
|
58
|
+
def deduced_total_by_rate(pre_tax_amount, rate)
|
59
|
+
round_to_two_places(pre_tax_amount * rate.amount)
|
60
|
+
end
|
57
61
|
|
58
62
|
end
|
59
63
|
end
|
@@ -8,10 +8,8 @@ module Spree
|
|
8
8
|
Spree.t(:flat_percent)
|
9
9
|
end
|
10
10
|
|
11
|
-
def compute(
|
12
|
-
|
13
|
-
item_total = object.item_total
|
14
|
-
value = item_total * BigDecimal(self.preferred_flat_percent.to_s) / 100.0
|
11
|
+
def compute(line_item)
|
12
|
+
value = line_item.amount * BigDecimal(self.preferred_flat_percent.to_s) / 100.0
|
15
13
|
(value * 100).round.to_f / 100
|
16
14
|
end
|
17
15
|
end
|