mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-25 20:46:48 +00:00
85 lines
2.8 KiB
Ruby
85 lines
2.8 KiB
Ruby
class EnterpriseFee < ActiveRecord::Base
|
|
include Spree::Core::CalculatedAdjustments
|
|
|
|
belongs_to :enterprise
|
|
belongs_to :tax_category, class_name: 'Spree::TaxCategory', foreign_key: 'tax_category_id'
|
|
|
|
has_many :coordinator_fees, dependent: :destroy
|
|
has_many :order_cycles, through: :coordinator_fees
|
|
|
|
has_many :exchange_fees, dependent: :destroy
|
|
has_many :exchanges, through: :exchange_fees
|
|
|
|
|
|
after_save :refresh_products_cache
|
|
# After destroy, the products cache is refreshed via the after_destroy hook for
|
|
# coordinator_fees and exchange_fees
|
|
|
|
|
|
attr_accessible :enterprise_id, :fee_type, :name, :tax_category_id, :calculator_type, :inherits_tax_category
|
|
|
|
FEE_TYPES = %w(packing transport admin sales fundraising)
|
|
PER_ORDER_CALCULATORS = ['Spree::Calculator::FlatRate', 'Spree::Calculator::FlexiRate', 'Spree::Calculator::PriceSack']
|
|
|
|
|
|
validates_inclusion_of :fee_type, :in => FEE_TYPES
|
|
validates_presence_of :name
|
|
|
|
before_save :ensure_valid_tax_category_settings
|
|
before_destroy :ensure_no_product_distributions
|
|
|
|
scope :for_enterprise, lambda { |enterprise| where(enterprise_id: enterprise) }
|
|
scope :for_enterprises, lambda { |enterprises| where(enterprise_id: enterprises) }
|
|
|
|
scope :managed_by, lambda { |user|
|
|
if user.has_spree_role?('admin')
|
|
scoped
|
|
else
|
|
where('enterprise_id IN (?)', user.enterprises)
|
|
end
|
|
}
|
|
|
|
scope :per_item, lambda {
|
|
joins(:calculator).where('spree_calculators.type NOT IN (?)', PER_ORDER_CALCULATORS)
|
|
}
|
|
scope :per_order, lambda {
|
|
joins(:calculator).where('spree_calculators.type IN (?)', PER_ORDER_CALCULATORS)
|
|
}
|
|
|
|
def self.clear_all_adjustments_for(line_item)
|
|
line_item.order.adjustments.where(originator_type: 'EnterpriseFee', source_id: line_item, source_type: 'Spree::LineItem').destroy_all
|
|
end
|
|
|
|
def self.clear_all_adjustments_on_order(order)
|
|
order.adjustments.where(originator_type: 'EnterpriseFee').destroy_all
|
|
end
|
|
|
|
|
|
private
|
|
|
|
def ensure_valid_tax_category_settings
|
|
# Setting an explicit tax_category removes any inheritance behaviour
|
|
# In the absence of any current changes to tax_category, setting
|
|
# inherits_tax_category to true will clear the tax_category
|
|
if tax_category_id_changed?
|
|
self.inherits_tax_category = false if tax_category.present?
|
|
elsif inherits_tax_category_changed?
|
|
self.tax_category_id = nil if inherits_tax_category?
|
|
end
|
|
return true
|
|
end
|
|
|
|
def ensure_no_product_distributions
|
|
dependent_distribution = ProductDistribution.where(enterprise_fee_id: self).first
|
|
return unless dependent_distribution
|
|
product = dependent_distribution.product
|
|
error = I18n.t(:enterprise_fees_destroy_error, id: product.id, name: product.name)
|
|
errors.add(:base, error)
|
|
false
|
|
end
|
|
|
|
def refresh_products_cache
|
|
OpenFoodNetwork::ProductsCache.enterprise_fee_changed self
|
|
end
|
|
end
|