TODO: - AJAX for add_p_article and add_stock_movement_p_article in stock_movement views - Fix select p_article with in stock_movement partial view - Fix query to display available p_article in stock_movement partial
156 lines
5.3 KiB
Ruby
156 lines
5.3 KiB
Ruby
class StockMovement < ApplicationRecord
|
|
|
|
validates :date, :presence => true
|
|
validates :description, :presence => true
|
|
|
|
acts_as_sorting :fields =>{
|
|
:id => {:name => "Id"},
|
|
:description => {:name => "Description"},
|
|
:date => {:name => "Date"},
|
|
:movement_type => {:name => "Type de mouvement"},
|
|
:stock_done => {:name => "Stock ok ?", :as => :boolean},
|
|
:actions => {:name => "Actions", :reorder => false}
|
|
}
|
|
|
|
has_many :stock_movement_lines, :dependent => :destroy
|
|
|
|
has_many :line_stocks, :as => :stockable
|
|
|
|
accepts_nested_attributes_for :stock_movement_lines, allow_destroy: true
|
|
|
|
acts_as_caching :fields => [:tot_amount_ht]
|
|
|
|
|
|
def generate_stock
|
|
|
|
if self.movement_type == "cred"
|
|
self.stock_movement_lines.each do |stock_movement_line|
|
|
if stock_movement_line.p_product_ref
|
|
cred_line_stock = LineStock.new(:dluo => stock_movement_line.dluo,
|
|
:date => self.date,
|
|
:p_product_ref => stock_movement_line.p_product_ref,
|
|
:description => "Entrée en stock par mouvement de stock manuel",
|
|
:qte => stock_movement_line.qte,
|
|
:price_ht => stock_movement_line.tot_amount_ht,
|
|
:stock_movement_line => stock_movement_line,
|
|
:stockable => self)
|
|
cred_line_stock.p_articles = stock_movement_line.p_articles
|
|
cred_line_stock.save
|
|
end
|
|
end
|
|
self.stock_done = true
|
|
self.save
|
|
return true
|
|
|
|
else #self.movement_type == "deb"
|
|
|
|
if self.test_if_stock_ok?
|
|
|
|
self.stock_movement_lines.each do |sml|
|
|
if !sml.p_articles.empty?
|
|
sml.p_articles.each do |p_article|
|
|
decr_line_stock = LineStock.create(:date => self.date,
|
|
:p_product_ref => sml.p_product_ref,
|
|
:qte => sml.qte*-1,
|
|
:description => "Attribution à une sortie de stock manuelle",
|
|
:price_ht => 0.0,
|
|
:stock_movement_line => sml,
|
|
:stockable => self)
|
|
|
|
price = 0.0
|
|
line_stock_usages = []
|
|
#qte_to_affect = sml.qte
|
|
|
|
lsu_p_art = LineStockUsage.where(p_article_id: p_article.id)
|
|
|
|
line_stocks_p_article = p_article.line_stocks.where("qte_available > ?", 0)
|
|
ls = nil
|
|
line_stocks_p_article.each do |p_article_line_stock|
|
|
if p_article_line_stock.line_stock_usages.where(p_article_id: p_article).empty?
|
|
ls = p_article_line_stock
|
|
|
|
end
|
|
end
|
|
|
|
lsu = LineStockUsage.create(:qte => 1, :line_stock => ls, :dest_line_stock_id => decr_line_stock.id, p_article_id: p_article.id)
|
|
|
|
price += lsu.price_ht
|
|
ls.save
|
|
decr_line_stock.price_ht = price * -1
|
|
decr_line_stock.save
|
|
p_article.line_stocks << decr_line_stock
|
|
decr_line_stock.price_ht = price * -1
|
|
decr_line_stock.save
|
|
end
|
|
|
|
else
|
|
#==============================================================================================================================================================================================
|
|
if sml.p_product_ref
|
|
decr_line_stock = LineStock.create(:date => self.date, :p_product_ref => sml.p_product_ref, :qte => sml.qte*-1, :description => "Attribution à une sortie de stock manuelle", :price_ht => 0.0, :stock_movement_line => sml, :stockable => self)
|
|
puts "a"
|
|
puts decr_line_stock.id
|
|
puts "b"
|
|
|
|
|
|
price = 0.0
|
|
line_stock_usages = []
|
|
|
|
qte_to_affect = sml.qte
|
|
|
|
LineStock.where(:p_product_ref_id => sml.p_product_ref_id).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
|
|
|
|
#price_u_ht
|
|
|
|
end
|
|
decr_line_stock.price_ht = price * -1
|
|
decr_line_stock.save
|
|
end
|
|
#==============================================================================================================================================================================================
|
|
end
|
|
end
|
|
self.stock_done = true
|
|
self.save
|
|
return true
|
|
|
|
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
def test_if_stock_ok?
|
|
to_r = true
|
|
self.stock_movement_lines.each do |pl|
|
|
if pl.p_product_ref
|
|
if LineStock.where(:p_product_ref_id => pl.p_product_ref_id).sum(:qte_available) >= pl.qte
|
|
|
|
else
|
|
to_r = false
|
|
end
|
|
|
|
|
|
end
|
|
|
|
end
|
|
|
|
return to_r
|
|
end
|
|
|
|
end
|