shoppe 1.1.1 → 1.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/README.md +6 -0
- data/app/assets/stylesheets/shoppe/application.scss +15 -4
- data/app/controllers/shoppe/application_controller.rb +2 -2
- data/app/controllers/shoppe/customers_controller.rb +10 -12
- data/app/models/shoppe/address.rb +14 -14
- data/app/models/shoppe/attachment.rb +9 -9
- data/app/models/shoppe/country.rb +14 -14
- data/app/models/shoppe/customer.rb +11 -8
- data/app/models/shoppe/delivery_service.rb +10 -10
- data/app/models/shoppe/delivery_service_price.rb +15 -15
- data/app/models/shoppe/order.rb +12 -9
- data/app/models/shoppe/order/actions.rb +15 -15
- data/app/models/shoppe/order/billing.rb +10 -10
- data/app/models/shoppe/order/delivery.rb +13 -13
- data/app/models/shoppe/order/states.rb +20 -20
- data/app/models/shoppe/order_item.rb +10 -10
- data/app/models/shoppe/payment.rb +7 -7
- data/app/models/shoppe/product.rb +24 -24
- data/app/models/shoppe/product/product_attributes.rb +5 -5
- data/app/models/shoppe/product/variants.rb +3 -3
- data/app/models/shoppe/product_attribute.rb +20 -20
- data/app/models/shoppe/product_category.rb +6 -6
- data/app/models/shoppe/setting.rb +13 -13
- data/app/models/shoppe/stock_level_adjustment.rb +5 -5
- data/app/models/shoppe/tax_rate.rb +16 -16
- data/app/models/shoppe/user.rb +13 -13
- data/app/uploaders/shoppe/attachment_uploader.rb +0 -1
- data/app/views/shoppe/customers/_addresses.html.haml +5 -5
- data/app/views/shoppe/customers/_form.html.haml +17 -10
- data/app/views/shoppe/customers/_search_form.html.haml +5 -5
- data/app/views/shoppe/customers/edit.html.haml +4 -4
- data/app/views/shoppe/customers/index.html.haml +11 -11
- data/app/views/shoppe/customers/new.html.haml +3 -3
- data/app/views/shoppe/customers/show.html.haml +11 -12
- data/app/views/shoppe/product_categories/index.html.haml +3 -2
- data/app/views/shoppe/variants/form.html.haml +0 -1
- data/config/locales/de.yml +58 -7
- data/config/locales/en.yml +38 -4
- data/config/locales/es-US.yml +656 -0
- data/config/locales/es.yml +372 -281
- data/config/locales/ru.yml +781 -0
- data/db/seeds.rb +113 -98
- data/lib/shoppe.rb +10 -10
- data/lib/shoppe/version.rb +1 -1
- metadata +22 -6
@@ -4,20 +4,20 @@ module Shoppe
|
|
4
4
|
# The country which this order should be billed to
|
5
5
|
#
|
6
6
|
# @return [Shoppe::Country]
|
7
|
-
belongs_to :billing_country, :
|
7
|
+
belongs_to :billing_country, class_name: 'Shoppe::Country', foreign_key: 'billing_country_id'
|
8
8
|
|
9
9
|
# Payments which have been stored for the order
|
10
|
-
has_many :payments, :
|
10
|
+
has_many :payments, dependent: :destroy, class_name: 'Shoppe::Payment'
|
11
11
|
|
12
12
|
# Validations
|
13
|
-
with_options :
|
14
|
-
order.validates :first_name, :
|
15
|
-
order.validates :last_name, :
|
16
|
-
order.validates :billing_address1, :
|
17
|
-
order.validates :billing_address3, :
|
18
|
-
order.validates :billing_address4, :
|
19
|
-
order.validates :billing_postcode, :
|
20
|
-
order.validates :billing_country, :
|
13
|
+
with_options if: Proc.new { |o| !o.building? } do |order|
|
14
|
+
order.validates :first_name, presence: true
|
15
|
+
order.validates :last_name, presence: true
|
16
|
+
order.validates :billing_address1, presence: true
|
17
|
+
order.validates :billing_address3, presence: true
|
18
|
+
order.validates :billing_address4, presence: true
|
19
|
+
order.validates :billing_postcode, presence: true
|
20
|
+
order.validates :billing_country, presence: true
|
21
21
|
end
|
22
22
|
|
23
23
|
# The name for billing purposes
|
@@ -4,29 +4,29 @@ module Shoppe
|
|
4
4
|
# The associated delivery service
|
5
5
|
#
|
6
6
|
# @return [Shoppe::DeliveryService]
|
7
|
-
belongs_to :delivery_service, :
|
7
|
+
belongs_to :delivery_service, class_name: 'Shoppe::DeliveryService'
|
8
8
|
|
9
9
|
# The country where this order is being delivered to (if one has been provided)
|
10
10
|
#
|
11
11
|
# @return [Shoppe::Country]
|
12
|
-
belongs_to :delivery_country, :
|
12
|
+
belongs_to :delivery_country, class_name: 'Shoppe::Country', foreign_key: 'delivery_country_id'
|
13
13
|
|
14
14
|
# The user who marked the order has shipped
|
15
15
|
#
|
16
16
|
# @return [Shoppe::User]
|
17
|
-
belongs_to :shipper, :
|
17
|
+
belongs_to :shipper, class_name: 'Shoppe::User', foreign_key: 'shipped_by'
|
18
18
|
|
19
19
|
# Set up a callback for use when an order is shipped
|
20
20
|
define_model_callbacks :ship
|
21
21
|
|
22
22
|
# Validations
|
23
|
-
with_options :
|
24
|
-
order.validates :delivery_name, :
|
25
|
-
order.validates :delivery_address1, :
|
26
|
-
order.validates :delivery_address3, :
|
27
|
-
order.validates :delivery_address4, :
|
28
|
-
order.validates :delivery_postcode, :
|
29
|
-
order.validates :delivery_country, :
|
23
|
+
with_options if: :separate_delivery_address? do |order|
|
24
|
+
order.validates :delivery_name, presence: true
|
25
|
+
order.validates :delivery_address1, presence: true
|
26
|
+
order.validates :delivery_address3, presence: true
|
27
|
+
order.validates :delivery_address4, presence: true
|
28
|
+
order.validates :delivery_postcode, presence: true
|
29
|
+
order.validates :delivery_country, presence: true
|
30
30
|
end
|
31
31
|
|
32
32
|
validate do
|
@@ -43,7 +43,7 @@ module Shoppe
|
|
43
43
|
# Ensure that before we confirm the order that the delivery service which has been selected
|
44
44
|
# is appropritae for the contents of the order.
|
45
45
|
if self.delivery_required? && !self.valid_delivery_service?
|
46
|
-
raise Shoppe::Errors::InappropriateDeliveryService, :
|
46
|
+
raise Shoppe::Errors::InappropriateDeliveryService, order: self
|
47
47
|
end
|
48
48
|
cache_delivery_pricing
|
49
49
|
end
|
@@ -137,7 +137,7 @@ module Shoppe
|
|
137
137
|
# @return [Array] an array of Shoppe:DeliveryServicePrice objects
|
138
138
|
def delivery_service_prices
|
139
139
|
if delivery_required?
|
140
|
-
prices = Shoppe::DeliveryServicePrice.joins(:delivery_service).where(:
|
140
|
+
prices = Shoppe::DeliveryServicePrice.joins(:delivery_service).where(shoppe_delivery_services: {active: true}).order(:price).for_weight(total_weight)
|
141
141
|
prices = prices.select { |p| p.countries.empty? || p.country?(self.delivery_country) }
|
142
142
|
prices.sort{ |x,y| (y.delivery_service.default? ? 1 : 0) <=> (x.delivery_service.default? ? 1 : 0) } # Order by truthiness
|
143
143
|
else
|
@@ -221,7 +221,7 @@ module Shoppe
|
|
221
221
|
self.status = 'shipped'
|
222
222
|
self.consignment_number = consignment_number
|
223
223
|
self.save!
|
224
|
-
Shoppe::OrderMailer.shipped(self).
|
224
|
+
Shoppe::OrderMailer.shipped(self).deliver
|
225
225
|
end
|
226
226
|
end
|
227
227
|
|
@@ -1,69 +1,69 @@
|
|
1
1
|
module Shoppe
|
2
2
|
class Order < ActiveRecord::Base
|
3
|
-
|
3
|
+
|
4
4
|
# An array of all the available statuses for an order
|
5
5
|
STATUSES = ['building', 'confirming', 'received', 'accepted', 'rejected', 'shipped']
|
6
|
-
|
6
|
+
|
7
7
|
# The Shoppe::User who accepted the order
|
8
8
|
#
|
9
9
|
# @return [Shoppe::User]
|
10
|
-
belongs_to :accepter, :
|
11
|
-
|
10
|
+
belongs_to :accepter, class_name: 'Shoppe::User', foreign_key: 'accepted_by'
|
11
|
+
|
12
12
|
# The Shoppe::User who rejected the order
|
13
13
|
#
|
14
14
|
# @return [Shoppe::User]
|
15
|
-
belongs_to :rejecter, :
|
16
|
-
|
15
|
+
belongs_to :rejecter, class_name: 'Shoppe::User', foreign_key: 'rejected_by'
|
16
|
+
|
17
17
|
# Validations
|
18
|
-
validates :status, :
|
19
|
-
|
18
|
+
validates :status, inclusion: {in: STATUSES}
|
19
|
+
|
20
20
|
# Set the status to building if we don't have a status
|
21
21
|
after_initialize { self.status = STATUSES.first if self.status.blank? }
|
22
|
-
|
22
|
+
|
23
23
|
# All orders which have been received
|
24
24
|
scope :received, -> {where("received_at is not null")}
|
25
|
-
|
25
|
+
|
26
26
|
# All orders which are currently pending acceptance/rejection
|
27
|
-
scope :pending, -> { where(:
|
28
|
-
|
27
|
+
scope :pending, -> { where(status: 'received') }
|
28
|
+
|
29
29
|
# All ordered ordered by their ID desending
|
30
|
-
scope :ordered, -> { order(:
|
31
|
-
|
30
|
+
scope :ordered, -> { order(id: :desc)}
|
31
|
+
|
32
32
|
# Is this order still being built by the user?
|
33
33
|
#
|
34
34
|
# @return [Boolean]
|
35
35
|
def building?
|
36
36
|
self.status == 'building'
|
37
37
|
end
|
38
|
-
|
38
|
+
|
39
39
|
# Is this order in the user confirmation step?
|
40
40
|
#
|
41
41
|
# @return [Boolean]
|
42
42
|
def confirming?
|
43
43
|
self.status == 'confirming'
|
44
44
|
end
|
45
|
-
|
45
|
+
|
46
46
|
# Has this order been rejected?
|
47
47
|
#
|
48
48
|
# @return [Boolean]
|
49
49
|
def rejected?
|
50
50
|
!!self.rejected_at
|
51
51
|
end
|
52
|
-
|
52
|
+
|
53
53
|
# Has this order been accepted?
|
54
54
|
#
|
55
55
|
# @return [Boolean]
|
56
56
|
def accepted?
|
57
57
|
!!self.accepted_at
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
# Has the order been received?
|
61
61
|
#
|
62
62
|
# @return [Boolean]
|
63
63
|
def received?
|
64
64
|
!!self.received_at?
|
65
65
|
end
|
66
|
-
|
67
|
-
|
66
|
+
|
67
|
+
|
68
68
|
end
|
69
69
|
end
|
@@ -6,17 +6,17 @@ module Shoppe
|
|
6
6
|
# The associated order
|
7
7
|
#
|
8
8
|
# @return [Shoppe::Order]
|
9
|
-
belongs_to :order, :
|
9
|
+
belongs_to :order, class_name: 'Shoppe::Order', touch: true, inverse_of: :order_items
|
10
10
|
|
11
11
|
# The item which has been ordered
|
12
|
-
belongs_to :ordered_item, :
|
12
|
+
belongs_to :ordered_item, polymorphic: true
|
13
13
|
|
14
14
|
# Any stock level adjustments which have been made for this order item
|
15
|
-
has_many :stock_level_adjustments, :
|
15
|
+
has_many :stock_level_adjustments, as: :parent, dependent: :nullify, class_name: 'Shoppe::StockLevelAdjustment'
|
16
16
|
|
17
17
|
# Validations
|
18
|
-
validates :quantity, :
|
19
|
-
validates :ordered_item, :
|
18
|
+
validates :quantity, numericality: true
|
19
|
+
validates :ordered_item, presence: true
|
20
20
|
|
21
21
|
validate do
|
22
22
|
unless in_stock?
|
@@ -46,13 +46,13 @@ module Shoppe
|
|
46
46
|
# @param quantity [Fixnum] the number of items to order
|
47
47
|
# @return [Shoppe::OrderItem]
|
48
48
|
def self.add_item(ordered_item, quantity = 1)
|
49
|
-
raise Errors::UnorderableItem, :
|
49
|
+
raise Errors::UnorderableItem, ordered_item: ordered_item unless ordered_item.orderable?
|
50
50
|
transaction do
|
51
|
-
if existing = self.where(:
|
51
|
+
if existing = self.where(ordered_item_id: ordered_item.id, ordered_item_type: ordered_item.class.to_s).first
|
52
52
|
existing.increase!(quantity)
|
53
53
|
existing
|
54
54
|
else
|
55
|
-
new_item = self.create(:
|
55
|
+
new_item = self.create(ordered_item: ordered_item, quantity: 0)
|
56
56
|
new_item.increase!(quantity)
|
57
57
|
new_item
|
58
58
|
end
|
@@ -79,7 +79,7 @@ module Shoppe
|
|
79
79
|
transaction do
|
80
80
|
self.quantity += amount
|
81
81
|
unless self.in_stock?
|
82
|
-
raise Shoppe::Errors::NotEnoughStock, :
|
82
|
+
raise Shoppe::Errors::NotEnoughStock, ordered_item: self.ordered_item, requested_stock: self.quantity
|
83
83
|
end
|
84
84
|
self.save!
|
85
85
|
self.order.remove_delivery_service_if_invalid
|
@@ -231,7 +231,7 @@ module Shoppe
|
|
231
231
|
# Allocate any unallocated stock for this order item. There is no return value.
|
232
232
|
def allocate_unallocated_stock!
|
233
233
|
if self.ordered_item.stock_control? && self.unallocated_stock != 0
|
234
|
-
self.ordered_item.stock_level_adjustments.create!(:
|
234
|
+
self.ordered_item.stock_level_adjustments.create!(parent: self, adjustment: 0 - self.unallocated_stock, description: "Order ##{self.order.number}")
|
235
235
|
end
|
236
236
|
end
|
237
237
|
|
@@ -8,17 +8,17 @@ module Shoppe
|
|
8
8
|
# The associated order
|
9
9
|
#
|
10
10
|
# @return [Shoppe::Order]
|
11
|
-
belongs_to :order, :
|
11
|
+
belongs_to :order, class_name: 'Shoppe::Order'
|
12
12
|
|
13
13
|
# An associated payment (only applies to refunds)
|
14
14
|
#
|
15
15
|
# @return [Shoppe::Payment]
|
16
|
-
belongs_to :parent, :
|
16
|
+
belongs_to :parent, class_name: "Shoppe::Payment", foreign_key: "parent_payment_id"
|
17
17
|
|
18
18
|
# Validations
|
19
|
-
validates :amount, :
|
20
|
-
validates :reference, :
|
21
|
-
validates :method, :
|
19
|
+
validates :amount, numericality: true
|
20
|
+
validates :reference, presence: true
|
21
|
+
validates :method, presence: true
|
22
22
|
|
23
23
|
# Payments can have associated properties
|
24
24
|
key_value_store :properties
|
@@ -58,12 +58,12 @@ module Shoppe
|
|
58
58
|
amount = BigDecimal(amount)
|
59
59
|
if refundable_amount >= amount
|
60
60
|
transaction do
|
61
|
-
self.class.create(:
|
61
|
+
self.class.create(parent: self, order_id: self.order_id, amount: 0-amount, method: self.method, reference: reference)
|
62
62
|
self.update_attribute(:amount_refunded, self.amount_refunded + amount)
|
63
63
|
true
|
64
64
|
end
|
65
65
|
else
|
66
|
-
raise Shoppe::Errors::RefundFailed, :
|
66
|
+
raise Shoppe::Errors::RefundFailed, message: I18n.t('.refund_failed', refundable_amount: refundable_amount)
|
67
67
|
end
|
68
68
|
end
|
69
69
|
end
|
@@ -11,7 +11,7 @@ module Shoppe
|
|
11
11
|
require_dependency 'shoppe/product/variants'
|
12
12
|
|
13
13
|
# Attachments for this product
|
14
|
-
has_many :attachments, :
|
14
|
+
has_many :attachments, as: :parent, dependent: :destroy, autosave: true, class_name: "Shoppe::Attachment"
|
15
15
|
|
16
16
|
# The product's categorizations
|
17
17
|
#
|
@@ -25,38 +25,38 @@ module Shoppe
|
|
25
25
|
# The product's tax rate
|
26
26
|
#
|
27
27
|
# @return [Shoppe::TaxRate]
|
28
|
-
belongs_to :tax_rate, :
|
28
|
+
belongs_to :tax_rate, class_name: "Shoppe::TaxRate"
|
29
29
|
|
30
30
|
# Ordered items which are associated with this product
|
31
|
-
has_many :order_items, :
|
31
|
+
has_many :order_items, dependent: :restrict_with_exception, class_name: 'Shoppe::OrderItem', as: :ordered_item
|
32
32
|
|
33
33
|
# Orders which have ordered this product
|
34
|
-
has_many :orders, :
|
34
|
+
has_many :orders, through: :order_items, class_name: 'Shoppe::Order'
|
35
35
|
|
36
36
|
# Stock level adjustments for this product
|
37
|
-
has_many :stock_level_adjustments, :
|
37
|
+
has_many :stock_level_adjustments, dependent: :destroy, class_name: 'Shoppe::StockLevelAdjustment', as: :item
|
38
38
|
|
39
39
|
# Validations
|
40
|
-
with_options :
|
40
|
+
with_options if: Proc.new { |p| p.parent.nil? } do |product|
|
41
41
|
product.validate :has_at_least_one_product_category
|
42
|
-
product.validates :description, :
|
43
|
-
product.validates :short_description, :
|
42
|
+
product.validates :description, presence: true
|
43
|
+
product.validates :short_description, presence: true
|
44
44
|
end
|
45
|
-
validates :name, :
|
46
|
-
validates :permalink, :
|
47
|
-
validates :sku, :
|
48
|
-
validates :weight, :
|
49
|
-
validates :price, :
|
50
|
-
validates :cost_price, :
|
45
|
+
validates :name, presence: true
|
46
|
+
validates :permalink, presence: true, uniqueness: true, permalink: true
|
47
|
+
validates :sku, presence: true
|
48
|
+
validates :weight, numericality: true
|
49
|
+
validates :price, numericality: true
|
50
|
+
validates :cost_price, numericality: true, allow_blank: true
|
51
51
|
|
52
52
|
# Before validation, set the permalink if we don't already have one
|
53
53
|
before_validation { self.permalink = self.name.parameterize if self.permalink.blank? && self.name.is_a?(String) }
|
54
54
|
|
55
55
|
# All active products
|
56
|
-
scope :active, -> { where(:
|
56
|
+
scope :active, -> { where(active: true) }
|
57
57
|
|
58
58
|
# All featured products
|
59
|
-
scope :featured, -> {where(:
|
59
|
+
scope :featured, -> {where(featured: true)}
|
60
60
|
|
61
61
|
# Localisations
|
62
62
|
translates :name, :permalink, :description, :short_description
|
@@ -123,7 +123,7 @@ module Shoppe
|
|
123
123
|
|
124
124
|
# Set attachment for the default_image role
|
125
125
|
def default_image_file=(file)
|
126
|
-
self.attachments.build(:
|
126
|
+
self.attachments.build(file: file, role: 'default_image')
|
127
127
|
end
|
128
128
|
|
129
129
|
# Return attachment for the data_sheet role
|
@@ -141,8 +141,8 @@ module Shoppe
|
|
141
141
|
#
|
142
142
|
# @return [Enumerable]
|
143
143
|
def self.with_attributes(key, values)
|
144
|
-
product_ids = Shoppe::ProductAttribute.searchable.where(:
|
145
|
-
where(:
|
144
|
+
product_ids = Shoppe::ProductAttribute.searchable.where(key: key, value: values).pluck(:product_id).uniq
|
145
|
+
where(id: product_ids)
|
146
146
|
end
|
147
147
|
|
148
148
|
# Imports products from a spreadsheet file
|
@@ -158,10 +158,10 @@ module Shoppe
|
|
158
158
|
|
159
159
|
# Don't import products where the name is blank
|
160
160
|
unless row["name"].nil?
|
161
|
-
if product =
|
162
|
-
# Dont import products with the same name but update quantities
|
161
|
+
if product = where(name: row["name"]).take
|
162
|
+
# Dont import products with the same name but update quantities
|
163
163
|
qty = row["qty"].to_i
|
164
|
-
if qty > 0
|
164
|
+
if qty > 0
|
165
165
|
product.stock_level_adjustments.create!(description: I18n.t('shoppe.import'), adjustment: qty)
|
166
166
|
end
|
167
167
|
else
|
@@ -175,8 +175,8 @@ module Shoppe
|
|
175
175
|
product.permalink = row["permalink"]
|
176
176
|
|
177
177
|
product.product_categories << begin
|
178
|
-
if Shoppe::ProductCategory.
|
179
|
-
Shoppe::ProductCategory.
|
178
|
+
if Shoppe::ProductCategory.where(name: row["category_name"]).present?
|
179
|
+
Shoppe::ProductCategory.where(name: row["category_name"]).take
|
180
180
|
else
|
181
181
|
Shoppe::ProductCategory.create(name: row["category_name"])
|
182
182
|
end
|
@@ -1,13 +1,13 @@
|
|
1
1
|
module Shoppe
|
2
2
|
class Product < ActiveRecord::Base
|
3
|
-
|
3
|
+
|
4
4
|
# Product attributes for this product
|
5
|
-
has_many :product_attributes, -> { order(:position) }, :
|
6
|
-
|
5
|
+
has_many :product_attributes, -> { order(:position) }, class_name: 'Shoppe::ProductAttribute'
|
6
|
+
|
7
7
|
# Used for setting an array of product attributes which will be updated. Usually
|
8
8
|
# received from a web browser.
|
9
9
|
attr_accessor :product_attributes_array
|
10
|
-
|
10
|
+
|
11
11
|
# After saving automatically try to update the product attributes based on the
|
12
12
|
# the contents of the product_attributes_array array.
|
13
13
|
after_save do
|
@@ -15,6 +15,6 @@ module Shoppe
|
|
15
15
|
self.product_attributes.update_from_array(product_attributes_array)
|
16
16
|
end
|
17
17
|
end
|
18
|
-
|
18
|
+
|
19
19
|
end
|
20
20
|
end
|
@@ -5,13 +5,13 @@ module Shoppe
|
|
5
5
|
validate { errors.add :base, :can_belong_to_root if self.parent && self.parent.parent }
|
6
6
|
|
7
7
|
# Variants of the product
|
8
|
-
has_many :variants, :
|
8
|
+
has_many :variants, class_name: 'Shoppe::Product', foreign_key: 'parent_id', dependent: :destroy
|
9
9
|
|
10
10
|
# The parent product (only applies to variants)
|
11
|
-
belongs_to :parent, :
|
11
|
+
belongs_to :parent, class_name: 'Shoppe::Product', foreign_key: 'parent_id'
|
12
12
|
|
13
13
|
# All products which are not variants
|
14
|
-
scope :root, -> { where(:
|
14
|
+
scope :root, -> { where(parent_id: nil) }
|
15
15
|
|
16
16
|
# If a variant is created, the base product should be updated so that it doesn't have stock control enabled
|
17
17
|
after_save do
|
@@ -1,23 +1,23 @@
|
|
1
1
|
module Shoppe
|
2
2
|
class ProductAttribute < ActiveRecord::Base
|
3
|
-
|
4
|
-
self.table_name = 'shoppe_product_attributes'
|
5
|
-
|
3
|
+
|
4
|
+
self.table_name = 'shoppe_product_attributes'
|
5
|
+
|
6
6
|
# Validations
|
7
|
-
validates :key, :
|
8
|
-
|
7
|
+
validates :key, presence: true
|
8
|
+
|
9
9
|
# The associated product
|
10
10
|
#
|
11
11
|
# @return [Shoppe::Product]
|
12
|
-
belongs_to :product, :
|
13
|
-
|
12
|
+
belongs_to :product, class_name: 'Shoppe::Product'
|
13
|
+
|
14
14
|
# All attributes which are searchable
|
15
|
-
scope :searchable, -> { where(:
|
16
|
-
|
15
|
+
scope :searchable, -> { where(searchable: true) }
|
16
|
+
|
17
17
|
# All attributes which are public
|
18
|
-
scope :publicly_accessible, -> { where(:
|
19
|
-
|
20
|
-
# Return the
|
18
|
+
scope :publicly_accessible, -> { where(public: true) }
|
19
|
+
|
20
|
+
# Return the available options as a hash
|
21
21
|
#
|
22
22
|
# @return [Hash]
|
23
23
|
def self.grouped_hash
|
@@ -26,7 +26,7 @@ module Shoppe
|
|
26
26
|
h
|
27
27
|
end
|
28
28
|
end
|
29
|
-
|
29
|
+
|
30
30
|
# Create/update attributes for a product based on the provided hash of
|
31
31
|
# keys & values.
|
32
32
|
#
|
@@ -38,11 +38,11 @@ module Shoppe
|
|
38
38
|
next if hash['key'].blank?
|
39
39
|
index += 1
|
40
40
|
params = hash.merge({
|
41
|
-
:
|
42
|
-
:
|
43
|
-
:
|
41
|
+
searchable: hash['searchable'].to_s == '1',
|
42
|
+
public: hash['public'].to_s == '1',
|
43
|
+
position: index
|
44
44
|
})
|
45
|
-
if existing_attr = self.where(:
|
45
|
+
if existing_attr = self.where(key: hash['key']).first
|
46
46
|
if hash['value'].blank?
|
47
47
|
existing_attr.destroy
|
48
48
|
index -= 1
|
@@ -53,14 +53,14 @@ module Shoppe
|
|
53
53
|
attribute = self.create(params)
|
54
54
|
end
|
55
55
|
end
|
56
|
-
self.where(:
|
56
|
+
self.where(key: existing_keys - array.map { |h| h['key']}).delete_all
|
57
57
|
true
|
58
58
|
end
|
59
|
-
|
59
|
+
|
60
60
|
def self.public
|
61
61
|
ActiveSupport::Deprecation.warn("The use of Shoppe::ProductAttribute.public is deprecated. use Shoppe::ProductAttribute.publicly_accessible.")
|
62
62
|
self.publicly_accessible
|
63
63
|
end
|
64
|
-
|
64
|
+
|
65
65
|
end
|
66
66
|
end
|