vita_app/app/models/product.rb
Nicolas Bally d52c017848 suite
2016-04-28 22:41:58 +02:00

174 lines
4.3 KiB
Ruby
Executable File

class Product < ActiveRecord::Base
has_many :product_product_sizes
has_many :product_sizes, :through => :product_product_sizes
has_many :product_stocks, :dependent => :destroy
accepts_nested_attributes_for :product_stocks
has_many :product_langs, :dependent => :destroy
has_many :product_images, :dependent => :destroy
accepts_nested_attributes_for :product_langs
scope :not_archived, -> { where(:archived => 0) }
after_save do
self.generate_stock
end
def generate_stock
ids_saveds = []
ids_new_saveds = []
if self.product_options.count > 0
self.product_options.each do |product_option|
if self.product_sizes.count > 0
self.product_sizes.each do |product_size|
if !(product_stock = self.product_stocks.where(:product_size_id => product_size.id, :product_option_id => product_option.id).first)
product_stock = self.product_stocks.create(:product_size_id => product_size.id, :product_option_id => product_option.id, :stock_th => 1, :stock => 1)
ids_new_saveds << product_stock.id
end
ids_saveds << product_stock.id
end
else
if !(product_stock = self.product_stocks.where(:product_size_id => nil, :product_option_id => product_option.id).first)
product_stock = self.product_stocks.create(:product_option_id => product_option.id, :stock_th => 1, :stock => 1)
ids_new_saveds << product_stock.id
end
ids_saveds << product_stock.id
end
end
else
if self.product_sizes.count > 0
self.product_sizes.each do |product_size|
if !(product_stock = self.product_stocks.where(:product_size_id => product_size.id, :product_option_id => nil).first)
product_stock = self.product_stocks.create(:product_size_id => product_size.id, :stock_th => 1, :stock => 1)
ids_new_saveds << product_stock.id
end
ids_saveds << product_stock.id
end
else
if !(product_stock = self.product_stocks.where(:product_size_id => nil, :product_option_id => nil).first)
product_stock = self.product_stocks.create(:stock_th => 1, :stock => 1)
ids_new_saveds << product_stock.id
end
ids_saveds << product_stock.id
end
end
self.product_stocks.where("id not IN (?)", ids_saveds).destroy_all
end
def product_options_in_stock_id
self.product_stocks.where("stock_th > 0").group(:product_option_id).map {|s| s.product_option_id}
end
def product_options_in_stock
self.product_options.where(:id => self.product_options_in_stock_id)
end
def product_sizes_in_stock_id(product_option_id=nil)
to_ids = self.product_stocks.where("stock_th > 0")
to_ids = to_ids.where(:product_option_id => product_option_id) if product_option_id != :all
to_ids.map {|s| s.product_size_id}
end
def product_sizes_in_stock(product_option_id=nil)
self.product_sizes.where(:id => self.product_sizes_in_stock_id(product_option_id))
end
def tva
0.2
end
def price_ttc
price_ht+(price_ht*self.tva)
end
def price_reduced_ttc
price_reduced_ht+(price_reduced_ht*self.tva)
end
def final_price_ht
if price_reduced_ht?
price_reduced_ht
else
price_ht
end
end
def final_price_ttc
final_price_ht+(final_price_ht*self.tva)
end
def lang(lang)
self.product_langs.find_by_lang(lang)
end
has_many :product_options, :dependent => :destroy
accepts_nested_attributes_for :product_options, :allow_destroy => true
#belongs_to :default_image, :class_name => "ProductImage"
def default_image
self.product_images.order(:position).first
end
belongs_to :product_collection
belongs_to :product_category
before_validation do
if self.product_collection_id
if !self.product_category or !self.product_category.product_collections.where(:id => self.product_collection_id)
self.product_collection_id = nil
end
end
end
end