Class: Tienda::Product
- Inherits:
-
ActiveRecord::Base
- Object
- ActiveRecord::Base
- Tienda::Product
- Defined in:
- app/models/tienda/product.rb,
app/models/tienda/product/variants.rb,
app/models/tienda/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 ⇒ Tienda::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?.
-
#images ⇒ Array
Return all product images.
-
#in_stock? ⇒ Boolean
Is this product currently in stock?.
-
#orderable? ⇒ Boolean
Is this product orderable?.
-
#price ⇒ BigDecimal
The price for the product.
-
#product_category ⇒ Tienda::ProductCategory
The product’s category.
-
#tax_rate ⇒ Tienda::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/tienda/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:
Tienda: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 |
# File 'app/models/tienda/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 product.stock_level_adjustments.create!(description: I18n.t('tienda.import'), adjustment: qty) if qty > 0 && qty != product.stock else product = new(row) product.product_category_id = Tienda::ProductCategory.find_or_create_by(name: row['category_name']).id product.save! # Create quantities qty = row["qty"].to_i product.stock_level_adjustments.create!(description: I18n.t('tienda.import'), adjustment: qty) if qty > 0 end end end end |
.open_spreadsheet(file) ⇒ Object
154 155 156 157 158 159 160 161 |
# File 'app/models/tienda/product.rb', line 154 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('tienda.imports.errors.unknown_format', filename: File.original_filename) end end |
.with_attributes(key, values) ⇒ Enumerable
Search for products which include the given attributes and return an active record scope of these products. Chainable with other scopes and with_attributes methods. For example:
Tienda::Product.active.with_attribute('Manufacturer', 'Apple').with_attribute('Model', ['Macbook', 'iPhone'])
118 119 120 121 |
# File 'app/models/tienda/product.rb', line 118 def self.with_attributes(key, values) product_ids = Tienda::ProductAttribute.searchable.where(key: key, value: values).pluck(:product_id).uniq where(id: product_ids) end |
Instance Method Details
#default_variant ⇒ Tienda::Product
Returns the default variant for the product or nil if none exists.
38 39 40 41 |
# File 'app/models/tienda/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
77 78 79 |
# File 'app/models/tienda/product.rb', line 77 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/tienda/product/variants.rb', line 31 def has_variants? !variants.empty? end |
#images ⇒ Array
Return all product images
107 108 109 |
# File 'app/models/tienda/product.rb', line 107 def images .select { || .role != "data_sheet" } end |
#in_stock? ⇒ Boolean
Is this product currently in stock?
100 101 102 |
# File 'app/models/tienda/product.rb', line 100 def in_stock? self.default_variant ? self.default_variant.in_stock? : (stock_control? ? stock_count > 0 : true) end |
#orderable? ⇒ Boolean
Is this product orderable?
84 85 86 87 88 |
# File 'app/models/tienda/product.rb', line 84 def orderable? return false unless self.active? return false if self.has_variants? true end |
#price ⇒ BigDecimal
The price for the product
93 94 95 |
# File 'app/models/tienda/product.rb', line 93 def price self.default_variant ? self.default_variant.price : read_attribute(:price) end |
#product_category ⇒ Tienda::ProductCategory
The product’s category
24 |
# File 'app/models/tienda/product.rb', line 24 belongs_to :product_category, class_name: 'Tienda::ProductCategory' |
#tax_rate ⇒ Tienda::TaxRate
The product’s tax rate
29 |
# File 'app/models/tienda/product.rb', line 29 belongs_to :tax_rate, class_name: "Tienda::TaxRate" |
#variant? ⇒ Boolean
Is this product a variant of another?
46 47 48 |
# File 'app/models/tienda/product/variants.rb', line 46 def variant? !self.parent_id.blank? end |