caboose-store 0.0.39 → 0.0.40

Sign up to get free protection for your applications and to get access to all the features.
Files changed (28) hide show
  1. checksums.yaml +8 -8
  2. data/app/assets/javascripts/caboose_store/modules/cart.js +1 -0
  3. data/app/assets/javascripts/caboose_store/modules/checkout_step1.js +5 -0
  4. data/app/assets/javascripts/caboose_store/modules/checkout_step2.js +1 -1
  5. data/app/assets/javascripts/caboose_store/modules/checkout_step4.js +6 -1
  6. data/app/assets/javascripts/caboose_store/modules/product.js +2 -11
  7. data/app/assets/templates/caboose_store/cart/line_items.jst.ejs +2 -2
  8. data/app/assets/templates/caboose_store/product/options.jst.ejs +1 -1
  9. data/app/controllers/caboose_store/cart_controller.rb +1 -0
  10. data/app/controllers/caboose_store/checkout_controller.rb +18 -15
  11. data/app/controllers/caboose_store/products_controller.rb +45 -0
  12. data/app/helpers/caboose_store/checkout_helper.rb +2 -2
  13. data/app/mailers/caboose_store/orders_mailer.rb +4 -3
  14. data/app/models/caboose_store/payment_processors/authorizenet.rb +34 -2
  15. data/app/models/caboose_store/payment_processors/payscape.rb +1 -0
  16. data/app/models/caboose_store/states.rb +2 -2
  17. data/app/models/caboose_store/variant.rb +1 -0
  18. data/app/views/caboose_store/checkout/relay.html.erb +17 -6
  19. data/app/views/caboose_store/checkout/step_four.html.erb +11 -9
  20. data/app/views/caboose_store/checkout/step_one.html.erb +8 -2
  21. data/app/views/caboose_store/checkout/step_two.html.erb +4 -3
  22. data/app/views/caboose_store/orders/admin_edit.html.erb +17 -15
  23. data/app/views/caboose_store/products/admin_edit_variants.html.erb +33 -7
  24. data/config/routes.rb +2 -1
  25. data/lib/caboose-store.rb +2 -1
  26. data/lib/caboose-store/engine.rb +2 -1
  27. data/lib/caboose-store/version.rb +1 -1
  28. metadata +2 -2
checksums.yaml CHANGED
@@ -1,15 +1,15 @@
1
1
  ---
2
2
  !binary "U0hBMQ==":
3
3
  metadata.gz: !binary |-
4
- M2EzZjNiODZmYjdlNTdiYmVmY2RmNWI5M2I3MzZhMmMyOWQxODdmMg==
4
+ ZTE4MTFjMWIzNDc0ODU2NjNlMjY0MTVhYjE5ZWU3ZjllZTU0OTZjNA==
5
5
  data.tar.gz: !binary |-
6
- MGY2NWM1NGI0NWFiZGMwYjM1NmM2YTVjNzI5MTU1NGJiNmVhYjhkNQ==
6
+ OTg0ZmNlM2ZjYmI4Mjk3YjVhZjEyNDdmYjk0MjI3MjNkNGM1MDhhOQ==
7
7
  !binary "U0hBNTEy":
8
8
  metadata.gz: !binary |-
9
- YTczMTJlODdiZWJhNjMzNmJjNzEyMTY2Y2VkMmM3NzkyN2VhMDE3OWM0ZWJm
10
- YjE0ZGMzNTM4MzlmYjFiODk1ZGM5ZDJkMDNlZjBiM2FhZTg4MDBhMTJjYTVi
11
- YTI5ZmM4ZGYwYWE1ZTdlYzBjMmFmZGM0NzMyZDk0ODMxYjE4MTc=
9
+ MjYyZTQ3MTNiZjE5MzMzNWNlZmZjYTg4MTQ2MGY5MzlmMzZiOTdkMmY2MTFl
10
+ YzZjZTY0ZmZkZThmMTkzYzBkOTM4MGE1YWFmYzQxMTAwMzZjNGNmZDU4Yjgz
11
+ ODFlYTI3YWU4MjNkZTMxMmRlZmEyYjY3MDJlNmVmNWU1NWFiZTU=
12
12
  data.tar.gz: !binary |-
13
- ZWMxMzUxYWVjOWY2MTVmNTg4MTg0MDhlY2I4MjQzMTNmYjY4MTA2MWRkZTNl
14
- NzQ2MThlYmU1YjU5OThhZDhkZDI1MDNkYzJlOGRkMmRlYWEzYzY3NjdkOTQ2
15
- YWM2Yjc4OTc2MDUxYzI0OGU3MmJiZDc0YjE1ZGNmYzE0MDQwMzA=
13
+ NWM3ZjdjYTczYThiMDIyYzgyNzJlN2VlZDUxOTIwOWQ1NWM0N2IyYWFkMjM2
14
+ YTVlOTk1YWU0MzcxMTdiYThhNzViNGFmMTU2OGQ1MGU2NzY2NDQxMDMwMDQx
15
+ ZWI5ODA4MGU4NTFiOWJiM2Q3NDA0YTY2NGIwYzc3ZGJiNTllNDc=
@@ -105,6 +105,7 @@ Caboose.Store.Modules.Cart = (function() {
105
105
  if (!self.$addToCart.find('.message').length) {
106
106
  self.$addToCart.append($('<p/>').hide().addClass('message').text('Successfully added to cart'));
107
107
  self.$addToCart.find('.message').fadeIn();
108
+ Caboose.Store.Modules.Product.$product.trigger('added-to-cart');
108
109
 
109
110
  setTimeout(function() {
110
111
  self.$addToCart.find('.message').fadeOut(function() { $(this).remove() });
@@ -61,6 +61,11 @@ Caboose.Store.Modules.CheckoutStep1 = (function() {
61
61
  }
62
62
  $('#' + form + '_button').addClass('selected');
63
63
  $('#message').empty();
64
+
65
+ $('html, body').animate({
66
+ scrollTop: $('#checkout-login').offset().top
67
+ }, 600);
68
+
64
69
  self.current_form = form;
65
70
  };
66
71
 
@@ -29,7 +29,7 @@ Caboose.Store.Modules.CheckoutStep2 = (function() {
29
29
  if (resp.errors && resp.errors.length > 0)
30
30
  $('#message').html("<p class='note error'>" + resp.errors[0] + "</p>");
31
31
  else if (resp.success)
32
- window.location = '/checkout/step-three';
32
+ window.location = '/checkout/step-three';
33
33
  }
34
34
  });
35
35
  return false;
@@ -9,13 +9,17 @@ Caboose.Store.Modules.CheckoutStep4 = (function() {
9
9
  $('#checkout-confirm').hide();
10
10
  $('#relay').hide();
11
11
  self.bind_event_handlers();
12
+ self.expiration_change_handler();
12
13
  };
13
14
 
14
15
  self.bind_event_handlers = function() {
15
16
  $('#checkout-payment form#payment select').change(self.expiration_change_handler);
16
17
  $('#checkout-continue button').click(self.continue_handler);
17
18
  $('#checkout-confirm #edit_payment').click(self.edit_payment_handler);
18
- //$('#relay').on('load', self.relay_handler);
19
+
20
+ $(window).on('message', function(event) {
21
+ relay_handler(event.originalEvent.data);
22
+ });
19
23
  };
20
24
 
21
25
  self.expiration_change_handler = function(event) {
@@ -83,6 +87,7 @@ Caboose.Store.Modules.CheckoutStep4 = (function() {
83
87
 
84
88
  function relay_handler(resp)
85
89
  {
90
+ console.log('RELAY');
86
91
  if (resp.success == true)
87
92
  window.location = '/checkout/thanks';
88
93
  else if (resp.message)
@@ -176,15 +176,6 @@ Caboose.Store.Modules.Product = (function() {
176
176
  };
177
177
 
178
178
  self.getOptionsWithAllValues = function() {
179
- //return _.map(self.getOptionsFromProduct(), function(optionName) {
180
- // return {
181
- // name: optionName,
182
- // values: _.uniq(_.map(self.product.variants, function(variant) {
183
- // return variant[self.getOptionAttribute(optionName)];
184
- // }))
185
- // };
186
- //});
187
-
188
179
  var options = [];
189
180
  if (self.product.option1) options.push({ name: self.product.option1, values: self.option1_values });
190
181
  if (self.product.option2) options.push({ name: self.product.option2, values: self.option2_values });
@@ -277,8 +268,8 @@ Caboose.Store.Modules.Product = (function() {
277
268
  //
278
269
 
279
270
  self.setImageFromVariant = function(variant) {
280
- if (!variant || !variant.images || variant.images.length == 0 || !variant.images[0])
281
- return;
271
+ if (!variant || !variant.images || variant.images.length == 0 || !variant.images[0]) return;
272
+ self.$product.trigger('variant:updated');
282
273
 
283
274
  var $figure = self.$images.children('figure');
284
275
  if (variant.images && variant.images.length > 0 && variant.images[0]) {
@@ -26,14 +26,14 @@
26
26
  </section>
27
27
 
28
28
  <section>
29
- <p class="price">$<%= lineItem.price %></p>
29
+ <p class="price">$<%= parseFloat(Math.round(lineItem.price * 100) / 100).toFixed(2) %></p>
30
30
  </section>
31
31
  </li>
32
32
  <% }); %>
33
33
 
34
34
  <li>
35
35
  <footer>
36
- <a href="/checkout" class="btn blue">Proceed to Checkout</a>
36
+ <a href="/checkout" class="btn blue">Checkout</a>
37
37
  <h4>Subtotal: <span class="subtotal">$<%= parseFloat(Math.round(order.subtotal * 100) / 100).toFixed(2) %></span></h4>
38
38
  </footer>
39
39
  </li>
@@ -11,7 +11,7 @@
11
11
  <% _.each(options, function(option, index) { %>
12
12
  <h3><%= option.name %></h3>
13
13
  <ul id="<%= 'option' + (index + 1) %>" data-name="<%= option.name %>">
14
- <% _.each(option.values, function(value) { %>
14
+ <% _.each(_.sortBy(option.values, function(option) { return parseFloat(option) }), function(value) { %>
15
15
  <li data-value="<%= value %>"><%= value %></li>
16
16
  <% }); %>
17
17
  </ul>
@@ -8,6 +8,7 @@ module CabooseStore
8
8
 
9
9
  # GET /cart
10
10
  def index
11
+
11
12
  end
12
13
 
13
14
  # GET /cart/items
@@ -2,6 +2,7 @@ module CabooseStore
2
2
  class CheckoutController < CabooseStore::ApplicationController
3
3
  helper :authorize_net
4
4
  before_filter :ensure_line_items, :only => [:step_one, :step_two]
5
+ protect_from_forgery :except => :relay
5
6
 
6
7
  def ensure_line_items
7
8
  redirect_to '/checkout/empty' if @order.line_items.empty?
@@ -31,15 +32,15 @@ module CabooseStore
31
32
  end
32
33
 
33
34
  # GET /checkout/step-three
34
- def step_three
35
+ def step_three
35
36
  redirect_to '/checkout/step-one' and return if !logged_in?
36
37
  redirect_to '/checkout/step-two' and return if @order.shipping_address.nil? || @order.billing_address.nil?
37
- @rates = ShippingCalculator.rates(@order)
38
+ @rates = ShippingCalculator.rates(@order)
38
39
  @selected_rate = ShippingCalculator.rate(@order)
39
40
  end
40
41
 
41
42
  # GET /checkout/step-four
42
- def step_four
43
+ def step_four
43
44
  redirect_to '/checkout/step-one' and return if !logged_in?
44
45
  redirect_to '/checkout/step-two' and return if @order.shipping_address.nil? || @order.billing_address.nil?
45
46
  redirect_to '/checkout/step-three' and return if @order.shipping_method_code.nil?
@@ -199,20 +200,22 @@ module CabooseStore
199
200
 
200
201
  # POST /checkout/relay/:order_id
201
202
  def relay
203
+ ap '--HOOK RELAY'
202
204
  @order = CabooseStore::Order.find(params[:order_id])
205
+ @success = CabooseStore::PaymentProcessor.authorize(@order, params)
206
+ @message = @success ? 'Payment processed successfully' : 'There was a problem processing your payment'
207
+
208
+ #case CabooseStore::payment_processor
209
+ # when 'authorize.net'
210
+ # @success = params[:x_response_code] == '1'
211
+ # @message = jarams[:x_response_reason_text]
212
+ # @order.transaction_id = params[:x_trans_id] if params[:x_trans_id]
213
+ # when 'payscape'
214
+ # @success = CabooseStore::PaymentProcessor.authorize(@order, params)
215
+ # @message = @success ? 'Payment processed successfully' : 'There was a problem processing your payment'
216
+ # @order.transaction_id = params['transaction-id'] if params['transaction-id']
217
+ #end
203
218
 
204
- case CabooseStore::payment_processor
205
- when 'authorize.net'
206
- @success = params[:x_response_code] == '1'
207
- @message = params[:x_response_reason_text]
208
- @order.transaction_id = params[:x_trans_id] if params[:x_trans_id]
209
- when 'payscape'
210
- @success = CabooseStore::PaymentProcessor.authorize(@order, params)
211
- @message = @success ? 'Payment processed successfully' : 'There was a problem processing your payment'
212
- @order.transaction_id = params['transaction-id'] if params['transaction-id']
213
- end
214
- ap @success
215
- ap '---------'
216
219
  if @success
217
220
  @order.financial_status = 'authorized'
218
221
  @order.status = 'pending'
@@ -185,6 +185,51 @@ module CabooseStore
185
185
  redirect_to "/admin/products/#{params[:id]}/variants"
186
186
  end
187
187
 
188
+ # POST /admin/products/:id/varaints/add-multiple
189
+ def admin_add_multiple_variants
190
+ product = Product.find(params[:id])
191
+
192
+ params[:variants_csv].split("\r\n").each do |variant|
193
+ row = variant.split(',')
194
+
195
+ render :json => { :success => false, :error => "Quantity is not defined for variant: #{row[0].strip}" } and return if row[1].nil?
196
+ render :json => { :success => false, :error => "Price is not defined for variant: #{row[0].strip}" } and return if row[2].nil?
197
+
198
+ attributes = {
199
+ :alternate_id => row[0].strip,
200
+ :quantity_in_stock => row[1].strip.to_i,
201
+ :price => '%.2f' % row[2].strip.to_f,
202
+ :status => 'Active'
203
+ }
204
+
205
+ if product.option1 && row[3].nil?
206
+ render :json => { :success => false, :error => "#{product.option1} not defined for variant: #{attributes[:alternate_id]}" } and return
207
+ elsif product.option1
208
+ attributes[:option1] = row[3].strip
209
+ end
210
+
211
+ if product.option2 && row[4].nil?
212
+ render :json => { :success => false, :error => "#{product.option2} not defined for variant: #{attributes[:alternate_id]}" } and return
213
+ elsif product.option2
214
+ attributes[:option2] = row[4].strip
215
+ end
216
+
217
+ if product.option3 && row[5].nil?
218
+ render :json => { :success => false, :error => "#{product.option3} not defined for variant: #{attributes[:alternate_id]}" } and return
219
+ elsif product.option3
220
+ attributes[:option3] = row[5].strip
221
+ end
222
+
223
+ if product.variants.find_by_alternate_id(attributes[:alternate_id])
224
+ product.variants.find_by_alternate_id(attributes[:alternate_id]).update_attributes(attributes)
225
+ else
226
+ Variant.create(attributes.merge(:product_id => product.id))
227
+ end
228
+ end
229
+
230
+ render :json => { :success => true }
231
+ end
232
+
188
233
  # POST /admin//products/:id/variants/remove
189
234
  def admin_remove_variants
190
235
  params[:variant_ids].each do |variant_id|
@@ -30,7 +30,7 @@ module CabooseStore
30
30
 
31
31
  def checkout_nav(i)
32
32
  str = ""
33
- str << "<div id='nav'>"
33
+ str << "<div id='checkout-nav'>"
34
34
  str << " <ul>"
35
35
  str << " <li class='odd' id='checkout_nav1'><a href='#{i <= 1 ? '#' : '/checkout/step-one' }' class='#{i == 1 ? 'current' : (i < 1 ? 'not_done' : 'done')}'><span>User Account </span></a></li>"
36
36
  str << " <li class='even' id='checkout_nav2'><a href='#{i <= 2 ? '#' : '/checkout/step-two' }' class='#{i == 2 ? 'current' : (i < 2 ? 'not_done' : 'done')}'><span>Addresses </span></a></li>"
@@ -41,6 +41,6 @@ module CabooseStore
41
41
  str << "</div>"
42
42
  return str
43
43
  end
44
-
45
44
  end
46
45
  end
46
+
@@ -1,11 +1,11 @@
1
1
  module CabooseStore
2
2
  class OrdersMailer < ActionMailer::Base
3
- default :from => 'woodsnwater.actionmailer@gmail.com'
3
+ default :from => CabooseStore::from_address.nil? ? 'caboose-store.actionmailer@gmail.com' : CabooseStore::from_address
4
4
 
5
5
  # Sends a confirmation email to the customer about a new order
6
6
  def customer_new_order(order)
7
7
  @order = order
8
- mail(:to => order.customer ? order.customer.email : order.email, :subject => 'Thank you for your order!')
8
+ mail(:to => order.customer.email, :subject => 'Thank you for your order!')
9
9
  end
10
10
 
11
11
  # Sends a notification email to the fulfillment dept about a new order
@@ -23,7 +23,8 @@ module CabooseStore
23
23
  # Sends a notification email to the customer that the status of the order has been changed
24
24
  def customer_status_updated(order)
25
25
  @order = order
26
- mail(:to => order.customer ? order.customer.email : order.email, :subject => 'Order status update')
26
+ mail(:to => order.customer.email, :subject => 'Order status update')
27
27
  end
28
28
  end
29
29
  end
30
+
@@ -2,20 +2,52 @@ class CabooseStore::PaymentProcessors::Authorizenet < CabooseStore::PaymentProce
2
2
  def self.api(root, body, test=false)
3
3
  end
4
4
 
5
- def self.form_url(order)
6
- #'https://secure.authorize.net/gateway/transact.dll'
5
+ def self.form_url(order=nil)
6
+ #if Rails.env == 'development'
7
7
  'https://test.authorize.net/gateway/transact.dll'
8
+ #else
9
+ # 'https://secure.authorize.net/gateway/transact.dll'
10
+ #end
8
11
  end
9
12
 
10
13
  def self.authorize(order, params)
14
+ order.update_attribute(:transaction_id, params[:x_trans_id]) if params[:x_trans_id]
15
+ return params[:x_response_code] == '1'
11
16
  end
12
17
 
13
18
  def self.void(order)
19
+ response = AuthorizeNet::SIM::Transaction.new(
20
+ CabooseStore::authorize_net_login_id,
21
+ CabooseStore::authorize_net_transaction_key,
22
+ order.total,
23
+ :transaction_type => 'VOID',
24
+ :transaction_id => order.transaction_id
25
+ )
26
+
27
+ ap response
14
28
  end
15
29
 
16
30
  def self.capture(order)
31
+ response = AuthorizeNet::SIM::Transaction.new(
32
+ CabooseStore::authorize_net_login_id,
33
+ CabooseStore::authorize_net_transaction_key,
34
+ order.total,
35
+ :transaction_type => 'CAPTURE_ONLY',
36
+ :transaction_id => order.transaction_id
37
+ )
38
+
39
+ ap response
17
40
  end
18
41
 
19
42
  def self.refund(order)
43
+ response = AuthorizeNet::SIM::Transaction.new(
44
+ CabooseStore::authorize_net_login_id,
45
+ CabooseStore::authorize_net_transaction_key,
46
+ order.total,
47
+ :transaction_type => 'CREDIT',
48
+ :transaction_id => order.transaction_id
49
+ )
50
+
51
+ ap response
20
52
  end
21
53
  end
@@ -69,6 +69,7 @@ class CabooseStore::PaymentProcessors::Payscape < CabooseStore::PaymentProcessor
69
69
 
70
70
  def self.authorize(order, params)
71
71
  response = self.api 'complete-action', { 'token-id' => params['token-id'] }, order.test?
72
+ order.update_attribute(:transaction_id, params['transaction-id']) if params['transaction-id']
72
73
  return response['result-code'].to_i == 100
73
74
  end
74
75
 
@@ -1,6 +1,6 @@
1
- class States
1
+ class CabooseStore::States
2
2
  def self.all
3
- {
3
+ {
4
4
  "AL" => "Alabama",
5
5
  "AK" => "Alaska",
6
6
  "AS" => "American Samoa",
@@ -19,6 +19,7 @@ module CabooseStore
19
19
  :price, # Variant’s price.
20
20
  :ignore_quantity,
21
21
  :quantity,
22
+ :quantity_in_stock,
22
23
  :allow_backorder, # Whether to allow items with no inventory to be added to the cart
23
24
  :status, # Current status: active, inactive, deleted
24
25
  :weight, # The weight of the variant. This will always be in metric grams.
@@ -1,12 +1,23 @@
1
1
  <!DOCTYPE>
2
2
  <html>
3
3
  <body>
4
- <script type="text/javascript">
5
- parent.relay_handler({
6
- "success": <%= @success %>,
7
- "message": "<%= @message %>"
8
- });
9
- </script>
4
+ <% if CabooseStore::payment_processor == 'payscape' %>
5
+ <script type="text/javascript">
6
+ parent.relay_handler({
7
+ "success": <%= @success %>,
8
+ "message": "<%= @message %>"
9
+ });
10
+ </script>
11
+ <% end %>
12
+
13
+ <% if CabooseStore::payment_processor == 'authorize.net' %>
14
+ <script>
15
+ parent.postMessage({
16
+ "success": <%= @success %>,
17
+ "message": "<%= @message %>"
18
+ }, "<%= CabooseStore::root_url %>");
19
+ </script>
20
+ <% end %>
10
21
  </body>
11
22
  </html>
12
23
 
@@ -1,4 +1,3 @@
1
-
2
1
  <div id="checkout">
3
2
  <h2>Checkout</h2>
4
3
  <%= raw checkout_nav(4) %>
@@ -8,11 +7,16 @@
8
7
  <% if CabooseStore::payment_processor == 'authorize.net' %>
9
8
  <form id="payment" target="relay" action="<%= CabooseStore::PaymentProcessor.form_url(@order) %>" method="post">
10
9
  <%= sim_fields(@sim_transaction) %>
10
+
11
11
  <label>Card Number</label>
12
- <input name="x_card_num" type="text" />
13
- <label>Expiration</label>
14
- <input id="expiration" name="x_exp_date" type="hidden" />
12
+ <input name="x_card_num" type="text" maxlength="16" />
13
+ <!--<br />
14
+ <label>Security Code</label><br />
15
+ <input id="x_card_code" name="x_card_code" type="text" />-->
15
16
  <br />
17
+
18
+ <label>Expiration</label>
19
+ <input id="expiration" name="x_exp_date" type="hidden" />
16
20
  <select id="month" name="month">
17
21
  <option value="01">01 - Jan</option>
18
22
  <option value="02">02 - Feb</option>
@@ -32,10 +36,8 @@
32
36
  <% (DateTime.now.year...DateTime.now.year + 20).each do |i| %>
33
37
  <option value="<%= i-2000 %>"><%= i %></option>
34
38
  <% end %>
35
- </select>
36
- <br />
37
- <label>Security Code</label>
38
- <input id="x_card_code" name="x_card_code" type="text" />
39
+ </select><br />
40
+ <br />
39
41
  <input type="submit" value="Submit" />
40
42
  </form>
41
43
  <% end %>
@@ -88,4 +90,4 @@
88
90
 
89
91
  <%= content_for :caboose_js do %>
90
92
  <%= javascript_include_tag 'caboose_store/modules/checkout_step4' %>
91
- <% end %>
93
+ <% end %>
@@ -10,6 +10,7 @@
10
10
  <li><p>No thanks </p><button data-login-action="guest" id='guest_button' >Continue As Guest</button></li>
11
11
  </ul>
12
12
  </div>
13
+
13
14
  <section id='checkout-login-form'>
14
15
  <div class="wrapper" id='signin_form_container'>
15
16
  <form action="/login" method="post" id='signin_form'>
@@ -18,6 +19,7 @@
18
19
  <input type="submit" value="Submit" />
19
20
  </form>
20
21
  </div>
22
+
21
23
  <div class="wrapper" id='register_form_container'>
22
24
  <form action="/register" method="post" id='register_form'>
23
25
  <input name="first_name" type="text" placeholder="First Name" />
@@ -29,6 +31,7 @@
29
31
  <input type="submit" value="Submit" />
30
32
  </form>
31
33
  </div>
34
+
32
35
  <div class="wrapper" id='guest_form_container'>
33
36
  <form action="/checkout/attach-guest" method="post" id='guest_form'>
34
37
  <input name="email" type="text" placeholder="Email" />
@@ -36,7 +39,10 @@
36
39
  <input type="submit" value="Submit" />
37
40
  </form>
38
41
  </div>
39
- <div id='message'></div>
42
+
43
+ <div class="wrapper">
44
+ <div id='message'></div>
45
+ </div>
40
46
  </section>
41
47
  </section>
42
48
 
@@ -47,4 +53,4 @@
47
53
 
48
54
  <%= content_for :caboose_js do %>
49
55
  <%= javascript_include_tag 'caboose_store/modules/checkout_step1' %>
50
- <% end %>
56
+ <% end %>
@@ -17,7 +17,7 @@ ba = @order.billing_address
17
17
  <label><span>Address 1 </span> <input name="shipping[address1]" type="text" value="<%= sa ? sa.address1 : "" %>" /></label>
18
18
  <label><span>Address 2 </span> <input name="shipping[address2]" type="text" value="<%= sa ? sa.address2 : "" %>" /></label>
19
19
  <label><span>City </span> <input name="shipping[city]" type="text" value="<%= sa ? sa.city : "" %>" /></label>
20
- <label><span>State </span> <select name="shipping[state]"><% States.all.each do |abbr, state| %><option value="<%= abbr %>" <%= sa && sa.state == abbr ? 'selected' : "" %>><%= state %></option><% end %></select></label>
20
+ <label><span>State </span> <select name="shipping[state]"><% CabooseStore::States.all.each do |abbr, state| %><option value="<%= abbr %>" <%= sa && sa.state == abbr ? 'selected' : "" %>><%= state %></option><% end %></select></label>
21
21
  <label><span>Zip </span> <input name="shipping[zip]" type="text" value="<%= sa ? sa.zip : "" %>" /></label>
22
22
  <label><input name="use_as_billing" type="checkbox" value="false" /> Use as billing address</label>
23
23
  </fieldset>
@@ -31,7 +31,7 @@ ba = @order.billing_address
31
31
  <label><span>Address 1 </span> <input name="billing[address1]" type="text" value="<%= ba ? ba.address1 : "" %>" /></label>
32
32
  <label><span>Address 2 </span> <input name="billing[address2]" type="text" value="<%= ba ? ba.address2 : "" %>" /></label>
33
33
  <label><span>City </span> <input name="billing[city]" type="text" value="<%= ba ? ba.city : "" %>" /></label>
34
- <label><span>State </span> <select name="billing[state]"><% States.all.each do |abbr, state| %><option value="<%= abbr %>" <%= ba && ba.state == abbr ? 'selected' : "" %>><%= state %></option><% end %></select></label>
34
+ <label><span>State </span> <select name="billing[state]"><% CabooseStore::States.all.each do |abbr, state| %><option value="<%= abbr %>" <%= ba && ba.state == abbr ? 'selected' : "" %>><%= state %></option><% end %></select></label>
35
35
  <label><span>Zip </span> <input name="billing[zip]" type="text" value="<%= ba ? ba.zip : "" %>" /></label>
36
36
  </fieldset>
37
37
  </section>
@@ -48,4 +48,5 @@ ba = @order.billing_address
48
48
 
49
49
  <%= content_for :caboose_js do %>
50
50
  <%= javascript_include_tag 'caboose_store/modules/checkout_step2' %>
51
- <% end %>
51
+ <% end %>
52
+
@@ -11,17 +11,19 @@ captured = @order.financial_status == 'captured'
11
11
 
12
12
  <table class='data'>
13
13
  <tr>
14
- <th>Customer</th>
14
+ <th><%= if @order.customer.nil? then 'Guest' else 'Customer' end %></th>
15
15
  <th>Shipping Address</th>
16
16
  <th>Order Status</th>
17
17
  <th>Payment Status</th>
18
- <th>Transaction ID</th>
18
+ <th>Transaction ID</th>
19
19
  </tr>
20
20
  <tr>
21
21
  <td valign='top'>
22
22
  <%= "#{@order.shipping_address.first_name} #{@order.shipping_address.last_name}" %><br />
23
23
  <% if @order.customer %>
24
- <a href='mailto:<%= "#{@order.customer.email}" %>'><%= "#{@order.customer.email}" %></a><br />
24
+ <a href="mailto:<%= "#{@order.customer.email}" %>"><%= "#{@order.customer.email}" %></a><br />
25
+ <% elsif @order.email %>
26
+ <a href="mailto:<%= @order.email %>"><%= @order.email %></a>
25
27
  <% end %>
26
28
  <%= @order.customer ? @order.customer.phone : @order.shipping_address.phone %>
27
29
  </td>
@@ -38,7 +40,7 @@ captured = @order.financial_status == 'captured'
38
40
  for <%= number_to_currency(@order.auth_amount) %>
39
41
  <% end %>
40
42
  </td>
41
- <td valign="top"><%= @order.transaction_id %></td>
43
+ <td valign="top"><%= @order.transaction_id %></td>
42
44
  </tr>
43
45
  </table><br />
44
46
 
@@ -93,11 +95,11 @@ captured = @order.financial_status == 'captured'
93
95
 
94
96
  <% if @order.financial_status == 'authorized' %>
95
97
  <input type='button' value='Capture Funds' onclick="capture_funds(<%= @order.id %>);" />
96
- <input type='button' value='Void' onclick="void_order(<%= @order.id %>);" />
98
+ <input type='button' value='Void' onclick="void_order(<%= @order.id %>);" />
97
99
  <% end %>
98
100
 
99
101
  <% if @order.financial_status == 'captured' %>
100
- <input type='button' value='Refund' onclick="refund_order(<%= @order.id %>);" />
102
+ <input type='button' value='Refund' onclick="refund_order(<%= @order.id %>);" />
101
103
  <% end %>
102
104
 
103
105
  <input type='button' value='Resend Confirmation' onclick="resend_confirmation(<%= @order.id %>)" />
@@ -110,15 +112,15 @@ captured = @order.financial_status == 'captured'
110
112
 
111
113
  function resend_confirmation(order_id)
112
114
  {
113
- modal.autosize("<p class='loading'>Resending confirmation..</p>");
114
- $.ajax({
115
- type: 'post',
116
- url: '/admin/orders/' + order_id + '/resend-confirmation',
117
- success: function(resp) {
118
- if (resp.error) modal.autosize("<p class='note error'>" + resp.error + "</p>");
119
- if (resp.success) modal.autosize("<p class='note success'>" + resp.success + "</p>");
120
- }
121
- });
115
+ modal.autosize("<p class='loading'>Resending confirmation..</p>");
116
+ $.ajax({
117
+ type: 'post',
118
+ url: '/admin/orders/' + order_id + '/resend-confirmation',
119
+ success: function(resp) {
120
+ if (resp.error) modal.autosize("<p class='note error'>" + resp.error + "</p>");
121
+ if (resp.success) modal.autosize("<p class='note success'>" + resp.success + "</p>");
122
+ }
123
+ });
122
124
  }
123
125
 
124
126
  function capture_funds(order_id, confirm)
@@ -1,11 +1,11 @@
1
1
  <% content_for :caboose_css do %>
2
- <style>
3
- ul {
4
- list-style-type: square;
5
- padding: 0 0 0 24px;
6
- margin: 12px 0 24px;
7
- }
8
- </style>
2
+ <style>
3
+ ul {
4
+ list-style-type: square;
5
+ padding: 0 0 0 24px;
6
+ margin: 12px 0 24px;
7
+ }
8
+ </style>
9
9
  <% end %>
10
10
 
11
11
  <%
@@ -82,6 +82,13 @@ end
82
82
 
83
83
  <p><input type='button' value='New Variant' onclick="add_variant(<%= p.id %>);" /></p>
84
84
 
85
+ <form id="add-multiple" action="/admin/products/<%= @product.id %>/variants/add-multiple" method="post">
86
+ <p style="margin: 0 0 12px"><small>CSV format: Alternate ID, Quantity, Price<%= ', ' if @product.option1 || @product.option2 || @product.option3 %><%= [@product.option1, @product.option2, @product.option3].compact.join(', ') %></small></p>
87
+ <textarea id="variants_csv" name="variants_csv" rows="8" cols="12" style="min-width: 500px; min-height: 250px; margin: 0 0 16px; padding: 12px"></textarea><br />
88
+ <input type="submit" value="Submit" />
89
+ <p class="message" style="margin: 12px 0 0; color: red"></p>
90
+ </form>
91
+
85
92
  <%= render :partial => 'caboose_store/products/admin_footer' %>
86
93
 
87
94
  <% content_for :caboose_css do %>
@@ -95,6 +102,25 @@ td.sort_handle { background: #ccc; width: 20px; }
95
102
  <script type='text/javascript'>
96
103
 
97
104
  $(document).ready(function() {
105
+ $('form#add-multiple').on('submit', function(event) {
106
+ event.preventDefault();
107
+ var $form = $(event.target);
108
+
109
+ $.ajax({
110
+ type: $form.attr('method'),
111
+ url: $form.attr('action'),
112
+ data: $form.serialize(),
113
+ success: function(response) {
114
+ console.log(response);
115
+ if (response.success) {
116
+ location.reload();
117
+ } else {
118
+ $form.find('.message').empty().text(response.error);
119
+ }
120
+ }
121
+ });
122
+ });
123
+
98
124
  <% p.variants.each do |v| %>
99
125
  new ModelBinder({
100
126
  name: 'Variant',
@@ -27,7 +27,7 @@ CabooseStore::Engine.routes.draw do
27
27
  #get '/checkout/payment' => 'checkout#payment'
28
28
  get '/checkout/relay/:order_id' => 'checkout#relay'
29
29
  post '/checkout/relay/:order_id' => 'checkout#relay'
30
- #get '/checkout/empty' => 'checkout#empty'
30
+ get '/checkout/empty' => 'checkout#empty'
31
31
 
32
32
  # Products
33
33
 
@@ -44,6 +44,7 @@ CabooseStore::Engine.routes.draw do
44
44
  get '/admin/products/:id/variants/group' => 'products#admin_group_variants'
45
45
  post '/admin/products/:id/variants/add' => 'products#admin_add_variants'
46
46
  post '/admin/products/:id/variants/remove' => 'products#admin_remove_variants'
47
+ post '/admin/products/:id/variants/add-multiple' => 'products#admin_add_multiple_variants'
47
48
 
48
49
  get '/admin/products/add-upcs' => 'products#admin_add_upcs'
49
50
 
@@ -15,6 +15,7 @@ module CabooseStore
15
15
  :authorize_net_transaction_key,
16
16
  :handling_percentage,
17
17
  :allowed_shipping_method_codes,
18
- :default_shipping_method_code
18
+ :default_shipping_method_code,
19
+ :from_address
19
20
  end
20
21
 
@@ -87,7 +87,8 @@ module CabooseStore::BootStrapper
87
87
  end
88
88
 
89
89
  # Log the order and set an instance variable up
90
- ap @order = CabooseStore::Order.find(session[:cart_id])
90
+ @order = CabooseStore::Order.find(session[:cart_id])
91
91
  session[:new_cart_items] ||= Array.new
92
92
  end
93
93
  end
94
+
@@ -1,3 +1,3 @@
1
1
  module CabooseStore
2
- VERSION = '0.0.39'
2
+ VERSION = '0.0.40'
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: caboose-store
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.39
4
+ version: 0.0.40
5
5
  platform: ruby
6
6
  authors:
7
7
  - William Barry
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-09-24 00:00:00.000000000 Z
11
+ date: 2014-10-08 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: caboose-cms