174 lines
4.3 KiB
Ruby
Executable File
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
|