Class: Spree::TaxRate
- Includes:
- AdjustmentSource, CalculatedAdjustments, Metadata, Webhooks::HasWebhooks
- Defined in:
- app/models/spree/tax_rate.rb
Class Method Summary collapse
-
.adjust(order, items) ⇒ Object
Deletes all tax adjustments, then applies all applicable rates to relevant items.
- .included_tax_amount_for(options) ⇒ Object
-
.match(order_tax_zone) ⇒ Object
Gets the array of TaxRates appropriate for the specified tax zone.
-
.store_pre_tax_amount(item, rates) ⇒ Object
Pre-tax amounts must be stored so that we can calculate correct rate amounts in the future.
Instance Method Summary collapse
Methods inherited from Base
belongs_to_required_by_default, for_store, has_many_inversing, json_api_columns, json_api_permitted_attributes, json_api_type, page, spree_base_scopes, spree_base_uniqueness_scope
Methods included from Preferences::Preferable
#clear_preferences, #default_preferences, #defined_preferences, #deprecated_preferences, #get_preference, #has_preference!, #has_preference?, #preference_default, #preference_deprecated, #preference_type, #set_preference
Class Method Details
.adjust(order, items) ⇒ Object
Deletes all tax adjustments, then applies all applicable rates to relevant items.
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 |
# File 'app/models/spree/tax_rate.rb', line 62 def self.adjust(order, items) rates = match(order.tax_zone) tax_categories = rates.map(&:tax_category) # using destroy_all to ensure adjustment destroy callback fires. Spree::Adjustment.where(adjustable: items).tax.destroy_all relevant_items = items.select do |item| tax_categories.include?(item.tax_category) end relevant_items.each do |item| relevant_rates = rates.select do |rate| rate.tax_category == item.tax_category end store_pre_tax_amount(item, relevant_rates) relevant_rates.each do |rate| rate.adjust(order, item) end end # updates pre_tax for items without any tax rates remaining_items = items - relevant_items remaining_items.each do |item| store_pre_tax_amount(item, []) end end |
.included_tax_amount_for(options) ⇒ Object
90 91 92 93 94 95 96 97 |
# File 'app/models/spree/tax_rate.rb', line 90 def self.included_tax_amount_for() return 0 unless [:tax_zone] && [:tax_category] potential_rates_for_zone([:tax_zone]). included_in_price. for_tax_category([:tax_category]). sum(:amount) end |
.match(order_tax_zone) ⇒ Object
Gets the array of TaxRates appropriate for the specified tax zone
37 38 39 40 41 |
# File 'app/models/spree/tax_rate.rb', line 37 def self.match(order_tax_zone) return [] unless order_tax_zone potential_rates_for_zone(order_tax_zone) end |
.store_pre_tax_amount(item, rates) ⇒ Object
Pre-tax amounts must be stored so that we can calculate correct rate amounts in the future. For example: github.com/spree/spree/issues/4318#issuecomment-34723428
46 47 48 49 50 51 52 53 54 55 56 57 58 |
# File 'app/models/spree/tax_rate.rb', line 46 def self.store_pre_tax_amount(item, rates) pre_tax_amount = case item.class.to_s when 'Spree::LineItem' then item.discounted_amount when 'Spree::Shipment' then item.discounted_cost end included_rates = rates.select(&:included_in_price) if included_rates.any? pre_tax_amount /= (1 + included_rates.sum(&:amount)) end item.update_column(:pre_tax_amount, pre_tax_amount) end |
Instance Method Details
#adjust(order, item) ⇒ Object
99 100 101 |
# File 'app/models/spree/tax_rate.rb', line 99 def adjust(order, item) create_adjustment(order, item, included_in_price) end |
#compute_amount(item) ⇒ Object
103 104 105 |
# File 'app/models/spree/tax_rate.rb', line 103 def compute_amount(item) compute(item) end |