foodsoft/app/models/stock_article.rb

59 lines
1.5 KiB
Ruby
Raw Normal View History

class StockArticle < Article
has_many :stock_changes
scope :available, -> { undeleted.where('quantity > 0') }
validates :quantity, presence: true, numericality: { greater_than_or_equal_to: 0 }
2016-05-20 21:30:56 +02:00
before_destroy :check_quantity
2018-10-13 16:21:37 +02:00
ransack_alias :quantity_available, :quantity # in-line with {StockArticleSerializer}
def self.ransackable_attributes(auth_object = nil)
super(auth_object) - %w(supplier_id) + %w(quantity)
end
def self.ransackable_associations(auth_object = nil)
super(auth_object) - %w(supplier)
end
# Update the quantity of items in stock
def update_quantity!
update_attribute :quantity, stock_changes.collect(&:quantity).sum
end
# Check for unclosed orders and substract its ordered quantity
def quantity_available
2013-12-06 22:43:36 +01:00
quantity - quantity_ordered
end
def quantity_ordered
OrderArticle.where(article_id: id)
.joins(:order).where(orders: { state: %w[open finished received] }).sum(:units_to_order)
end
2013-12-06 22:43:36 +01:00
2013-07-09 21:46:04 +02:00
def quantity_history
stock_changes.reorder('stock_changes.created_at ASC').map { |s| s.quantity }.cumulative_sum
2013-07-09 21:46:04 +02:00
end
def self.stock_value
available.collect { |a| a.quantity * a.gross_price }.sum
end
def mark_as_deleted
check_quantity
super
end
protected
def check_quantity
2013-02-11 23:37:52 +01:00
raise I18n.t('stockit.check.not_empty', :name => name) unless quantity == 0
end
# Overwrite Price history of Article. For StockArticles isn't it necessary.
def update_price_history
true
end
end