Noosfero/noosfero

View on GitHub
plugins/suppliers/lib/ext/profile.rb

Summary

Maintainability
A
0 mins
Test Coverage
require_dependency "profile"
require_dependency "community"

class Profile
  def create_product?
    true
  end
end

([Profile] + Profile.descendants).each do |subclass|
  subclass.class_eval do
    # use profile.products.supplied to include own products
    has_many :distributed_products, class_name: "SuppliersPlugin::DistributedProduct", foreign_key: :profile_id

    has_many :from_products, through: :products
    has_many :to_products, through: :products

    has_many :suppliers, -> {
      includes(profile: [:domains], consumer: [:domains])
        .order("name ASC")
    }, class_name: "SuppliersPlugin::Supplier", foreign_key: :consumer_id, dependent: :destroy
    has_many :consumers, -> {
      includes(profile: [:domains], consumer: [:domains])
        .order("name ASC")
    }, class_name: "SuppliersPlugin::Consumer", foreign_key: :profile_id, dependent: :destroy
  end
end

class Profile
  def supplier_settings
    @supplier_settings ||= Noosfero::Plugin::Settings.new self, SuppliersPlugin
  end

  def dummy?
    !self.visible
  end

  def orgs_consumers
    @orgs_consumers ||= self.consumers.except_people.except_self
  end

  def self_supplier
    @self_supplier ||= if new_record?
                         self.suppliers_without_self_supplier.build profile: self
                       else
                         suppliers_without_self_supplier.select { |s| s.profile_id == s.consumer_id }.first || self.suppliers_without_self_supplier.create(profile: self)
    end
  end

  def suppliers_with_self_supplier
    self_supplier # guarantee that the self_supplier is created
    suppliers_without_self_supplier
  end
  alias_method :suppliers_without_self_supplier, :suppliers
  alias_method :suppliers, :suppliers_with_self_supplier

  def add_consumer(consumer_profile)
    consumer = self.consumers.where(consumer_id: consumer_profile.id).first
    consumer ||= self.consumers.create! profile: self, consumer: consumer_profile
  end

  def remove_consumer(consumer_profile)
    consumer = self.consumers.of_consumer(consumer_profile).first
    consumer.destroy if supplier
  end

  def add_supplier(supplier_profile, attrs = {})
    supplier = self.suppliers.where(profile_id: supplier_profile.id).first
    supplier ||= self.suppliers.create! attrs.merge(profile: supplier_profile, consumer: self)
  end

  def remove_supplier(supplier_profile)
    supplier_profile.remove_consumer self
  end

  def not_distributed_products(supplier)
    raise "'#{supplier.name}' is not a supplier of #{self.name}" if self.suppliers.of_profile(supplier).blank?

    # FIXME: only select all products if supplier is dummy
    supplier.profile.products.unarchived.own - self.from_products.unarchived.by_profile(supplier.profile)
  end

  delegate :margin_percentage, :margin_percentage=, to: :supplier_settings
  extend CurrencyFields::ClassMethods
  has_number_with_locale :margin_percentage

  def supplier_products_default_margins
    self.class.transaction do
      self.distributed_products.unarchived.each do |product|
        product.default_margin_percentage = true
        product.save!
      end
    end
  end
end