Class: Shoppe::Product
- Inherits:
-
ActiveRecord::Base
- Object
- ActiveRecord::Base
- Shoppe::Product
- Defined in:
- app/models/shoppe/product.rb,
app/models/shoppe/product/variants.rb,
app/models/shoppe/product/product_attributes.rb
Instance Attribute Summary collapse
-
#product_attributes_array ⇒ Object
Used for setting an array of product attributes which will be updated.
Class Method Summary collapse
-
.import(file) ⇒ Object
Imports products from a spreadsheet file Example:.
- .open_spreadsheet(file) ⇒ Object
-
.with_attributes(key, values) ⇒ Enumerable
Search for products which include the given attributes and return an active record scope of these products.
Instance Method Summary collapse
-
#default_variant ⇒ Shoppe::Product
Returns the default variant for the product or nil if none exists.
-
#full_name ⇒ String
Return the name of the product.
-
#has_variants? ⇒ Boolean
Does this product have any variants?.
-
#in_stock? ⇒ Boolean
Is this product currently in stock?.
-
#orderable? ⇒ Boolean
Is this product orderable?.
-
#price ⇒ BigDecimal
The price for the product.
-
#product_categories ⇒ Shoppe::ProductCategory
The product’s categories.
-
#product_categorizations ⇒ Shoppe::ProductCategorization
The product’s categorizations.
-
#product_category ⇒ Shoppe::ProductCategory
Return the first product category.
-
#stock ⇒ Fixnum
Return the total number of items currently in stock.
-
#tax_rate ⇒ Shoppe::TaxRate
The product’s tax rate.
-
#variant? ⇒ Boolean
Is this product a variant of another?.
Instance Attribute Details
#product_attributes_array ⇒ Object
Used for setting an array of product attributes which will be updated. Usually received from a web browser.
9 10 11 |
# File 'app/models/shoppe/product/product_attributes.rb', line 9 def product_attributes_array @product_attributes_array end |
Class Method Details
.import(file) ⇒ Object
Imports products from a spreadsheet file Example:
Shoppe:Product.import("path/to/file.csv")
127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 |
# File 'app/models/shoppe/product.rb', line 127 def self.import(file) spreadsheet = open_spreadsheet(file) spreadsheet.default_sheet = spreadsheet.sheets.first header = spreadsheet.row(1) (2..spreadsheet.last_row).each do |i| row = Hash[[header, spreadsheet.row(i)].transpose] # Don't import products where the name is blank unless row["name"].nil? if product = find_by(name: row["name"]) # Dont import products with the same name but update quantities if they're not the same qty = row["qty"].to_i if qty > 0 && qty != product.stock product.stock_level_adjustments.create!(description: I18n.t('shoppe.import'), adjustment: qty) end else product = new product.name = row["name"] product.sku = row["sku"] product.description = row["description"] product.short_description = row["short_description"] product.weight = row["weight"] product.price = row["price"].nil? ? 0 : row["price"] product.permalink = row["permalink"] product.product_categories << begin if Shoppe::ProductCategory.find_by(name: row["category_name"]).present? Shoppe::ProductCategory.find_by(name: row["category_name"]) else Shoppe::ProductCategory.create(name: row["category_name"]) end end product.save! qty = row["qty"].to_i if qty > 0 product.stock_level_adjustments.create!(description: I18n.t('shoppe.import'), adjustment: qty) end end end end end |
.open_spreadsheet(file) ⇒ Object
171 172 173 174 175 176 177 178 |
# File 'app/models/shoppe/product.rb', line 171 def self.open_spreadsheet(file) case File.extname(file.original_filename) when ".csv" then Roo::CSV.new(file.path) when ".xls" then Roo::Excel.new(file.path) when ".xlsx" then Roo::Excelx.new(file.path) else raise I18n.t('shoppe.imports.errors.unknown_format', filename: File.original_filename) end end |
.with_attributes(key, values) ⇒ Enumerable
118 119 120 121 |
# File 'app/models/shoppe/product.rb', line 118 def self.with_attributes(key, values) product_ids = Shoppe::ProductAttribute.searchable.where(:key => key, :value => values).pluck(:product_id).uniq where(:id => product_ids) end |
Instance Method Details
#default_variant ⇒ Shoppe::Product
Returns the default variant for the product or nil if none exists.
38 39 40 41 |
# File 'app/models/shoppe/product/variants.rb', line 38 def default_variant return nil if self.parent @default_variant ||= self.variants.select { |v| v.default? }.first end |
#full_name ⇒ String
Return the name of the product
69 70 71 |
# File 'app/models/shoppe/product.rb', line 69 def full_name self.parent ? "#{self.parent.name} (#{name})" : name end |
#has_variants? ⇒ Boolean
Does this product have any variants?
31 32 33 |
# File 'app/models/shoppe/product/variants.rb', line 31 def has_variants? !variants.empty? end |
#in_stock? ⇒ Boolean
Is this product currently in stock?
93 94 95 |
# File 'app/models/shoppe/product.rb', line 93 def in_stock? self.default_variant ? self.default_variant.in_stock? : (stock_control? ? stock > 0 : true) end |
#orderable? ⇒ Boolean
Is this product orderable?
76 77 78 79 80 |
# File 'app/models/shoppe/product.rb', line 76 def orderable? return false unless self.active? return false if self.has_variants? true end |
#price ⇒ BigDecimal
The price for the product
85 86 87 88 |
# File 'app/models/shoppe/product.rb', line 85 def price # self.default_variant ? self.default_variant.price : read_attribute(:price) self.default_variant ? self.default_variant.price : read_attribute(:price) end |
#product_categories ⇒ Shoppe::ProductCategory
The product’s categories
24 |
# File 'app/models/shoppe/product.rb', line 24 has_many :product_categories, class_name: 'Shoppe::ProductCategory', through: :product_categorizations |
#product_categorizations ⇒ Shoppe::ProductCategorization
The product’s categorizations
20 |
# File 'app/models/shoppe/product.rb', line 20 has_many :product_categorizations, dependent: :destroy, class_name: 'Shoppe::ProductCategorization', inverse_of: :product |
#product_category ⇒ Shoppe::ProductCategory
Return the first product category
107 108 109 |
# File 'app/models/shoppe/product.rb', line 107 def product_category self.product_categories.first rescue nil end |
#stock ⇒ Fixnum
Return the total number of items currently in stock
100 101 102 |
# File 'app/models/shoppe/product.rb', line 100 def stock self.stock_level_adjustments.sum(:adjustment) end |
#tax_rate ⇒ Shoppe::TaxRate
The product’s tax rate
29 |
# File 'app/models/shoppe/product.rb', line 29 belongs_to :tax_rate, :class_name => "Shoppe::TaxRate" |
#variant? ⇒ Boolean
Is this product a variant of another?
46 47 48 |
# File 'app/models/shoppe/product/variants.rb', line 46 def variant? !self.parent_id.blank? end |