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