This repository has been archived on 2021-11-24. You can view files and clone it, but cannot push or open issues or pull requests.
phone_app/app/models/s_inventaire.rb
2021-11-18 17:47:00 +01:00

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