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