class Delivery < StockEvent belongs_to :supplier belongs_to :invoice, optional: true scope :recent, -> { order('created_at DESC').limit(10) } validates :supplier_id, presence: true validate :stock_articles_must_be_unique accepts_nested_attributes_for :stock_changes, allow_destroy: :true def new_stock_changes=(stock_change_attributes) for attributes in stock_change_attributes stock_changes.build(attributes) unless attributes[:quantity].to_i == 0 end end def includes_article?(article) stock_changes.map { |stock_change| stock_change.stock_article.id }.include? article.id end def sum(type = :gross) total = 0 for sc in stock_changes article = sc.stock_article quantity = sc.quantity case type when :net total += quantity * article.price when :gross total += quantity * article.gross_price when :fc total += quantity * article.fc_price end end total end protected def stock_articles_must_be_unique return if stock_changes.reject { |sc| sc.marked_for_destruction? }.map { |sc| sc.stock_article.id }.uniq!.nil? errors.add(:base, I18n.t('model.delivery.each_stock_article_must_be_unique')) end end