caboose-store 0.0.10 → 0.0.11

Sign up to get free protection for your applications and to get access to all the features.
Files changed (143) hide show
  1. checksums.yaml +8 -8
  2. data/app/assets/javascripts/caboose/main.js +8 -0
  3. data/app/assets/javascripts/caboose_store/admin.js +0 -19
  4. data/app/assets/javascripts/caboose_store/admin_products.js +3 -4
  5. data/app/assets/javascripts/caboose_store/application.js +6 -5
  6. data/app/assets/javascripts/caboose_store/cart.js.bak +258 -0
  7. data/app/assets/javascripts/caboose_store/checkout.js +151 -0
  8. data/app/assets/javascripts/caboose_store/config.js +83 -0
  9. data/app/assets/javascripts/caboose_store/jquery-ui-multisortable.js +254 -0
  10. data/app/assets/javascripts/caboose_store/jquery-ui.js +3572 -0
  11. data/app/assets/javascripts/caboose_store/main.js +20 -0
  12. data/app/assets/javascripts/caboose_store/modules/cart.js +167 -0
  13. data/app/assets/javascripts/caboose_store/modules/checkout.js +313 -0
  14. data/app/assets/javascripts/caboose_store/modules/product.js +282 -0
  15. data/app/assets/stylesheets/caboose_store/admin.css +3 -3
  16. data/app/assets/stylesheets/caboose_store/application.css +2 -2
  17. data/app/assets/stylesheets/caboose_store/modal.css +1 -0
  18. data/app/assets/templates/caboose_store/cart/add_to_cart.jst.ejs +7 -0
  19. data/app/assets/templates/caboose_store/cart/line_items.jst.ejs +41 -0
  20. data/app/assets/templates/caboose_store/checkout/address.jst.ejs +53 -0
  21. data/app/assets/templates/caboose_store/checkout/forms/guest.jst.ejs +8 -0
  22. data/app/assets/templates/caboose_store/checkout/forms/register.jst.ejs +11 -0
  23. data/app/assets/templates/caboose_store/checkout/forms/signin.jst.ejs +7 -0
  24. data/app/assets/templates/caboose_store/checkout/line_items.jst.ejs +32 -0
  25. data/app/assets/templates/caboose_store/checkout/login.jst.ejs +21 -0
  26. data/app/assets/templates/caboose_store/checkout/payment.jst.ejs +5 -0
  27. data/app/assets/templates/caboose_store/checkout/shipping.jst.ejs +18 -0
  28. data/app/assets/templates/caboose_store/product/images.jst.ejs +8 -0
  29. data/app/assets/templates/caboose_store/product/options.jst.ejs +19 -0
  30. data/app/controllers/caboose_store/application_controller.rb +1 -11
  31. data/app/controllers/caboose_store/cart_controller.rb +36 -44
  32. data/app/controllers/caboose_store/cart_controller.rb.bak +169 -0
  33. data/app/controllers/caboose_store/categories_controller.rb +72 -92
  34. data/app/controllers/caboose_store/checkout_controller.rb +231 -151
  35. data/app/controllers/caboose_store/orders_controller.rb +235 -95
  36. data/app/controllers/caboose_store/product_images_controller.rb +1 -1
  37. data/app/controllers/caboose_store/products_controller.rb +275 -84
  38. data/app/controllers/caboose_store/reviews_controller.rb +1 -1
  39. data/app/controllers/caboose_store/variants_controller.rb +86 -20
  40. data/app/controllers/caboose_store/vendors_controller.rb +73 -0
  41. data/app/helpers/caboose_store/application_helper.rb +3 -41
  42. data/app/helpers/caboose_store/cart_helper.rb +0 -24
  43. data/app/helpers/caboose_store/categories_helper.rb +69 -25
  44. data/app/helpers/caboose_store/checkout_helper.rb +31 -0
  45. data/app/helpers/caboose_store/products_helper.rb +4 -80
  46. data/app/mailers/caboose_store/orders_mailer.rb +6 -13
  47. data/app/models/caboose_store/address.rb +5 -9
  48. data/app/models/caboose_store/caboose_store_plugin.rb +18 -7
  49. data/app/models/caboose_store/category.rb +66 -41
  50. data/app/models/caboose_store/category_membership.rb +1 -2
  51. data/app/models/caboose_store/customization_membership.rb +10 -0
  52. data/app/models/caboose_store/discount.rb +4 -2
  53. data/app/models/caboose_store/line_item.rb +77 -0
  54. data/app/models/caboose_store/message.rb +3 -5
  55. data/app/models/caboose_store/order.rb +153 -63
  56. data/app/models/caboose_store/order_discount.rb +1 -2
  57. data/app/models/caboose_store/order_pdf.rb +2 -4
  58. data/app/models/caboose_store/payment_processors/authorizenet.rb +20 -2
  59. data/app/models/caboose_store/payment_processors/base.rb +0 -2
  60. data/app/models/caboose_store/payment_processors/payscape.rb +91 -1
  61. data/app/models/caboose_store/product.rb +86 -30
  62. data/app/models/caboose_store/product_image.rb +50 -15
  63. data/app/models/caboose_store/product_image_variant.rb +3 -3
  64. data/app/models/caboose_store/review.rb +8 -8
  65. data/app/models/caboose_store/schema.rb +174 -119
  66. data/app/models/caboose_store/search_filter.rb +110 -115
  67. data/app/models/caboose_store/shipping_calculator.rb +51 -49
  68. data/app/models/caboose_store/tax_calculator.rb +2 -6
  69. data/app/models/caboose_store/tax_line.rb +1 -4
  70. data/app/models/caboose_store/variant.rb +77 -21
  71. data/app/models/caboose_store/vendor.rb +17 -2
  72. data/app/views/caboose_store/cart/index.html.erb +3 -18
  73. data/app/views/caboose_store/categories/admin_edit.html.erb +64 -67
  74. data/app/views/caboose_store/categories/admin_index.html.erb +7 -9
  75. data/app/views/caboose_store/categories/admin_new.html.erb +56 -39
  76. data/app/views/caboose_store/checkout/_address_form.html.erb +111 -0
  77. data/app/views/caboose_store/checkout/_billing_form.html.erb +47 -0
  78. data/app/views/caboose_store/checkout/_cart.html.erb +52 -0
  79. data/app/views/caboose_store/checkout/_order_discount.html.erb +40 -0
  80. data/app/views/caboose_store/checkout/_shipping_address.html.erb +10 -0
  81. data/app/views/caboose_store/checkout/_shipping_method.html.erb +2 -0
  82. data/app/views/caboose_store/checkout/_shipping_method_form.html.erb +21 -0
  83. data/app/views/caboose_store/checkout/billing.html.erb +4 -161
  84. data/app/views/caboose_store/checkout/discount.html.erb +5 -160
  85. data/app/views/caboose_store/checkout/empty.html.erb +2 -0
  86. data/app/views/caboose_store/checkout/error.html.erb +2 -0
  87. data/app/views/caboose_store/checkout/index.html.erb +30 -100
  88. data/app/views/caboose_store/checkout/login.html.erb +2 -0
  89. data/app/views/caboose_store/checkout/payment.html.erb +79 -0
  90. data/app/views/caboose_store/checkout/relay.html.erb +12 -0
  91. data/app/views/caboose_store/checkout/relay_postMessage.html.erb +19 -0
  92. data/app/views/caboose_store/checkout/shipping.html.erb +8 -83
  93. data/app/views/caboose_store/checkout/step_one.html.erb +15 -0
  94. data/app/views/caboose_store/checkout/step_two.html.erb +15 -0
  95. data/app/views/caboose_store/checkout/thanks.html.erb +5 -0
  96. data/app/views/caboose_store/layouts/_footer.html.erb +1 -1
  97. data/app/views/caboose_store/orders/admin_edit.html.erb +101 -7
  98. data/app/views/caboose_store/orders/admin_index.html.erb +8 -8
  99. data/app/views/caboose_store/orders_mailer/customer_new_order.html.erb +0 -46
  100. data/app/views/caboose_store/orders_mailer/customer_status_updated.html.erb +0 -48
  101. data/app/views/caboose_store/orders_mailer/fulfillment_new_order.html.erb +0 -42
  102. data/app/views/caboose_store/orders_mailer/shipping_order_ready.html.erb +0 -45
  103. data/app/views/caboose_store/products/_admin_header.html.erb +7 -6
  104. data/app/views/caboose_store/products/_sort_options.html.erb +19 -0
  105. data/app/views/caboose_store/products/admin_add_upcs.html.erb +58 -0
  106. data/app/views/caboose_store/products/admin_edit_categories.html.erb +1 -1
  107. data/app/views/caboose_store/products/admin_edit_description.html.erb +2 -5
  108. data/app/views/caboose_store/products/admin_edit_general.html.erb +58 -1
  109. data/app/views/caboose_store/products/admin_edit_images.html.erb +3 -1
  110. data/app/views/caboose_store/products/admin_edit_variants.html.erb +13 -2
  111. data/app/views/caboose_store/products/admin_edit_variants_single.html.erb +14 -14
  112. data/app/views/caboose_store/products/admin_group_variants.html.erb +433 -0
  113. data/app/views/caboose_store/products/admin_index.html.erb +87 -39
  114. data/app/views/caboose_store/products/admin_sort.html copy.erb +155 -0
  115. data/app/views/caboose_store/products/admin_sort.html.erb +254 -0
  116. data/app/views/caboose_store/products/details.html.erb +1 -2
  117. data/app/views/caboose_store/variants/admin_edit.html.erb +18 -16
  118. data/app/views/caboose_store/variants/admin_group.html.erb +184 -0
  119. data/app/views/caboose_store/vendors/admin_edit.html.erb +24 -0
  120. data/app/views/caboose_store/vendors/admin_index.html.erb +30 -0
  121. data/app/views/caboose_store/vendors/admin_new.html.erb +34 -0
  122. data/config/routes.rb +65 -27
  123. data/lib/caboose-store/caboose_store_helper.rb +29 -30
  124. data/lib/caboose-store/engine.rb +73 -28
  125. data/lib/caboose-store/version.rb +1 -1
  126. data/lib/caboose-store.rb +16 -7
  127. data/lib/tasks/caboose-store.rake +0 -2
  128. metadata +54 -17
  129. data/app/assets/javascripts/caboose_store/modal.js +0 -52
  130. data/app/assets/javascripts/caboose_store/modal_integration.js +0 -25
  131. data/app/assets/javascripts/caboose_store/model.form.page.js +0 -30
  132. data/app/assets/javascripts/caboose_store/model.form.user.js +0 -36
  133. data/app/assets/javascripts/caboose_store/payment_processors/authorizenet.js +0 -21
  134. data/app/assets/javascripts/caboose_store/payment_processors/base.js +0 -21
  135. data/app/assets/javascripts/caboose_store/payment_processors/payscape.js +0 -21
  136. data/app/assets/javascripts/caboose_store/shortcut.js +0 -11
  137. data/app/assets/javascripts/caboose_store/station.js +0 -60
  138. data/app/models/caboose_store/order_line_item.rb +0 -13
  139. data/app/models/caboose_store/states.rb +0 -60
  140. data/app/views/caboose_store/application/_category_thumb.html.erb +0 -6
  141. data/app/views/caboose_store/application/_product_thumb.html.erb +0 -13
  142. data/app/views/caboose_store/checkout/quantity_box.html.erb +0 -39
  143. data/app/views/caboose_store/checkout/thank_you.html.erb +0 -36
@@ -0,0 +1,73 @@
1
+ module CabooseStore
2
+ class VendorsController < CabooseStore::ApplicationController
3
+
4
+ # GET /admin/vendors/status-options
5
+ def status_options
6
+ options = Array.new
7
+
8
+ ['Active', 'Inactive', 'Deleted'].each do |status|
9
+ options << {
10
+ :text => status,
11
+ :value => status
12
+ }
13
+ end
14
+
15
+ render :json => options
16
+ end
17
+
18
+ # GET /admin/vendors/new
19
+ def admin_new
20
+ render :layout => 'caboose/admin'
21
+ end
22
+
23
+ # POST /admin/vendors/create
24
+ def admin_create
25
+ render :json => { :success => false, :message => 'Must define a name' } and return if params[:name].nil? || params[:name].empty?
26
+
27
+ vendor = Vendor.new
28
+ vendor.name = params[:name]
29
+ vendor.status = 'Inactive'
30
+
31
+ render :json => { :success => vendor.save, :redirect => "/admin/vendors/#{vendor.id}/edit" }
32
+ end
33
+
34
+ # GET /admin/vendors
35
+ def admin_index
36
+ @pager = Caboose::Pager.new(params, {
37
+ 'name_like' => ''
38
+ }, {
39
+ 'model' => 'CabooseStore::Vendor',
40
+ 'sort' => 'name',
41
+ 'desc' => false,
42
+ 'base_url' => '/admin/vendors',
43
+ 'items_per_page' => 25,
44
+ 'use_url_params' => false
45
+ });
46
+
47
+ @vendors = @pager.items
48
+
49
+ render :layout => 'caboose/admin'
50
+ end
51
+
52
+ # GET /admin/vendors/:id/edit
53
+ def admin_edit
54
+ @vendor = Vendor.find(params[:id])
55
+ render :layout => 'caboose/admin'
56
+ end
57
+
58
+ # PUT /admin/vendors/:id/update
59
+ def admin_update
60
+ vendor = Vendor.find(params[:id])
61
+
62
+ params.each do |name, value|
63
+ case name
64
+ when 'name' then vendor.name = value
65
+ when 'status' then vendor.status = value
66
+ end
67
+ end
68
+
69
+ render :json => { :success => vendor.save }
70
+ end
71
+ end
72
+ end
73
+
@@ -1,46 +1,8 @@
1
1
  module CabooseStore
2
2
  module ApplicationHelper
3
-
4
- def foo
5
- "foobar"
6
- end
7
-
8
- def all_categories()
9
- list = ""
10
- top_cats = Category.where(:parent_id => 1).where("id != ?", 32).where("id != ?", 3).reorder('name').limit(3)
11
- accessories = Category.find(3)
12
- top_cats << accessories
13
- top_cats.each do |cat|
14
- list << "<li><a href='#{cat.url}'>#{cat.name}</a>"
15
- list << "<ul>"
16
-
17
- links = {}
18
- bottom_cats = Category.where(:parent_id => cat.id).reorder("name").all
19
- bottom_cats.each do |bcat|
20
- if bcat.products != []
21
- links[bcat.name] = "<li><a href='#{bcat.url}'>#{bcat.name}</a></li>"
22
- end
23
- end
24
- cat.products.where(:status => 'active').each do |p|
25
- links[p.title] = "<li><a href='/products/#{p.id}'>#{p.title}</a></li>"
26
- end
27
- links.sort.each { |key,val| list << val }
28
-
29
- list << "</ul>"
30
- list << "</li>"
31
- end
32
- return list
33
- end
34
-
35
- def square_image(img)
36
- style = ""
37
- if img
38
- style = "background-image: url(#{img.url(:thumb)});"
39
- style << "background-position: #{img.square_offset_x.to_s}px #{img.square_offset_y.to_s}px;"
40
- else
41
- style = 'background-image: url(https://dmwwflw4i3miv.cloudfront.net/placeholder.jpg);'
42
- end
43
- return style
3
+ def parent_categories
4
+ CabooseStore::Category.find(1).children.where(:status => 'Active')
44
5
  end
45
6
  end
46
7
  end
8
+
@@ -1,28 +1,4 @@
1
1
  module CabooseStore
2
2
  module CartHelper
3
-
4
- def line_items(order)
5
- arr = []
6
- order.line_items.each do |li|
7
- v = li.variant
8
- p = v.product
9
-
10
- img = false
11
- if v.product_images && v.product_images.count > 0
12
- # img = v.product_images[0].image.url(:tiny)
13
- #elsif p.product_images && p.product_images.count > 0
14
- # img = p.product_images[0].image.url(:tiny)
15
- end
16
-
17
- arr << {
18
- 'quantity' => li.quantity,
19
- 'variant' => v,
20
- 'variant_title' => "#{p.title}<br />#{v.title}",
21
- 'variant_image' => img
22
- }
23
- end
24
- return arr
25
- end
26
-
27
3
  end
28
4
  end
@@ -1,38 +1,82 @@
1
1
  module CabooseStore
2
2
  module CategoriesHelper
3
-
4
- def categories_tree(cat)
5
- str = "<ul>"
6
- str << categories_tree_helper(cat)
7
- str << "</ul>"
8
- return str
3
+ def root_category
4
+ CabooseStore::Category.root
9
5
  end
10
6
 
11
- def categories_tree_helper(cat)
12
- str = "<li><a href='/admin/categories/#{cat.id}/edit'>#{cat.name}</a>"
13
- if cat.children && cat.children.count > 0
14
- str << "<ul>"
15
- cat.children.each { |kid| str << categories_tree_helper(kid) }
16
- str << "</ul>"
17
- end
18
- str << "</li>\n"
19
- return str
7
+ def top_level_categories
8
+ CabooseStore::Category.top_level
20
9
  end
21
10
 
22
- def categories_options(cat, selected_id = nil)
23
- str = categories_options_helper(cat, '', selected_id)
24
- return str
11
+ def category_list(category=root_category)
12
+ content_tag :ul, category_list_items(category)
13
+ end
14
+
15
+ def category_list_items(category)
16
+
17
+ # Link to category
18
+ link = link_to(category.name, "/admin/categories/#{category.id}/edit")
19
+
20
+ # Recursively find category children
21
+ children = content_tag :ul, category.children.collect { |child| category_list_items(child) }.join.to_s.html_safe if category.children.any?
22
+
23
+ # Return the list item
24
+ content_tag :li, link.concat(children)
25
+ end
26
+
27
+ def category_select(form_name, category=root_category, selected_id=nil)
28
+
29
+ # Collect all recursive options from specified category down
30
+ options = category_options(category, selected_id)
31
+
32
+ # Prepend the root category
33
+ options.unshift([category.name, category.id])
34
+
35
+ # Create select tag
36
+ select_tag form_name, options_for_select(options)
37
+ end
38
+
39
+ def category_options(category, selected_id, prefix="")
40
+
41
+ # Array to hold options
42
+ options = Array.new
43
+
44
+ # Recusively tterate over all child categories
45
+ category.children.collect do |child|
46
+ options << ["#{prefix} - #{child.name}", child.id]
47
+ options.concat category_options(child, selected_id, "#{prefix} -")
48
+ end
49
+
50
+ # Return the options array
51
+ return options
25
52
  end
26
53
 
27
- def categories_options_helper(cat, prefix, selected_id)
28
- str = "<option value='#{cat.id}'"
29
- str << " selected='true'" if cat.id == selected_id
30
- str << ">#{prefix}#{cat.name}</option>"
31
- if cat.children
32
- cat.children.each { |kid| str << categories_options_helper(kid, "#{prefix} - ", selected_id) }
54
+ def category_checkboxes(top_categories, selected_ids = nil)
55
+ str = "<ul>"
56
+ top_categories.each do |cat|
57
+ category_checkboxes_helper(cat, selected_ids, str)
33
58
  end
59
+ str << "</ul>"
34
60
  return str
35
61
  end
36
62
 
63
+ def category_checkboxes_helper(cat, selected_ids, str, prefix = "")
64
+ str << "<li>"
65
+ if cat.children && cat.children.count > 0
66
+ str << "<input type='checkbox' id='cat_#{cat.id}' value='#{cat.id}'"
67
+ str << " checked='true'" if selected_ids && selected_ids.include?(cat.id)
68
+ str << "> <label for='#{cat.id}'><h3>#{cat.name}</h3></label>"
69
+ else
70
+ str << "<input type='checkbox' id='cat_#{cat.id}' value='#{cat.id}'"
71
+ str << " checked='true'" if selected_ids && selected_ids.include?(cat.id)
72
+ str << "> <label for='#{cat.id}'>#{cat.name}</label>"
73
+ end
74
+ cat.children.each do |cat2|
75
+ str << "<ul>"
76
+ category_checkboxes_helper(cat2, selected_ids, str, "#{prefix}&nbsp;&nbsp;")
77
+ str << "</ul>"
78
+ end
79
+ str << "</li>"
80
+ end
37
81
  end
38
- end
82
+ end
@@ -0,0 +1,31 @@
1
+ module CabooseStore
2
+ module CheckoutHelper
3
+ def caboose_store_cart
4
+ render :partial => '/caboose_store/checkout/cart'
5
+ end
6
+
7
+ def caboose_store_address_form
8
+ render :partial => '/caboose_store/checkout/address_form'
9
+ end
10
+
11
+ def caboose_store_shipping_address
12
+ render :partial => '/caboose_store/checkout/shipping_address'
13
+ end
14
+
15
+ def caboose_store_shipping_method_form
16
+ render :partial => '/caboose_store/checkout/shipping_method_form'
17
+ end
18
+
19
+ def caboose_store_shipping_method
20
+ render :partial => '/caboose_store/checkout/shipping_method'
21
+ end
22
+
23
+ def caboose_store_discount
24
+ render :partial => '/caboose_store/checkout/order_discount'
25
+ end
26
+
27
+ def caboose_store_billing_form
28
+ render :partial => '/caboose_store/checkout/billing_form'
29
+ end
30
+ end
31
+ end
@@ -1,87 +1,11 @@
1
1
  module CabooseStore
2
2
  module ProductsHelper
3
-
4
- def category_options(top_categories, selected_id = nil)
5
- arr = []
6
- top_categories.each do |cat|
7
- category_options_helper(cat, selected_id, arr)
8
- end
9
- return arr.join("\n")
10
- end
11
-
12
- def category_options_helper(cat, selected_id, arr, prefix = "")
13
- opt = "<option value='#{cat.id}'"
14
- opt << " selected='true'" if !selected_id.nil? && selected_id == cat.id
15
- opt << ">#{prefix}#{cat.name}</option>"
16
- arr << opt
17
- cat.children.each do |cat2|
18
- category_options_helper(cat2, selected_id, arr, "#{prefix} - ")
19
- end
20
- end
21
-
22
- def category_checkboxes(top_categories, selected_ids = nil)
23
- str = "<ul>"
24
- top_categories.each do |cat|
25
- category_checkboxes_helper(cat, selected_ids, str)
26
- end
27
- str << "</ul>"
28
- return str
3
+ def active_products
4
+ CabooseStore::Product.active
29
5
  end
30
6
 
31
- def category_checkboxes_helper(cat, selected_ids, str, prefix = "")
32
- str << "<li>"
33
- if cat.children && cat.children.count > 0
34
- str << "<input type='checkbox' id='cat_#{cat.id}' value='#{cat.id}'"
35
- str << " checked='true'" if selected_ids && selected_ids.include?(cat.id)
36
- str << "> <label for='#{cat.id}'><h2>#{cat.name}</h2></label>"
37
- else
38
- str << "<input type='checkbox' id='cat_#{cat.id}' value='#{cat.id}'"
39
- str << " checked='true'" if selected_ids && selected_ids.include?(cat.id)
40
- str << "> <label for='#{cat.id}'>#{cat.name}</label>"
41
- end
42
- cat.children.each do |cat2|
43
- str << "<ul>"
44
- category_checkboxes_helper(cat2, selected_ids, str, "#{prefix}&nbsp;&nbsp;")
45
- str << "</ul>"
46
- end
47
- str << "</li>"
7
+ def caboose_sort_options
8
+ render :partial => '/caboose_store/products/sort_options'
48
9
  end
49
-
50
- def product_price(p)
51
- price = ""
52
- if p.price_varies
53
- arr = p.price_range
54
- min = number_to_currency(arr[0], :precision => 2)
55
- max = number_to_currency(arr[1], :precision => 2)
56
- if min.eql? max
57
- price = "#{min}"
58
- else
59
- price = "#{min}-#{max}"
60
- end
61
- else
62
- price = p.variants[0].price
63
- price = number_to_currency(price, :precision => 2)
64
- end
65
- return price
66
- end
67
-
68
- def breadcrumb(p)
69
- return p.category.ancestry.collect{|cat| "<li><a href='/products/#{cat.id}'>#{cat.name}</a></li>"}.join("<span class='divider'>/</span>")
70
- end
71
-
72
- #def product_thumb(product, price)
73
- # style = square_image(product.featured_image)
74
- # price = product.most_popular_variant.price if price.nil?
75
- #
76
- # str = "<li class='thumb'>"
77
- # str << "<a href='/products/#{product.id}'>"
78
- # str << "<figure class='thumb-image' style='<%= style %>"></figure>"
79
- # str << "<div class="thumb-title"><%= product.title %></div>"
80
- # str << " <div class="thumb-price"><%= price %></div>"
81
- # str << "</a>"
82
- # str << "</li><!-- .thumb -->"
83
- #
84
- #end
85
-
86
10
  end
87
11
  end
@@ -1,36 +1,29 @@
1
1
  module CabooseStore
2
2
  class OrdersMailer < ActionMailer::Base
3
- default :from => "orders@tuskwearcollection.com"
3
+ default :from => 'woodsnwater.actionmailer@gmail.com'
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.email, :subject => "Thank you from TuskWear!")
8
+ mail(:to => order.customer ? order.customer.email : order.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
12
12
  def fulfillment_new_order(order)
13
13
  @order = order
14
- #config = YAML::load(File.open("#{Rails.root}/config/tuskwear.yml"))
15
- #fulfillment_email = config[Rails.env]['order_fulfillment_email']
16
- #mail(:to => fulfillment_email, :subject => "New Order")
17
- mail(:to => 'info@tuskwearcollection.com', :subject => "New Order")
18
- #mail(:to => 'william@nine.is', :subject => "New Order")
14
+ mail(:to => CabooseStore::fulfillment_email, :subject => 'New Order')
19
15
  end
20
16
 
21
17
  # Sends a notification email to the shipping dept that an order is ready to be shipped
22
18
  def shipping_order_ready(order)
23
19
  @order = order
24
- #config = YAML::load(File.open("#{Rails.root}/config/tuskwear.yml"))
25
- #shipping_email = config[Rails.env]['order_shipping_email']
26
- #mail(:to => shipping_email, :subject => "Order ready for shipping")
27
- mail(:to => 'info@tuskwearcollection.com', :subject => "Order ready for shipping")
20
+ mail(:to => CabooseStore::shipping_email, :subject => 'Order ready for shipping')
28
21
  end
29
22
 
30
23
  # Sends a notification email to the customer that the status of the order has been changed
31
24
  def customer_status_updated(order)
32
25
  @order = order
33
- mail(:to => order.customer.email, :subject => "TuskWear Order Status Update")
26
+ mail(:to => order.customer ? order.customer.email : order.email, :subject => 'Order status update')
34
27
  end
35
28
  end
36
- end
29
+ end
@@ -1,6 +1,6 @@
1
1
  module CabooseStore
2
2
  class Address < ActiveRecord::Base
3
- self.table_name = "store_addresses"
3
+ self.table_name = 'store_addresses'
4
4
 
5
5
  attr_accessible :id,
6
6
  :name,
@@ -18,13 +18,9 @@ module CabooseStore
18
18
  :country,
19
19
  :country_code,
20
20
  :phone
21
-
22
- #validates :street, presence: true
23
- #validates :address1, presence: true
24
- #validates :city, presence: true
25
- #validates :zip, numericality: true
26
- #validates :phone, uniqueness: true
27
- #validates :company, presence: true
28
-
21
+
22
+ validates :first_name, :last_name, :address1, :city, :state, :zip, :presence => true
23
+ validates :zip, :format => { :with => /^\d{5}(-\d{4})?$/, :message => 'Invalid zip code' }
29
24
  end
30
25
  end
26
+
@@ -1,22 +1,33 @@
1
1
  module CabooseStore
2
2
  class CabooseStorePlugin < Caboose::CaboosePlugin
3
-
4
- def self.admin_nav(nav, user = nil, page = nil)
3
+ def self.admin_nav(nav, user=nil, page=nil)
5
4
  return nav if user.nil?
6
5
 
7
6
  item = {
8
- 'id' => 'general-store',
9
- 'text' => 'General Store',
7
+ 'id' => 'general-store',
8
+ 'text' => 'General Store',
10
9
  'children' => []
11
10
  }
12
-
11
+
13
12
  item['children'] << { 'id' => 'categories', 'href' => '/admin/categories' , 'text' => 'Categories' , 'modal' => false } if user.is_allowed('categories' , 'view')
13
+ item['children'] << { 'id' => 'vendors' , 'href' => '/admin/vendors' , 'text' => 'Vendors' , 'modal' => false } if user.is_allowed('vendors' , 'view')
14
14
  item['children'] << { 'id' => 'products' , 'href' => '/admin/products' , 'text' => 'Products' , 'modal' => false } if user.is_allowed('products' , 'view')
15
15
  item['children'] << { 'id' => 'orders' , 'href' => '/admin/orders' , 'text' => 'Orders' , 'modal' => false } if user.is_allowed('orders' , 'view')
16
-
17
- nav << item
16
+
17
+ nav << item
18
+
18
19
  return nav
19
20
  end
20
21
 
22
+ def self.javascripts(scripts)
23
+ scripts << 'caboose_store/application'
24
+
25
+ return scripts
26
+ end
27
+
28
+ #def self.login_success
29
+ # @order.update_attribute(:customer_id, session['app_user'].id)
30
+ #end
21
31
  end
22
32
  end
33
+
@@ -1,63 +1,88 @@
1
+ #
2
+ # Category
3
+ #
4
+ # :: Class Methods
5
+ # :: Instance Methods
6
+
1
7
  module CabooseStore
2
8
  class Category < ActiveRecord::Base
3
- self.table_name = "store_categories"
9
+ self.table_name = 'store_categories'
4
10
 
5
11
  belongs_to :parent, :class_name => 'Category', :foreign_key => 'parent_id'
6
- has_many :children, :class_name => 'Category', :foreign_key => 'parent_id', :order => 'name'
12
+ has_many :children, :class_name => 'Category', :foreign_key => 'parent_id', :order => 'name'
7
13
  has_many :products, :through => :category_memberships, :order => 'title'
8
14
  has_many :category_memberships
15
+
9
16
  has_attached_file :image,
10
- :path => "categories/:id_:style.jpg",
17
+ :path => 'categories/:id_:style.jpg',
11
18
  :default_url => '/categories/:id_:style.jpg',
12
19
  :styles => {
13
- :tiny => '100x100>',
14
- :thumb => '250x250>',
15
- :medium => '400x400>',
16
- :large => '800x800>',
17
- :huge => '1200x1200>'
20
+ tiny: '100x100>',
21
+ thumb: '250x250>',
22
+ medium: '400x400>',
23
+ large: '800x800>',
24
+ huge: '1200x1200>'
18
25
  }
26
+
27
+ validates_attachment_content_type :image, :content_type => %w(image/jpeg image/jpg image/png)
19
28
 
20
- attr_accessible :id, :parent_id, :name, :url, :slug
29
+ attr_accessible :id,
30
+ :parent_id,
31
+ :name,
32
+ :url,
33
+ :slug,
34
+ :sort_order,
35
+ :status,
36
+ :image_file_name,
37
+ :image_content_type,
38
+ :image_file_size,
39
+ :image_updated_at,
40
+ :square_offset_x,
41
+ :square_offset_y,
42
+ :square_scale_factor
21
43
 
22
- def ancestry
23
- return [self] if self.parent.nil?
24
- arr = self.parent.ancestry
25
- arr << self
26
- return arr
44
+ #
45
+ # Class Methods
46
+ #
47
+
48
+ def self.root
49
+ self.find_by_url('/products')
27
50
  end
28
-
29
- def self.options(selected_id = nil)
30
- arr = []
31
- self.where(:parent_id => nil).reorder('name').all.each do |cat|
32
- self.options_helper(cat, selected_id, arr)
33
- end
34
- return arr
51
+
52
+ def self.top_level
53
+ self.root.children
35
54
  end
36
55
 
37
- def self.options_helper(cat, selected_id, arr, prefix = "")
38
- arr << {
39
- :value => cat.id,
40
- :text => "#{prefix}#{cat.name}"
41
- }
42
- cat.children.each do |cat2|
43
- self.options_helper(cat2, selected_id, arr, "#{prefix} - ")
44
- end
56
+ def self.sample(number)
57
+ CabooseStore::Category.top_level.collect { |category| category if category.active_products.any? }.compact.sample(number)
45
58
  end
46
-
47
- def featured_image(size)
48
- if self.products == []
49
- return 'http://s3.amazonaws.com/categories/no_image.jpg'
50
- end
51
-
52
- return self.products.reject{|p| p.featured_image.nil? || p.nil?}.first.featured_image.url(size) unless self.products.first.product_images == []
53
- return self.products.reject{|p| p.featured_image.nil? || p.nil?}.second.featured_image.url(size) unless self.products.second.product_images == []
54
- return self.products.reject{|p| p.featured_image.nil? || p.nil?}.last.featured_image.url(size) unless self.products.last.product_images == []
55
-
59
+
60
+ #
61
+ # Instance Methods
62
+ #
63
+
64
+ def generate_slug
65
+ self.name.gsub(' ', '-').downcase
66
+ end
67
+
68
+ def update_child_slugs
69
+ return if self.children.nil? or self.children.empty?
70
+
71
+ self.children.each do |child|
72
+ child.update_attribute(:url, "#{self.url}/#{child.slug}")
73
+ child.update_child_slugs
74
+ end
56
75
  end
57
76
 
58
- def self.get_slug(str)
59
- return str.gsub(' ', '-').downcase
77
+ def active_products
78
+ self.products.where(:status => 'Active')
60
79
  end
61
80
 
81
+ def ancestry
82
+ return [self] if self.parent.nil?
83
+ ancestors = self.parent.ancestry
84
+ ancestors << self
85
+ return ancestors
86
+ end
62
87
  end
63
88
  end
@@ -1,11 +1,10 @@
1
1
  module CabooseStore
2
2
  class CategoryMembership < ActiveRecord::Base
3
- self.table_name = "store_category_memberships"
3
+ self.table_name = 'store_category_memberships'
4
4
 
5
5
  belongs_to :category
6
6
  belongs_to :product
7
7
 
8
8
  attr_accessible :category_id, :product_id
9
-
10
9
  end
11
10
  end
@@ -0,0 +1,10 @@
1
+ module CabooseStore
2
+ class CustomizationMembership < ActiveRecord::Base
3
+ self.table_name = 'store_customization_memberships'
4
+
5
+ belongs_to :product
6
+ belongs_to :customization, :class_name => 'CabooseStore::Product'
7
+
8
+ attr_accessible :product_id, :customization_id
9
+ end
10
+ end
@@ -1,14 +1,16 @@
1
1
  module CabooseStore
2
2
  class Discount < ActiveRecord::Base
3
- self.table_name = "store_discounts"
3
+ self.table_name = 'store_discounts'
4
+ self.primary_key = 'id'
4
5
 
5
6
  attr_accessible :id,
6
7
  :name, # The name of this discount
7
8
  :code, # The code the customer has to input to apply for this discount
9
+ :amount_current,
10
+ :amount_total,
8
11
  :amount_flat, # Amount of the savings flat off the total
9
12
  :amount_percentage, # Amount of savings as a percentage off the total
10
13
  :no_shipping, # Whether or not it's a free shipping discount
11
14
  :no_tax # Whether or not it's a free shipping discount
12
-
13
15
  end
14
16
  end