caboose-cms 0.9.31 → 0.9.32
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/app/assets/javascripts/caboose/cart_old.js +4 -4
- data/app/assets/javascripts/caboose/checkout/checkout_controller.js +36 -21
- data/app/controllers/caboose/cart_controller.rb +88 -21
- data/app/controllers/caboose/checkout_controller.rb +5 -3
- data/app/controllers/caboose/products_controller.rb +1 -1
- data/app/controllers/caboose/variant_limits_controller.rb +30 -6
- data/app/models/caboose/user.rb +19 -0
- data/app/models/caboose/variant_limit.rb +19 -19
- data/app/views/caboose/variant_limits/admin_edit.html.erb +4 -3
- data/app/views/caboose/variant_limits/admin_user_index.html.erb +8 -8
- data/app/views/caboose/variants/admin_edit.html.erb +37 -31
- data/lib/caboose/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e7e918dcb7efd1eb157ba0b54dc180d342e962e8
|
4
|
+
data.tar.gz: 2cda5ba3ae8b731a65f16a439c1093bd8c419c97
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5022f3cd6e8dad98eba1ea3a07732c13bde07f21fb0a055b2cdbee482451811dc596d5b672884a3dc61a91dd5ea03ae967d28bc0d6da8d0694ca0f30e048e326
|
7
|
+
data.tar.gz: 1b62d17eee2a6bb6f3d5de84496c75afa657914ddd5ef1c66f2eded7aeb1e18ae0806c01e332869729dd237efb3159d05415cf0dbe2e43f2f5030aa628f51230
|
@@ -99,7 +99,7 @@ Caboose.Store.Modules.Cart = (function() {
|
|
99
99
|
type: $form.attr('method'),
|
100
100
|
url: $form.attr('action'),
|
101
101
|
data: $form.serialize(),
|
102
|
-
success: function(response) {
|
102
|
+
success: function(response) {
|
103
103
|
if (response.success) {
|
104
104
|
self.render_item_count(response.item_count);
|
105
105
|
if (self.$add_to_cart.length) self.$add_to_cart.trigger('added');
|
@@ -123,9 +123,9 @@ Caboose.Store.Modules.Cart = (function() {
|
|
123
123
|
} else {
|
124
124
|
if (!self.$add_to_cart.find('.message').length) {
|
125
125
|
self.$add_to_cart
|
126
|
-
.append($('<div/>').hide().addClass('
|
127
|
-
.append($('<p/>').
|
128
|
-
|
126
|
+
.append($('<div/>').hide().addClass('message')
|
127
|
+
.append($('<p/>').addClass('note error').html(response.error ? response.error : (response.errors ? response.errors[0] : "Error adding to cart")))
|
128
|
+
// .append($('<p/>').append($('<a/>').attr('href', '/cart').html('View cart')))
|
129
129
|
);
|
130
130
|
self.$add_to_cart.find('.message').fadeIn();
|
131
131
|
}
|
@@ -232,35 +232,50 @@ CheckoutController.prototype = {
|
|
232
232
|
Invoice confirmation
|
233
233
|
*****************************************************************************/
|
234
234
|
|
235
|
-
confirm_invoice: function(
|
235
|
+
confirm_invoice: function(total_is_ok, variant_limits_are_ok)
|
236
236
|
{
|
237
237
|
var that = this;
|
238
238
|
|
239
|
-
|
240
|
-
var t = $.ajax_value('/checkout/total');
|
241
|
-
if (parseFloat(t) != that.invoice.total)
|
239
|
+
if (!total_is_ok)
|
242
240
|
{
|
243
|
-
$('#message').html("<p class='
|
244
|
-
|
241
|
+
$('#message').html("<p class='loading'>Verifying order total...</p>");
|
242
|
+
$.get('/checkout/total', function(x) {
|
243
|
+
if (parseFloat(x) != that.invoice.total)
|
244
|
+
{
|
245
|
+
$('#message').html("<p class='note error'>It looks like the order total has changed since this was loaded. Please submit your order again after this page refreshes.</p>");
|
246
|
+
setTimeout(function() { window.location.reload(true); }, 3000);
|
247
|
+
}
|
248
|
+
else
|
249
|
+
that.confirm_invoice(true);
|
250
|
+
});
|
251
|
+
return;
|
252
|
+
}
|
253
|
+
if (!variant_limits_are_ok)
|
254
|
+
{
|
255
|
+
$('#message').html("<p class='loading'>Verifying limits...</p>");
|
256
|
+
$.get('/cart/check-variant-limits', function(resp) {
|
257
|
+
if (resp.success) that.confirm_invoice(true, true);
|
258
|
+
if (resp.error)
|
259
|
+
{
|
260
|
+
$('#message').html("<p class='note error'>" + resp.error + "</p>");
|
261
|
+
setTimeout(function() { window.location.reload(true); }, 3000);
|
262
|
+
}
|
263
|
+
});
|
245
264
|
return;
|
246
265
|
}
|
247
266
|
|
248
267
|
$('#message').html("<p class='loading'>Processing payment...</p>");
|
249
|
-
$.
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
.append($('<
|
258
|
-
|
259
|
-
|
260
|
-
.append($('<input/>').attr('type', 'button').val('Confirm Order').click(function(e) { that.confirm_invoice(); }))
|
261
|
-
);
|
262
|
-
}
|
263
|
-
}
|
268
|
+
$.post('/checkout/confirm', function(resp) {
|
269
|
+
if (resp.success) window.location = '/checkout/thanks';
|
270
|
+
if (resp.error)
|
271
|
+
{
|
272
|
+
$('#message').empty()
|
273
|
+
.append($('<p/>').addClass('note error').append(resp.error))
|
274
|
+
.append($('<p/>')
|
275
|
+
.append($('<input/>').attr('type', 'button').val('Make Changes' ).click(function(e) { that.print(); })).append(' ')
|
276
|
+
.append($('<input/>').attr('type', 'button').val('Confirm Order').click(function(e) { that.confirm_invoice(); }))
|
277
|
+
);
|
278
|
+
}
|
264
279
|
});
|
265
280
|
},
|
266
281
|
|
@@ -37,6 +37,66 @@ module Caboose
|
|
37
37
|
render :json => { :item_count => @invoice.item_count }
|
38
38
|
end
|
39
39
|
|
40
|
+
# @route GET /cart/check-variant-limits
|
41
|
+
def check_variant_limits
|
42
|
+
resp = StdClass.new
|
43
|
+
errors = []
|
44
|
+
|
45
|
+
if @invoice.nil?
|
46
|
+
errors << "No invoice found."
|
47
|
+
else
|
48
|
+
@invoice.line_items.each do |li|
|
49
|
+
vl = VariantLimit.where(:variant_id => li.variant_id, :user_id => @logged_in_user.id).first
|
50
|
+
vl = VariantLimit.where(:variant_id => li.variant_id, :user_id => User.logged_out_user_id(@site.id)).first if vl.nil?
|
51
|
+
next if vl.nil?
|
52
|
+
|
53
|
+
if vl.no_purchases_allowed(@invoice)
|
54
|
+
|
55
|
+
InvoiceLog.create(:invoice_id => @invoice.id, :line_item_id => li.id, :user_id => logged_in_user.id, :date_logged => DateTime.now.utc, :invoice_action => InvoiceLog::ACTION_LINE_ITEM_DELETED)
|
56
|
+
if li.invoice_package_id
|
57
|
+
li.invoice_package.shipping_method_id = nil
|
58
|
+
li.invoice_package.total = nil
|
59
|
+
li.invoice_package.save
|
60
|
+
end
|
61
|
+
li.destroy
|
62
|
+
@invoice.shipping = 0.00
|
63
|
+
|
64
|
+
errors << "You don't have permission to purchase this item." + (!logged_in? ? "You may have different purchase permissions if you <a href='/login'>login</a>." : '')
|
65
|
+
next
|
66
|
+
|
67
|
+
end
|
68
|
+
|
69
|
+
qty = vl.current_value ? vl.current_value + li.quantity : li.quantity
|
70
|
+
next if vl.qty_within_range(qty, @invoice)
|
71
|
+
|
72
|
+
error = vl.quantity_message(@invoice)
|
73
|
+
if !logged_in?
|
74
|
+
error << "You may have different purchase permissions if you <a href='/login'>login</a>." if !logged_in?
|
75
|
+
if vl.qty_too_low(li.quantity, @invoice) then li.quantity = vl.min_quantity(@invoice)
|
76
|
+
elsif vl.qty_too_high(qty, @invoice) then li.quantity = vl.max_quantity(@invoice)
|
77
|
+
end
|
78
|
+
else
|
79
|
+
if vl.qty_too_low(li.quantity, @invoice)
|
80
|
+
li.quantity = vl.min_quantity(@invoice)
|
81
|
+
error = "You must purchase at least #{li.quantity} of this item, your cart has been updated."
|
82
|
+
elsif vl.qty_too_high(qty, @invoice)
|
83
|
+
li.quantity = vl.max_quantity(@invoice) - vl.current_value
|
84
|
+
error = "You can only purchase #{li.quantity} of this item, your cart has been updated."
|
85
|
+
end
|
86
|
+
end
|
87
|
+
li.save
|
88
|
+
errors << error
|
89
|
+
end
|
90
|
+
if errors.count > 0
|
91
|
+
@invoice.calculate
|
92
|
+
resp.error = errors.join("<br/>")
|
93
|
+
else
|
94
|
+
resp.success = true
|
95
|
+
end
|
96
|
+
end
|
97
|
+
render :json => resp
|
98
|
+
end
|
99
|
+
|
40
100
|
# @route POST /cart
|
41
101
|
def add
|
42
102
|
resp = StdClass.new
|
@@ -51,27 +111,34 @@ module Caboose
|
|
51
111
|
# Check the variant limits
|
52
112
|
vl = VariantLimit.where(:variant_id => v.id, :user_id => @logged_in_user.id).first
|
53
113
|
vl = VariantLimit.where(:variant_id => v.id, :user_id => User.logged_out_user_id(@site.id)).first if vl.nil?
|
54
|
-
if vl && vl.no_purchases_allowed
|
114
|
+
if vl && vl.no_purchases_allowed(@invoice)
|
55
115
|
resp.error = "You don't have permission to purchase this item."
|
56
|
-
resp.error << "You may have different purchase permissions if you <a href='/login'>login</a>." if !logged_in?
|
116
|
+
resp.error << " You may have different purchase permissions if you <a href='/login'>login</a>." if !logged_in?
|
57
117
|
render :json => resp
|
58
118
|
return
|
59
119
|
end
|
60
120
|
qty2 = logged_in? && vl && vl.current_value ? qty + vl.current_value : qty
|
61
|
-
if vl && !vl.qty_within_range(qty2)
|
62
|
-
resp.quantity_message = vl.quantity_message
|
63
|
-
if !logged_in?
|
121
|
+
if vl && !vl.qty_within_range(qty2, @invoice)
|
122
|
+
resp.quantity_message = vl.quantity_message(@invoice)
|
123
|
+
if !logged_in?
|
64
124
|
resp.quantity_message << "You may have different purchase permissions if you <a href='/login'>login</a>." if !logged_in?
|
65
|
-
if vl.qty_too_low(qty)
|
66
|
-
elsif vl.qty_too_high(qty)
|
125
|
+
if vl.qty_too_low(qty, @invoice) then qty = vl.min_quantity(@invoice)
|
126
|
+
elsif vl.qty_too_high(qty, @invoice) then qty = vl.max_quantity(@invoice)
|
67
127
|
end
|
68
|
-
else
|
69
|
-
if vl.qty_too_low(qty)
|
70
|
-
qty = vl.min_quantity
|
71
|
-
resp.quantity_message = "You must purchase at least #{vl.min_quantity} of this item, your cart has been updated."
|
72
|
-
elsif vl.qty_too_high(qty2)
|
73
|
-
qty = vl.max_quantity - vl.current_value
|
74
|
-
|
128
|
+
else
|
129
|
+
if vl.qty_too_low(qty, @invoice)
|
130
|
+
qty = vl.min_quantity(@invoice)
|
131
|
+
resp.quantity_message = "You must purchase at least #{vl.min_quantity(@invoice)} of this item, your cart has been updated."
|
132
|
+
elsif vl.qty_too_high(qty2, @invoice)
|
133
|
+
qty = vl.max_quantity(@invoice) - vl.current_value
|
134
|
+
if vl.max_quantity == vl.current_value
|
135
|
+
resp.success = false
|
136
|
+
resp.error = "You have already purchased the maximum quantity allowed for this item."
|
137
|
+
render :json => resp
|
138
|
+
return
|
139
|
+
else
|
140
|
+
resp.quantity_message = "You can only purchase #{qty} of this item, your cart has been updated."
|
141
|
+
end
|
75
142
|
end
|
76
143
|
end
|
77
144
|
end
|
@@ -145,23 +212,23 @@ module Caboose
|
|
145
212
|
# Check the variant limits
|
146
213
|
vl = VariantLimit.where(:variant_id => li.variant_id, :user_id => @logged_in_user.id).first
|
147
214
|
vl = VariantLimit.where(:variant_id => li.variant_id, :user_id => User.logged_out_user_id(@site.id)).first if vl.nil?
|
148
|
-
if vl && vl.no_purchases_allowed
|
215
|
+
if vl && vl.no_purchases_allowed(@invoice)
|
149
216
|
resp.error = "You don't have permission to purchase this item."
|
150
217
|
resp.error << "You may have different purchase permissions if you <a href='/login'>login</a>." if !logged_in?
|
151
218
|
render :json => resp
|
152
219
|
return
|
153
220
|
end
|
154
221
|
qty2 = logged_in? && vl && vl.current_value ? qty + vl.current_value : qty
|
155
|
-
if vl && !vl.qty_within_range(qty2)
|
156
|
-
resp.quantity_message = vl.quantity_message
|
222
|
+
if vl && !vl.qty_within_range(qty2, @invoice)
|
223
|
+
resp.quantity_message = vl.quantity_message(@invoice)
|
157
224
|
if !logged_in?
|
158
225
|
resp.quantity_message << "You may have different purchase permissions if you <a href='/login'>login</a>." if !logged_in?
|
159
|
-
if vl.qty_too_low(qty)
|
160
|
-
elsif vl.qty_too_high(qty)
|
226
|
+
if vl.qty_too_low(qty, @invoice) then qty = vl.min_quantity(@invoice)
|
227
|
+
elsif vl.qty_too_high(qty, @invoice) then qty = vl.max_quantity(@invoice)
|
161
228
|
end
|
162
229
|
else
|
163
|
-
if vl.qty_too_low(qty)
|
164
|
-
elsif vl.qty_too_high(qty2)
|
230
|
+
if vl.qty_too_low(qty, @invoice) then qty = (qty == 0 ? 0 : vl.min_quantity(@invoice))
|
231
|
+
elsif vl.qty_too_high(qty2, @invoice) then qty = vl.max_quantity(@invoice) - vl.current_value
|
165
232
|
end
|
166
233
|
end
|
167
234
|
end
|
@@ -207,6 +207,8 @@ module Caboose
|
|
207
207
|
|
208
208
|
resp = Caboose::StdClass.new
|
209
209
|
sc = @site.store_config
|
210
|
+
|
211
|
+
@invoice.customer.create_variant_limits if @invoice.customer
|
210
212
|
|
211
213
|
# Make sure all the variants still exist
|
212
214
|
@invoice.line_items.each do |li|
|
@@ -215,7 +217,7 @@ module Caboose
|
|
215
217
|
if v.nil? || v.status == 'Deleted'
|
216
218
|
render :json => { :error => 'One or more of the products you are purchasing are no longer available.' }
|
217
219
|
return
|
218
|
-
elsif vl && !vl.qty_within_range(
|
220
|
+
elsif vl && !vl.qty_within_range(vl.current_value + li.quantity, @invoice)
|
219
221
|
render :json => { :error => 'You have exceeded the limit you are allowed to purchase.' }
|
220
222
|
return
|
221
223
|
end
|
@@ -313,14 +315,14 @@ module Caboose
|
|
313
315
|
add_ga_event('Ecommerce', 'Checkout', 'Payment', (@last_invoice.total*100).to_i)
|
314
316
|
end
|
315
317
|
|
316
|
-
#===========================================================================
|
318
|
+
#===========================================================================
|
317
319
|
|
318
320
|
# @route GET /checkout/state-options
|
319
321
|
def state_options
|
320
322
|
options = Caboose::States.all.collect { |abbr, state| { 'value' => abbr, 'text' => abbr }}
|
321
323
|
render :json => options
|
322
324
|
end
|
323
|
-
|
325
|
+
|
324
326
|
# @route GET /checkout/total
|
325
327
|
def verify_total
|
326
328
|
total = 0.00
|
@@ -71,7 +71,7 @@ module Caboose
|
|
71
71
|
|
72
72
|
elsif params[:id].to_i > 0 && Product.exists?(params[:id])
|
73
73
|
@product = Product.find(params[:id])
|
74
|
-
render '
|
74
|
+
render 'caboose/products/not_available' and return if @product.status == 'Inactive' || @product.site_id != @site.id
|
75
75
|
|
76
76
|
@category = @product.categories.first
|
77
77
|
@review = Review.new
|
@@ -31,7 +31,7 @@ module Caboose
|
|
31
31
|
render :json => variantlimit.as_json(:include => [:variant])
|
32
32
|
end
|
33
33
|
|
34
|
-
# @route POST /admin/variant-limits
|
34
|
+
# @route POST /admin/users/:user_id/variant-limits
|
35
35
|
def admin_add
|
36
36
|
return unless (user_is_allowed_to 'edit', 'variantlimits')
|
37
37
|
resp = Caboose::StdClass.new
|
@@ -39,16 +39,30 @@ module Caboose
|
|
39
39
|
resp.error = 'That variant is already added to this user.'
|
40
40
|
else
|
41
41
|
c = VariantLimit.new
|
42
|
-
c.user_id
|
43
|
-
c.variant_id
|
42
|
+
c.user_id = params[:user_id]
|
43
|
+
c.variant_id = params[:variant_id]
|
44
44
|
c.min_quantity_value = 0
|
45
45
|
c.max_quantity_value = 0
|
46
|
-
c.current_value
|
46
|
+
c.current_value = 0
|
47
47
|
c.save
|
48
48
|
resp.success = true
|
49
49
|
end
|
50
50
|
render :json => resp
|
51
51
|
end
|
52
|
+
|
53
|
+
# @route PUT /admin/variant-limits/new/:variant_id
|
54
|
+
def admin_create
|
55
|
+
resp = Caboose::StdClass.new
|
56
|
+
mq = params[:max_quantity_value]
|
57
|
+
elo = User.where(:site_id => @site.id, :username => 'elo').first
|
58
|
+
vl = VariantLimit.where(:user_id => elo.id, :variant_id => params[:variant_id]).first
|
59
|
+
vl = VariantLimit.create(:user_id => elo.id, :variant_id => params[:variant_id]) if vl.nil?
|
60
|
+
vl.max_quantity_value = mq.blank? ? nil : mq
|
61
|
+
vl.min_quantity_value = 0
|
62
|
+
vl.current_value = 0
|
63
|
+
resp.success = vl.save
|
64
|
+
render :json => resp
|
65
|
+
end
|
52
66
|
|
53
67
|
# @route PUT /admin/variant-limits/:id
|
54
68
|
# @route PUT /admin/users/:user_id/variant-limits/:id
|
@@ -58,7 +72,6 @@ module Caboose
|
|
58
72
|
variantlimit = VariantLimit.find(params[:id])
|
59
73
|
user = logged_in_user
|
60
74
|
if user
|
61
|
-
|
62
75
|
params.each do |k,v|
|
63
76
|
case k
|
64
77
|
when "user_id" then variantlimit.user_id = v
|
@@ -70,7 +83,6 @@ module Caboose
|
|
70
83
|
when "current_value" then variantlimit.current_value = v
|
71
84
|
end
|
72
85
|
end
|
73
|
-
|
74
86
|
resp.success = variantlimit.save
|
75
87
|
end
|
76
88
|
render :json => resp
|
@@ -89,6 +101,18 @@ module Caboose
|
|
89
101
|
@variant_limit = Caboose::VariantLimit.find(params[:id])
|
90
102
|
end
|
91
103
|
|
104
|
+
# @route DELETE /admin/variant-limits/bulk
|
105
|
+
def admin_bulk_delete
|
106
|
+
return if !user_is_allowed('variantlimits', 'delete')
|
107
|
+
resp = Caboose::StdClass.new
|
108
|
+
params[:model_ids].each do |vl_id|
|
109
|
+
vl = VariantLimit.find(vl_id)
|
110
|
+
vl.destroy
|
111
|
+
end
|
112
|
+
resp.success = true
|
113
|
+
render :json => resp
|
114
|
+
end
|
115
|
+
|
92
116
|
# @route_priority 1
|
93
117
|
# @route GET /admin/variant-limits/variant-options
|
94
118
|
def admin_variant_options
|
data/app/models/caboose/user.rb
CHANGED
@@ -83,6 +83,25 @@ class Caboose::User < ActiveRecord::Base
|
|
83
83
|
end
|
84
84
|
return true
|
85
85
|
end
|
86
|
+
|
87
|
+
def create_variant_limits
|
88
|
+
elo = Caboose::User.where(:site_id => self.site_id, :username => 'elo').first if !self.site_id.blank?
|
89
|
+
variant_limits = Caboose::VariantLimit.where(:user_id => elo.id).all if elo
|
90
|
+
if variant_limits && variant_limits.count > 0
|
91
|
+
variant_limits.each do |vl|
|
92
|
+
new_vl = Caboose::VariantLimit.where(:user_id => self.id, :variant_id => vl.variant_id).first
|
93
|
+
if new_vl.nil?
|
94
|
+
new_vl = Caboose::VariantLimit.create(:user_id => self.id, :variant_id => vl.variant_id)
|
95
|
+
new_vl.min_quantity_value = vl.min_quantity_value
|
96
|
+
new_vl.min_quantity_func = vl.min_quantity_func
|
97
|
+
new_vl.max_quantity_value = vl.max_quantity_value
|
98
|
+
new_vl.max_quantity_func = vl.max_quantity_func
|
99
|
+
new_vl.current_value = 0
|
100
|
+
new_vl.save
|
101
|
+
end
|
102
|
+
end
|
103
|
+
end
|
104
|
+
end
|
86
105
|
|
87
106
|
def is_member?(role_id)
|
88
107
|
roles.each do |r|
|
@@ -13,49 +13,49 @@ module Caboose
|
|
13
13
|
:max_quantity_func ,
|
14
14
|
:current_value
|
15
15
|
|
16
|
-
def min_quantity
|
16
|
+
def min_quantity(invoice)
|
17
17
|
return self.min_quantity_value if self.min_quantity_func.nil? || self.min_quantity_func.strip.length == 0
|
18
18
|
return eval(self.min_quantity_func)
|
19
19
|
end
|
20
20
|
|
21
|
-
def max_quantity
|
21
|
+
def max_quantity(invoice)
|
22
22
|
return self.max_quantity_value if self.max_quantity_func.nil? || self.max_quantity_func.strip.length == 0
|
23
23
|
return eval(self.max_quantity_func)
|
24
24
|
end
|
25
25
|
|
26
|
-
def quantity_message
|
27
|
-
if self.min_quantity == 0 && self.max_quantity == 0
|
26
|
+
def quantity_message(invoice)
|
27
|
+
if self.min_quantity(invoice) == 0 && self.max_quantity(invoice) == 0
|
28
28
|
return "You are not allowed to purchase this item."
|
29
29
|
end
|
30
|
-
if self.max_quantity
|
31
|
-
if self.min_quantity && self.min_quantity > 0
|
32
|
-
return "You are allowed to purchase between #{self.min_quantity} and #{self.max_quantity} of this item."
|
30
|
+
if self.max_quantity(invoice)
|
31
|
+
if self.min_quantity(invoice) && self.min_quantity(invoice) > 0
|
32
|
+
return "You are allowed to purchase between #{self.min_quantity(invoice)} and #{self.max_quantity(invoice)} of this item."
|
33
33
|
else
|
34
|
-
return "You are allowed to purchase up to #{self.max_quantity} of this item."
|
34
|
+
return "You are allowed to purchase up to #{self.max_quantity(invoice)} of this item."
|
35
35
|
end
|
36
36
|
end
|
37
|
-
if self.min_quantity && self.min_quantity > 0
|
38
|
-
return "You must purchase at least #{self.min_quantity} of this item."
|
37
|
+
if self.min_quantity(invoice) && self.min_quantity(invoice) > 0
|
38
|
+
return "You must purchase at least #{self.min_quantity(invoice)} of this item."
|
39
39
|
end
|
40
40
|
return nil
|
41
41
|
end
|
42
42
|
|
43
|
-
def no_purchases_allowed
|
44
|
-
return self.min_quantity == 0 && self.max_quantity == 0
|
43
|
+
def no_purchases_allowed(invoice)
|
44
|
+
return self.min_quantity(invoice) == 0 && self.max_quantity(invoice) == 0
|
45
45
|
end
|
46
46
|
|
47
|
-
def qty_within_range(qty)
|
48
|
-
return false if self.min_quantity && qty < self.min_quantity
|
49
|
-
return false if self.max_quantity && qty > self.max_quantity
|
47
|
+
def qty_within_range(qty, invoice)
|
48
|
+
return false if self.min_quantity(invoice) && qty < self.min_quantity(invoice)
|
49
|
+
return false if self.max_quantity(invoice) && qty > self.max_quantity(invoice)
|
50
50
|
return true
|
51
51
|
end
|
52
52
|
|
53
|
-
def qty_too_low(qty)
|
54
|
-
return self.min_quantity && qty < self.min_quantity
|
53
|
+
def qty_too_low(qty, invoice)
|
54
|
+
return self.min_quantity(invoice) && qty < self.min_quantity(invoice)
|
55
55
|
end
|
56
56
|
|
57
|
-
def qty_too_high(qty)
|
58
|
-
return self.max_quantity && qty > self.max_quantity
|
57
|
+
def qty_too_high(qty, invoice)
|
58
|
+
return self.max_quantity(invoice) && qty > self.max_quantity(invoice)
|
59
59
|
end
|
60
60
|
|
61
61
|
end
|
@@ -6,7 +6,9 @@
|
|
6
6
|
<p><div id='variantlimit_<%= @variant_limit.id %>_min_quantity_func' ></div></p>
|
7
7
|
<p><div id='variantlimit_<%= @variant_limit.id %>_max_quantity_value' ></div></p>
|
8
8
|
<p><div id='variantlimit_<%= @variant_limit.id %>_max_quantity_func' ></div></p>
|
9
|
-
<p
|
9
|
+
<p>Quantity Purchased: <%= @variant_limit.current_value %></p>
|
10
|
+
|
11
|
+
<a href="/admin/users/<%= @edituser.id %>/variant-limits" class="caboose-btn">Back</a>
|
10
12
|
|
11
13
|
<%= render :partial => 'caboose/users/admin_footer' %>
|
12
14
|
|
@@ -25,8 +27,7 @@ $(document).ready(function() {
|
|
25
27
|
{ name: 'min_quantity_value' , nice_name: 'Min Qty Value' , type: 'text' , value: <%= raw Caboose.json(@variant_limit.min_quantity_value ) %>, width: 600 },
|
26
28
|
{ name: 'min_quantity_func' , nice_name: 'Min Qty Function' , type: 'textarea' , value: <%= raw Caboose.json(@variant_limit.min_quantity_func ) %>, width: 600 , height: 100 },
|
27
29
|
{ name: 'max_quantity_value' , nice_name: 'Max Qty Value' , type: 'text' , value: <%= raw Caboose.json(@variant_limit.max_quantity_value ) %>, width: 600 },
|
28
|
-
{ name: 'max_quantity_func' , nice_name: 'Max Qty Function' , type: 'textarea' , value: <%= raw Caboose.json(@variant_limit.max_quantity_func ) %>, width: 600 , height: 100 }
|
29
|
-
{ name: 'current_value' , nice_name: 'Purchased' , type: 'text' , value: <%= raw Caboose.json(@variant_limit.current_value ) %>, width: 600 }
|
30
|
+
{ name: 'max_quantity_func' , nice_name: 'Max Qty Function' , type: 'textarea' , value: <%= raw Caboose.json(@variant_limit.max_quantity_func ) %>, width: 600 , height: 100 }
|
30
31
|
]
|
31
32
|
});
|
32
33
|
});
|
@@ -20,17 +20,17 @@ $(document).ready(function() {
|
|
20
20
|
allow_advanced_edit: true,
|
21
21
|
allow_import: false,
|
22
22
|
fields: [
|
23
|
-
{ show: true, editable: true , bulk_edit: false, name: 'variant_id' , nice_name: 'Product Variant' , sort: 'variant_id' , type: 'select' , value: function(r) { return r.variant_id }, width: 150 , text: function(r) { return (r.variant ? (r.variant.alternate_id ? r.variant.alternate_id : r.variant.id) : '') }, options_url: '/admin/variant-limits/variant-options' },
|
24
|
-
{ show: true, editable: true , bulk_edit: false, name: 'min_quantity_value' , nice_name: 'Min Qty
|
25
|
-
{ show:
|
26
|
-
{ show: true, editable: true , bulk_edit: false, name: 'max_quantity_value' , nice_name: 'Max Qty
|
27
|
-
{ show:
|
28
|
-
{ show: true, editable: false, bulk_edit: false, name: 'current_value' , nice_name: 'Purchased' , sort: 'current_value' , type: 'text' , value: function(r) { return r.current_value }, width: 150 }
|
23
|
+
{ show: true , editable: true , bulk_edit: false, name: 'variant_id' , nice_name: 'Product Variant' , sort: 'variant_id' , type: 'select' , value: function(r) { return r.variant_id }, width: 150 , text: function(r) { return (r.variant ? (r.variant.alternate_id ? r.variant.alternate_id : r.variant.id) : '') }, options_url: '/admin/variant-limits/variant-options' },
|
24
|
+
{ show: true , editable: true , bulk_edit: false, name: 'min_quantity_value' , nice_name: 'Min Qty' , sort: 'min_quantity_value' , type: 'text' , value: function(r) { return r.min_quantity_value }, width: 150 },
|
25
|
+
{ show: false, editable: true , bulk_edit: false, name: 'min_quantity_func' , nice_name: 'Min Qty Function' , sort: 'min_quantity_func' , type: 'textarea' , value: function(r) { return r.min_quantity_func }, width: 150 },
|
26
|
+
{ show: true , editable: true , bulk_edit: false, name: 'max_quantity_value' , nice_name: 'Max Qty' , sort: 'max_quantity_value' , type: 'text' , value: function(r) { return r.max_quantity_value }, width: 150 },
|
27
|
+
{ show: false, editable: true , bulk_edit: false, name: 'max_quantity_func' , nice_name: 'Max Qty Function' , sort: 'max_quantity_func' , type: 'textarea' , value: function(r) { return r.max_quantity_func }, width: 150 },
|
28
|
+
{ show: true , editable: false, bulk_edit: false, name: 'current_value' , nice_name: 'Purchased' , sort: 'current_value' , type: 'text' , value: function(r) { return r.current_value }, width: 150 }
|
29
29
|
],
|
30
30
|
new_model_text: 'New Variant Limit',
|
31
31
|
new_model_fields: [
|
32
|
-
{ name: 'variant_id', nice_name: 'Product', type: 'select', width: 400, options_url: '/admin/variant-limits/variant-options' },
|
33
|
-
{ name: 'user_id', nice_name: 'User', type: 'hidden', width: 400, value: <%= @edituser.id %> }
|
32
|
+
{ name: 'variant_id' , nice_name: 'Product', type: 'select', width: 400, options_url: '/admin/variant-limits/variant-options' },
|
33
|
+
{ name: 'user_id' , nice_name: 'User', type: 'hidden', width: 400, value: <%= @edituser.id %> }
|
34
34
|
]
|
35
35
|
});
|
36
36
|
});
|
@@ -22,7 +22,9 @@ v = @variant
|
|
22
22
|
<div id='variant_<%= v.id %>_cost' ></div>
|
23
23
|
<div id='variant_<%= v.id %>_price' ></div>
|
24
24
|
<div id='variant_<%= v.id %>_quantity_in_stock' ></div>
|
25
|
-
<div id='variant_<%= v.id %>_ignore_quantity'
|
25
|
+
<div id='variant_<%= v.id %>_ignore_quantity' ></div>
|
26
|
+
<div id='variant_<%= v.id %>_max_quantity_value' ></div>
|
27
|
+
<div id='variant_<%= v.id %>_min_quantity_value' ></div>
|
26
28
|
|
27
29
|
<h2>Dimensions</h2>
|
28
30
|
<div id='variant_<%= v.id %>_cylinder' ></div>
|
@@ -84,6 +86,8 @@ v = @variant
|
|
84
86
|
<script type='text/javascript'>
|
85
87
|
<%
|
86
88
|
sc = @site.store_config
|
89
|
+
elo = Caboose::User.where(:site_id => @site.id, :username => 'elo').first
|
90
|
+
vl = Caboose::VariantLimit.where(:user_id => elo.id, :variant_id => v.id).first if elo && v
|
87
91
|
%>
|
88
92
|
var vcc = false;
|
89
93
|
$(document).ready(function() {
|
@@ -100,36 +104,38 @@ $(document).ready(function() {
|
|
100
104
|
update_url: '/admin/products/<%= v.product_id %>/variants/<%= v.id %>',
|
101
105
|
authenticity_token: '<%= form_authenticity_token %>',
|
102
106
|
attributes: [
|
103
|
-
<% if p.option1 %>{ name: 'option1' , nice_name: <%= raw Caboose.json(p.option1) %> , type: 'text' , align: 'right' , width:
|
104
|
-
<% if p.option2 %>{ name: 'option2' , nice_name: <%= raw Caboose.json(p.option2) %> , type: 'text' , align: 'right' , width:
|
105
|
-
<% if p.option3 %>{ name: 'option3' , nice_name: <%= raw Caboose.json(p.option3) %> , type: 'text' , align: 'right' , width:
|
106
|
-
{ name: 'alternate_id' , nice_name: 'Alternate ID' , type: 'text' , align: 'right' , width:
|
107
|
-
{ name: 'sku' , nice_name: 'SKU' , type: 'text' , align: 'right' , width:
|
108
|
-
{ name: 'barcode' , nice_name: 'Barcode' , type: 'text' , align: 'right' , width:
|
109
|
-
{ name: 'cost' , nice_name: 'Cost of Goods' , type: 'text' , align: 'right' , width:
|
110
|
-
{ name: 'price' , nice_name: 'Price' , type: 'text' , align: 'right' , width:
|
111
|
-
{ name: 'sale_price' , nice_name: 'Sale price' , type: 'text' , align: 'right' , width:
|
112
|
-
{ name: 'date_sale_starts' , nice_name: 'Sale starts' , type: 'datetime' , align: 'right' , width:
|
113
|
-
{ name: 'date_sale_ends' , nice_name: 'Sale ends' , type: 'datetime' , align: 'right' , width:
|
114
|
-
{ name: 'clearance' , nice_name: 'On Clearance' , type: 'checkbox' , align: 'right' , width:
|
115
|
-
{ name: 'clearance_price' , nice_name: 'Clearance price' , type: 'text' , align: 'right' , width:
|
116
|
-
{ name: 'quantity_in_stock' , nice_name: 'Quantity' , type: 'text' , align: 'right' , width:
|
117
|
-
{ name: 'ignore_quantity' , nice_name: 'Ignore Quantity' , type: 'checkbox' , align: 'right' , width:
|
118
|
-
{ name: '
|
119
|
-
{ name: '
|
120
|
-
{ name: '
|
121
|
-
{ name: '
|
122
|
-
{ name: '
|
123
|
-
{ name: '
|
124
|
-
{ name: '
|
125
|
-
{ name: '
|
126
|
-
{ name: '
|
127
|
-
{ name: '
|
128
|
-
{ name: '
|
129
|
-
{ name: '
|
130
|
-
{ name: '
|
131
|
-
{ name: '
|
132
|
-
{ name: '
|
107
|
+
<% if p.option1 %>{ name: 'option1' , nice_name: <%= raw Caboose.json(p.option1) %> , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.option1 ) %> },<% end %>
|
108
|
+
<% if p.option2 %>{ name: 'option2' , nice_name: <%= raw Caboose.json(p.option2) %> , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.option2 ) %> },<% end %>
|
109
|
+
<% if p.option3 %>{ name: 'option3' , nice_name: <%= raw Caboose.json(p.option3) %> , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.option3 ) %> },<% end %>
|
110
|
+
{ name: 'alternate_id' , nice_name: 'Alternate ID' , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.alternate_id ) %> },
|
111
|
+
{ name: 'sku' , nice_name: 'SKU' , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.sku ) %> },
|
112
|
+
{ name: 'barcode' , nice_name: 'Barcode' , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.barcode ) %> },
|
113
|
+
{ name: 'cost' , nice_name: 'Cost of Goods' , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(sprintf("%.2f", v.cost) ) %> },
|
114
|
+
{ name: 'price' , nice_name: 'Price' , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(sprintf("%.2f", v.price) ) %> },
|
115
|
+
{ name: 'sale_price' , nice_name: 'Sale price' , type: 'text' , align: 'right' , width: 175, value: <%= raw Caboose.json(v.sale_price ) %> },
|
116
|
+
{ name: 'date_sale_starts' , nice_name: 'Sale starts' , type: 'datetime' , align: 'right' , width: 175, value: <%= raw Caboose.json(v.date_sale_starts ? v.date_sale_starts.in_time_zone(@logged_in_user.timezone).strftime('%m/%d/%Y %I:%M %P') : '') %> },
|
117
|
+
{ name: 'date_sale_ends' , nice_name: 'Sale ends' , type: 'datetime' , align: 'right' , width: 175, value: <%= raw Caboose.json(v.date_sale_ends ? v.date_sale_ends.in_time_zone(@logged_in_user.timezone).strftime('%m/%d/%Y %I:%M %P') : '') %> },
|
118
|
+
{ name: 'clearance' , nice_name: 'On Clearance' , type: 'checkbox' , align: 'right' , width: 175, value: <%= raw Caboose.json(v.clearance ) %> },
|
119
|
+
{ name: 'clearance_price' , nice_name: 'Clearance price' , type: 'text' , align: 'right' , width: 175, value: <%= raw Caboose.json(v.clearance_price ) %> },
|
120
|
+
{ name: 'quantity_in_stock' , nice_name: 'Quantity' , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.quantity_in_stock ) %> },
|
121
|
+
{ name: 'ignore_quantity' , nice_name: 'Ignore Quantity' , type: 'checkbox' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.ignore_quantity ) %> },
|
122
|
+
{ name: 'max_quantity_value' , nice_name: 'Max Quantity per User' , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(vl && vl.max_quantity_value ? vl.max_quantity_value : '' ) %>, update_url: '/admin/variant-limits/<%== vl ? vl.id : "new/#{v.id}" %>' },
|
123
|
+
{ name: 'min_quantity_value' , nice_name: 'Min Quantity per User' , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(vl && vl.min_quantity_value ? vl.min_quantity_value : '' ) %>, update_url: '/admin/variant-limits/<%== vl ? vl.id : "new/#{v.id}" %>' },
|
124
|
+
{ name: 'weight' , nice_name: 'Weight (<%= sc.weight_unit %>)' , type: 'text' , align: 'right' , width: 175, value: <%= raw Caboose.json(v.weight ) %> },
|
125
|
+
{ name: 'length' , nice_name: 'Length (<%= sc.length_unit %>)' , type: 'text' , align: 'right' , width: 175, value: <%= raw Caboose.json(v.length ) %> },
|
126
|
+
{ name: 'width' , nice_name: 'Width (<%= sc.length_unit %>)' , type: 'text' , align: 'right' , width: 175, value: <%= raw Caboose.json(v.width ) %> },
|
127
|
+
{ name: 'height' , nice_name: 'Height (<%= sc.length_unit %>)' , type: 'text' , align: 'right' , width: 175, value: <%= raw Caboose.json(v.height ) %> },
|
128
|
+
{ name: 'cylinder' , nice_name: 'Cylinder' , type: 'checkbox' , align: 'right' , width: 175, value: <%= raw Caboose.json(v.cylinder ) %> },
|
129
|
+
{ name: 'requires_shipping' , nice_name: 'Requires shipping' , type: 'checkbox' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.requires_shipping ) %> },
|
130
|
+
{ name: 'taxable' , nice_name: 'Taxable' , type: 'checkbox' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.taxable ) %> },
|
131
|
+
{ name: 'allow_backorder' , nice_name: 'Allow backorder' , type: 'checkbox' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.allow_backorder ) %> },
|
132
|
+
{ name: 'status' , nice_name: 'Status' , type: 'select' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.status ) %>, options_url: '/admin/variants/status-options' },
|
133
|
+
{ name: 'downloadable' , nice_name: 'Downloadable' , type: 'checkbox' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.downloadable ) %> },
|
134
|
+
{ name: 'download_path' , nice_name: 'Download path' , type: 'text' , align: 'right' , width: 800, value: <%= raw Caboose.json(v.download_path ) %> },
|
135
|
+
{ name: 'flat_rate_shipping' , nice_name: 'Use flat rate shipping' , type: 'checkbox' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.flat_rate_shipping ) %> },
|
136
|
+
{ name: 'flat_rate_shipping_single' , nice_name: 'Amount (single)' , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.flat_rate_shipping_single ) %> },
|
137
|
+
{ name: 'flat_rate_shipping_combined' , nice_name: 'Amount (combined)' , type: 'text' , align: 'right' , width: 250, value: <%= raw Caboose.json(v.flat_rate_shipping_combined ) %> },
|
138
|
+
{ name: 'flat_rate_shipping_package_method_id' , nice_name: 'Package method' , type: 'select' , align: 'right' , width: 250, options_url: '/admin/shipping-packages/package-method-options',
|
133
139
|
value: <%= raw Caboose.json("#{v.flat_rate_shipping_package_id}_#{v.flat_rate_shipping_method_id}") %>,
|
134
140
|
text: <%= raw Caboose.json(v.flat_rate_shipping_package && v.flat_rate_shipping_method ? "#{v.flat_rate_shipping_package.name} - #{v.flat_rate_shipping_method.service_name}" : '') %>
|
135
141
|
},
|
data/lib/caboose/version.rb
CHANGED