Sha256: 2807b756c3e75cdfaf7eba2239df1b0d16c4699097f165b429d3e5024a6dae8c

Contents?: true

Size: 1.89 KB

Versions: 6

Compression:

Stored size: 1.89 KB

Contents

module Spree #:nodoc:
  class VatCalculator
    def self.calculate_tax(order, rates=default_rates)      
      return 0 if rates.empty?
      # note: there is a bug with associations in rails 2.1 model caching so we're using this hack
      # (see http://rails.lighthouseapp.com/projects/8994/tickets/785-caching-models-fails-in-development)
      cache_hack = rates.first.respond_to?(:tax_category_id)
      
      taxable_totals = {}
      order.line_items.each do |line_item|
        next unless tax_category = line_item.variant.product.tax_category  
        next unless rate = rates.find { | vat_rate | vat_rate.tax_category_id == tax_category.id } if cache_hack        
        next unless rate = rates.find { | vat_rate | vat_rate.tax_category == tax_category } unless cache_hack        
        taxable_totals[tax_category] ||= 0
        taxable_totals[tax_category] += line_item.price * rate.amount * line_item.quantity
      end

      return 0 if taxable_totals.empty?
      tax = 0
      taxable_totals.values.each do |total|
        tax += total
      end
      tax
    end
    
    def self.calculate_tax_on(product_or_variant)
      vat_rates = default_rates

      return 0 if vat_rates.nil?
      return 0 unless tax_category = product_or_variant.is_a?(Product) ? product_or_variant.tax_category : product_or_variant.product.tax_category
      return 0 unless rate = vat_rates.find { | vat_rate | vat_rate.tax_category_id = tax_category.id }

      (product_or_variant.is_a?(Product) ? product_or_variant.master_price : product_or_variant.price) * rate.amount
    end
    
    # list the vat rates for the default country
    def self.default_rates      
      return [] unless zone_member = ZoneMember.find(:first, :conditions => ["zoneable_id = #{Spree::Config[:default_country_id]} AND zoneable_type = 'Country'"])
      TaxRate.find_all_by_zone_id_and_tax_type(zone_member.zone, TaxRate::TaxType::VAT)
    end
  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
spree-0.8.4 vendor/extensions/tax_calculator/lib/spree/vat_calculator.rb
spree-0.8.5 vendor/extensions/tax_calculator/lib/spree/vat_calculator.rb
spree-0.8.0 vendor/extensions/tax_calculator/lib/spree/vat_calculator.rb
spree-0.8.1 vendor/extensions/tax_calculator/lib/spree/vat_calculator.rb
spree-0.8.2 vendor/extensions/tax_calculator/lib/spree/vat_calculator.rb
spree-0.8.3 vendor/extensions/tax_calculator/lib/spree/vat_calculator.rb