73 lines
3.6 KiB
Ruby
73 lines
3.6 KiB
Ruby
require "awesome_print"
|
|
class SInventaire < ApplicationRecord
|
|
acts_as_sorting :fields => {
|
|
:date => {:name => "Date", :reorder => true},
|
|
:done => {:name => "Fait ?", :reorder => true, :as => :boolean},
|
|
:exhaustive => {:name => "Exhaustif ?", :reorder => true, :as => :boolean},
|
|
:ok => {:name => "Validé ?", :reorder => true, :as => :boolean},
|
|
:stock_ok => {:name => "Stock ok ?", :reorder => true, :as => :boolean},
|
|
:actions => {:name => "Actions"},
|
|
}
|
|
|
|
has_many :s_inventaire_lines
|
|
|
|
|
|
def generate_stock
|
|
self.s_inventaire_lines.each do |s_inventaire_line|
|
|
if s_inventaire_line.p_product_ref
|
|
line_stocks = LineStock.where(p_product_ref: s_inventaire_line.p_product_ref)
|
|
qte_difference = s_inventaire_line.qte - line_stocks.sum(:qte_available)
|
|
if line_stocks.present?
|
|
if qte_difference.positive? #make a credit
|
|
LineStock.create(:date => self.date, :p_product_ref => s_inventaire_line.p_product_ref, :description => "Entrée en stock par inventaire n°#{self.id}", :qte => qte_difference, :price_ht => s_inventaire_line.cc_pu_avg_ht * qte_difference, :s_inventaire => self, :s_inventaire_line => s_inventaire_line, :stockable => self)
|
|
elsif qte_difference.negative? #make a debit
|
|
decr_line_stock = LineStock.create(:date => self.date, :p_product_ref => s_inventaire_line.p_product_ref, :description => "Sortie de stock par inventaire n°#{self.id}", :qte => qte_difference, :price_ht => 0.0, :s_inventaire => self, :s_inventaire_line => s_inventaire_line, :stockable => self)
|
|
price = 0.0
|
|
line_stock_usages = []
|
|
|
|
qte_to_affect = qte_difference * -1
|
|
LineStock.where(:p_product_ref_id => s_inventaire_line.p_product_ref).where("date <= ?", self.date).where("qte_available > 0.0").each do |ls|
|
|
if qte_to_affect <= ls.qte_available
|
|
qte_here = qte_to_affect
|
|
else
|
|
qte_here = ls.qte_available
|
|
end
|
|
|
|
qte_to_affect = qte_to_affect - qte_here
|
|
|
|
lsu = LineStockUsage.create(:qte => qte_here, :line_stock => ls, :dest_line_stock_id => decr_line_stock.id)
|
|
line_stock_usages << lsu
|
|
price += lsu.price_ht
|
|
ls.save
|
|
|
|
break if qte_to_affect == 0.0
|
|
end
|
|
decr_line_stock.price_ht = price * -1
|
|
decr_line_stock.save
|
|
else #qte_difference == zero do nothing
|
|
end
|
|
else #make a credit
|
|
LineStock.create(:date => self.date, :p_product_ref => s_inventaire_line.p_product_ref, :description => "Entrée en stock par inventaire n°#{self.id}", :qte => qte_difference, :price_ht => s_inventaire_line.cc_pu_avg_ht * qte_difference, :s_inventaire => self, :s_inventaire_line => s_inventaire_line, :stockable => self)
|
|
end
|
|
end
|
|
end
|
|
if self.exhaustive
|
|
protected_refs = []
|
|
self.s_inventaire_lines.each do |il|
|
|
protected_refs << il.p_product_ref.id
|
|
end
|
|
line_stocks = LineStock.where.not(p_product_ref_id: protected_refs).where.not(qte_available: 0)
|
|
line_stocks.each do |ls|
|
|
decr_line_stock = LineStock.create(:date => self.date, :p_product_ref => ls.p_product_ref, :description => "Sortie de stock par inventaire n°#{self.id}", :qte => ls.qte_available * -1, :price_ht => 0.0, :s_inventaire => self, :stockable => self)
|
|
lsu = LineStockUsage.create(:qte => ls.qte_available , :line_stock => ls, :dest_line_stock_id => decr_line_stock.id)
|
|
decr_line_stock.price_ht = lsu.price_ht * -1
|
|
decr_line_stock.save
|
|
ls.save
|
|
end
|
|
|
|
end
|
|
self.stock_ok = true
|
|
self.save
|
|
end
|
|
end
|