caboose-cms 0.9.31 → 0.9.32
Sign up to get free protection for your applications and to get access to all the features.
- 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