method.rb 2.25 KB
class DeliveryPlugin::Method < ActiveRecord::Base

  Types = ['pickup', 'deliver']

  # see also: Profile::LOCATION_FIELDS
  AddressFields = %w[
    address address_line2 address_reference district city state country_name zip_code
  ].map(&:to_sym)

  attr_accessible :profile, :delivery_type, :name, :description,
    :fixed_cost, :free_over_price, :distribution_margin_percentage, :distribution_margin_fixed

  belongs_to :profile

  has_many :delivery_options, class_name: 'DeliveryPlugin::Option', foreign_key: :delivery_method_id, dependent: :destroy

  validates_presence_of :profile
  validates_presence_of :name
  validates_inclusion_of :delivery_type, in: Types

  scope :pickup, -> { where delivery_type: 'pickup' }
  scope :delivery, -> { where delivery_type: 'deliver'}

  extend CurrencyHelper::ClassMethods
  has_currency :fixed_cost
  has_currency :free_over_price
  has_currency :distribution_margin_percentage
  has_currency :distribution_margin_fixed

  def pickup?
    self.delivery_type == 'pickup'
  end
  def deliver?
    self.delivery_type == 'deliver'
  end

  def has_distribution_margin?
    (self.distribution_margin_percentage.present? and self.distribution_margin_percentage.nonzero?) or
      (self.distribution_margin_fixed.present? and self.distribution_margin_fixed.nonzero?)
  end

  def has_fixed_cost? order_price=nil
    if order_price.present? and order_price.nonzero? and self.free_over_price.present? and self.free_over_price.nonzero?
      order_price <= self.free_over_price
    else
      self.fixed_cost.present? and self.fixed_cost.nonzero?
    end
  end

  def distribution_margin order_price
    value = 0
    value += self.distribution_margin_fixed if self.distribution_margin_fixed.present?
    value += order_price * (self.distribution_margin_percentage/100) if self.distribution_margin_percentage.present?
    value
  end

  def has_cost? order_price=nil
    has_cost = self.has_distribution_margin?
    has_cost ||= self.has_fixed_cost? order_price
  end
  def free? order_price=nil
    !self.has_cost?
  end

  def cost order_price=nil
    value = 0
    value += self.fixed_cost if self.has_fixed_cost? order_price
    value += self.distribution_margin order_price if self.has_distribution_margin?
    value
  end
  has_currency :cost

  protected

end