caboose-store 0.0.2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (172) hide show
  1. checksums.yaml +15 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +113 -0
  4. data/Rakefile +38 -0
  5. data/app/assets/images/caboose_store/caboose_logo_small.png +0 -0
  6. data/app/assets/images/caboose_store/caboose_nav.png +0 -0
  7. data/app/assets/images/caboose_store/caboose_nav_black.png +0 -0
  8. data/app/assets/images/caboose_store/default_user_pic.png +0 -0
  9. data/app/assets/images/caboose_store/loading_green.gif +0 -0
  10. data/app/assets/images/caboose_store/loading_small_white_on_black.gif +0 -0
  11. data/app/assets/images/caboose_store/loading_white_on_black.gif +0 -0
  12. data/app/assets/javascripts/caboose_store/admin.js +20 -0
  13. data/app/assets/javascripts/caboose_store/application.js +17 -0
  14. data/app/assets/javascripts/caboose_store/modal.js +52 -0
  15. data/app/assets/javascripts/caboose_store/modal_integration.js +25 -0
  16. data/app/assets/javascripts/caboose_store/model.form.page.js +30 -0
  17. data/app/assets/javascripts/caboose_store/model.form.user.js +36 -0
  18. data/app/assets/javascripts/caboose_store/shortcut.js +11 -0
  19. data/app/assets/javascripts/caboose_store/station.js +60 -0
  20. data/app/assets/stylesheets/caboose_store/admin.css +100 -0
  21. data/app/assets/stylesheets/caboose_store/application.css +19 -0
  22. data/app/assets/stylesheets/caboose_store/bound_input.css +1 -0
  23. data/app/assets/stylesheets/caboose_store/caboose.css +4 -0
  24. data/app/assets/stylesheets/caboose_store/fonts/big_noodle_titling.ttf +0 -0
  25. data/app/assets/stylesheets/caboose_store/fonts/big_noodle_titling_oblique.ttf +0 -0
  26. data/app/assets/stylesheets/caboose_store/fonts.css +5 -0
  27. data/app/assets/stylesheets/caboose_store/login.css +23 -0
  28. data/app/assets/stylesheets/caboose_store/modal.css +240 -0
  29. data/app/assets/stylesheets/caboose_store/page_bar_generator.css +34 -0
  30. data/app/assets/stylesheets/caboose_store/register.css +25 -0
  31. data/app/assets/stylesheets/caboose_store/station_modal.css +104 -0
  32. data/app/assets/stylesheets/caboose_store/station_sidebar.css +232 -0
  33. data/app/assets/stylesheets/caboose_store/tinymce.css +25 -0
  34. data/app/controllers/caboose_store/application_controller.rb +18 -0
  35. data/app/controllers/caboose_store/cart_controller.rb +59 -0
  36. data/app/controllers/caboose_store/categories_controller.rb +128 -0
  37. data/app/controllers/caboose_store/checkout_controller.rb +164 -0
  38. data/app/controllers/caboose_store/orders_controller.rb +264 -0
  39. data/app/controllers/caboose_store/product_images_controller.rb +38 -0
  40. data/app/controllers/caboose_store/products_controller.rb +387 -0
  41. data/app/controllers/caboose_store/reviews_controller.rb +15 -0
  42. data/app/controllers/caboose_store/variants_controller.rb +152 -0
  43. data/app/helpers/caboose_store/application_helper.rb +46 -0
  44. data/app/helpers/caboose_store/cart_helper.rb +28 -0
  45. data/app/helpers/caboose_store/categories_helper.rb +38 -0
  46. data/app/helpers/caboose_store/products_helper.rb +87 -0
  47. data/app/mailers/caboose_store/orders_mailer.rb +36 -0
  48. data/app/models/caboose_store/address.rb +30 -0
  49. data/app/models/caboose_store/caboose_store_plugin.rb +22 -0
  50. data/app/models/caboose_store/category.rb +63 -0
  51. data/app/models/caboose_store/category_membership.rb +11 -0
  52. data/app/models/caboose_store/discount.rb +14 -0
  53. data/app/models/caboose_store/message.rb +22 -0
  54. data/app/models/caboose_store/order.rb +97 -0
  55. data/app/models/caboose_store/order_discount.rb +11 -0
  56. data/app/models/caboose_store/order_line_item.rb +13 -0
  57. data/app/models/caboose_store/order_pdf.rb +82 -0
  58. data/app/models/caboose_store/product.rb +78 -0
  59. data/app/models/caboose_store/product_image.rb +25 -0
  60. data/app/models/caboose_store/product_image_variant.rb +10 -0
  61. data/app/models/caboose_store/review.rb +13 -0
  62. data/app/models/caboose_store/schema.rb +146 -0
  63. data/app/models/caboose_store/shipping_calculator.rb +79 -0
  64. data/app/models/caboose_store/states.rb +60 -0
  65. data/app/models/caboose_store/tax_calculator.rb +26 -0
  66. data/app/models/caboose_store/tax_line.rb +12 -0
  67. data/app/models/caboose_store/variant.rb +42 -0
  68. data/app/models/caboose_store/vendor.rb +7 -0
  69. data/app/views/caboose_store/application/_category_thumb.html.erb +6 -0
  70. data/app/views/caboose_store/application/_product_thumb.html.erb +13 -0
  71. data/app/views/caboose_store/cart/index.html.erb +19 -0
  72. data/app/views/caboose_store/categories/admin_edit.html.erb +82 -0
  73. data/app/views/caboose_store/categories/admin_index.html.erb +13 -0
  74. data/app/views/caboose_store/categories/admin_new.html.erb +45 -0
  75. data/app/views/caboose_store/checkout/billing.html.erb +168 -0
  76. data/app/views/caboose_store/checkout/discount.html.erb +166 -0
  77. data/app/views/caboose_store/checkout/index.html.erb +113 -0
  78. data/app/views/caboose_store/checkout/quantity_box.html.erb +39 -0
  79. data/app/views/caboose_store/checkout/shipping.html.erb +90 -0
  80. data/app/views/caboose_store/checkout/thank_you.html.erb +36 -0
  81. data/app/views/caboose_store/layouts/_banner.html.erb +10 -0
  82. data/app/views/caboose_store/layouts/_banner2.html.erb +10 -0
  83. data/app/views/caboose_store/layouts/_footer.html.erb +55 -0
  84. data/app/views/caboose_store/layouts/_header.html.erb +69 -0
  85. data/app/views/caboose_store/layouts/_sidebar.html.erb +27 -0
  86. data/app/views/caboose_store/layouts/application.html.erb +33 -0
  87. data/app/views/caboose_store/layouts/authorize_net.erb +18 -0
  88. data/app/views/caboose_store/layouts/layout_about.html.erb +42 -0
  89. data/app/views/caboose_store/layouts/layout_blog.html.erb +159 -0
  90. data/app/views/caboose_store/layouts/layout_confirm.html.erb +85 -0
  91. data/app/views/caboose_store/layouts/layout_contact.html.erb +38 -0
  92. data/app/views/caboose_store/layouts/layout_default.html.erb +10 -0
  93. data/app/views/caboose_store/layouts/layout_detail.html.erb +114 -0
  94. data/app/views/caboose_store/layouts/layout_order.html.erb +77 -0
  95. data/app/views/caboose_store/layouts/layout_pricing.html.erb +182 -0
  96. data/app/views/caboose_store/layouts/layout_product.html.erb +110 -0
  97. data/app/views/caboose_store/layouts/layout_profile.html.erb +55 -0
  98. data/app/views/caboose_store/layouts/layout_single.html.erb +3 -0
  99. data/app/views/caboose_store/layouts/layout_testimonial.html.erb +110 -0
  100. data/app/views/caboose_store/layouts/layout_testing.html.erb +4 -0
  101. data/app/views/caboose_store/orders/_admin_footer.html.erb +2 -0
  102. data/app/views/caboose_store/orders/_admin_header.html.erb +31 -0
  103. data/app/views/caboose_store/orders/_quickbooks_order.html.erb +0 -0
  104. data/app/views/caboose_store/orders/admin_delete_form.html.erb +21 -0
  105. data/app/views/caboose_store/orders/admin_edit.html.erb +173 -0
  106. data/app/views/caboose_store/orders/admin_index.html.erb +79 -0
  107. data/app/views/caboose_store/orders/admin_new.html.erb +42 -0
  108. data/app/views/caboose_store/orders/admin_print.html.erb +72 -0
  109. data/app/views/caboose_store/orders_mailer/customer_new_order.html.erb +47 -0
  110. data/app/views/caboose_store/orders_mailer/customer_status_updated.html.erb +49 -0
  111. data/app/views/caboose_store/orders_mailer/fulfillment_new_order.html.erb +43 -0
  112. data/app/views/caboose_store/orders_mailer/shipping_order_ready.html.erb +46 -0
  113. data/app/views/caboose_store/products/_admin_footer.html.erb +2 -0
  114. data/app/views/caboose_store/products/_admin_header.html.erb +31 -0
  115. data/app/views/caboose_store/products/admin_delete_form.html.erb +21 -0
  116. data/app/views/caboose_store/products/admin_edit_categories.html.erb +73 -0
  117. data/app/views/caboose_store/products/admin_edit_category_images.html.erb +233 -0
  118. data/app/views/caboose_store/products/admin_edit_description.html.erb +41 -0
  119. data/app/views/caboose_store/products/admin_edit_general.html.erb +47 -0
  120. data/app/views/caboose_store/products/admin_edit_images.html.erb +234 -0
  121. data/app/views/caboose_store/products/admin_edit_options.html.erb +51 -0
  122. data/app/views/caboose_store/products/admin_edit_seo.html.erb +37 -0
  123. data/app/views/caboose_store/products/admin_edit_variant_columns.html.erb +75 -0
  124. data/app/views/caboose_store/products/admin_edit_variants.html.erb +101 -0
  125. data/app/views/caboose_store/products/admin_edit_variants_single.html.erb +68 -0
  126. data/app/views/caboose_store/products/admin_index.html.erb +47 -0
  127. data/app/views/caboose_store/products/admin_new.html.erb +41 -0
  128. data/app/views/caboose_store/products/details.html.erb +437 -0
  129. data/app/views/caboose_store/products/index.html.erb +46 -0
  130. data/app/views/caboose_store/products/not_available.html.erb +35 -0
  131. data/app/views/caboose_store/variants/admin_edit.html.erb +80 -0
  132. data/app/views/caboose_store/variants/admin_new.html.erb +59 -0
  133. data/config/routes.rb +95 -0
  134. data/lib/caboose-store/caboose_store_helper.rb +35 -0
  135. data/lib/caboose-store/engine.rb +8 -0
  136. data/lib/caboose-store/version.rb +3 -0
  137. data/lib/caboose-store.rb +9 -0
  138. data/lib/tasks/caboose-store.rake +17 -0
  139. data/test/caboose_test.rb +7 -0
  140. data/test/dummy/README.rdoc +261 -0
  141. data/test/dummy/Rakefile +7 -0
  142. data/test/dummy/app/assets/javascripts/application.js +15 -0
  143. data/test/dummy/app/assets/stylesheets/application.css +13 -0
  144. data/test/dummy/app/controllers/application_controller.rb +3 -0
  145. data/test/dummy/app/helpers/application_helper.rb +2 -0
  146. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  147. data/test/dummy/config/application.rb +59 -0
  148. data/test/dummy/config/boot.rb +10 -0
  149. data/test/dummy/config/database.yml +25 -0
  150. data/test/dummy/config/environment.rb +5 -0
  151. data/test/dummy/config/environments/development.rb +37 -0
  152. data/test/dummy/config/environments/production.rb +67 -0
  153. data/test/dummy/config/environments/test.rb +37 -0
  154. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  155. data/test/dummy/config/initializers/inflections.rb +15 -0
  156. data/test/dummy/config/initializers/mime_types.rb +5 -0
  157. data/test/dummy/config/initializers/secret_token.rb +7 -0
  158. data/test/dummy/config/initializers/session_store.rb +8 -0
  159. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  160. data/test/dummy/config/locales/en.yml +5 -0
  161. data/test/dummy/config/routes.rb +4 -0
  162. data/test/dummy/config.ru +4 -0
  163. data/test/dummy/db/test.sqlite3 +0 -0
  164. data/test/dummy/log/test.log +25 -0
  165. data/test/dummy/public/404.html +26 -0
  166. data/test/dummy/public/422.html +26 -0
  167. data/test/dummy/public/500.html +25 -0
  168. data/test/dummy/public/favicon.ico +0 -0
  169. data/test/dummy/script/rails +6 -0
  170. data/test/integration/navigation_test.rb +10 -0
  171. data/test/test_helper.rb +15 -0
  172. metadata +260 -0
@@ -0,0 +1,59 @@
1
+ module CabooseStore
2
+ class CartController < ApplicationController
3
+
4
+ # GET /cart
5
+ def index
6
+ @order = self.get_cart
7
+ render :layout => 'layouts/caboose/modal'
8
+ end
9
+
10
+ # GET /cart/add/:id
11
+ def add
12
+ v = Variant.find(params[:id])
13
+ @order = self.get_cart
14
+
15
+ exists = false
16
+ @order.line_items.each do |li|
17
+ next if li.variant.id != v.id
18
+ li.quantity = li.quantity + 1
19
+ li.save
20
+ exists = true
21
+ break
22
+ end
23
+ if !exists
24
+ li = OrderLineItem.new
25
+ li.variant = v
26
+ li.quantity = 1
27
+ li.unit_price = v.price
28
+ li.variant_sku = v.sku
29
+ @order.line_items << li
30
+ end
31
+ @order.save
32
+
33
+ render 'caboose_store/cart/index', :layout => 'layouts/caboose/modal'
34
+ end
35
+
36
+ # PUT /cart/:id
37
+ def update
38
+ resp = Caboose::StdClass.new
39
+
40
+ order_id = session['cart_id']
41
+ variant_id = params[:id].to_i
42
+ qty = params[:quantity_in_stock].to_i
43
+
44
+ if (qty == 0)
45
+ OrderLineItem.where(:order_id => order_id, :variant_id => variant_id).delete_all
46
+ else
47
+ li = OrderLineItem.where(:order_id => order_id, :variant_id => variant_id).first
48
+ li.quantity = qty
49
+ li.save
50
+ end
51
+ render :json => resp
52
+ end
53
+
54
+ def get_cart
55
+ # Assumes the init_cart method is running in the parent application controller
56
+ return Order.find(session['cart_id'])
57
+ end
58
+ end
59
+ end
@@ -0,0 +1,128 @@
1
+ module CabooseStore
2
+ class CategoriesController < ApplicationController
3
+
4
+ #=============================================================================
5
+ # Admin actions
6
+ #=============================================================================
7
+
8
+ # GET /admin/categories
9
+ def admin_index
10
+ return if !user_is_allowed('categories', 'view')
11
+ @top_category = Category.find(1)
12
+ render :layout => 'caboose/admin'
13
+ end
14
+
15
+ # GET /admin/categories/:id/edit
16
+ def admin_edit
17
+ return if !user_is_allowed('categories', 'edit')
18
+ @category = Category.find(params[:id])
19
+ render :layout => 'caboose/admin'
20
+ end
21
+
22
+ # PUT /admin/categories/:id
23
+ def admin_update
24
+ return if !user_is_allowed('categories', 'edit')
25
+
26
+ resp = Caboose::StdClass.new({'attributes' => {}})
27
+ cat = Category.find(params[:id])
28
+
29
+ save = true
30
+ params.each do |name,value|
31
+ case name
32
+ when 'name'
33
+ cat.name = value
34
+ when 'slug'
35
+ cat.slug = value
36
+ cat.url = cat.parent ? "#{cat.parent.url}/#{cat.slug}" : "/#{cat.slug}"
37
+ update_child_category_slugs(cat)
38
+ when 'square_offset_x'
39
+ cat.square_offset_x = value
40
+ when 'square_offset_y'
41
+ cat.square_offset_y = value
42
+ when 'square_scale_factor'
43
+ cat.square_scale_factor = value
44
+ when 'image'
45
+ cat.image = value
46
+ end
47
+ end
48
+ resp.success = save && cat.save
49
+ if params[:image]
50
+ resp.attributes['image'] = { 'value' => cat.image.url(:medium) }
51
+ end
52
+ render json: resp
53
+ end
54
+
55
+ def update_child_category_slugs(cat)
56
+ return if cat.children.nil?
57
+ return if cat.children.count == 0
58
+ cat.children.each do |kid|
59
+ kid.url = "#{cat.url}/#{kid.slug}"
60
+ kid.save
61
+ update_child_category_slugs(kid)
62
+ end
63
+ end
64
+
65
+ # GET /admin/categories/new
66
+ def admin_new
67
+ return if !user_is_allowed('categories', 'add')
68
+ @top_category = Category.find(1)
69
+ render :layout => 'caboose/admin'
70
+ end
71
+
72
+ # POST /admin/categories
73
+ def admin_add
74
+ return if !user_is_allowed('categories', 'add')
75
+
76
+ resp = Caboose::StdClass.new(
77
+ :error => nil,
78
+ :redirect => nil
79
+ )
80
+ parent_id = params[:parent_id]
81
+ name = params[:name]
82
+
83
+ if parent_id == ''
84
+ resp.error = "Please select a parent category."
85
+ elsif name.length == 0
86
+ resp.error = "The title cannot be empty."
87
+ else
88
+ cat = Category.new
89
+ cat.parent_id = parent_id
90
+ cat.name = name
91
+ cat.slug = Category.get_slug(cat.name)
92
+ cat.save
93
+ cat.url = cat.parent ? "#{cat.parent.url}/#{cat.slug}" : "/#{cat.slug}"
94
+ cat.save
95
+ resp.redirect = "/admin/categories/#{cat.id}/edit"
96
+ end
97
+ render :json => resp
98
+ end
99
+
100
+ # DELETE /admin/categories/:id
101
+ def admin_delete
102
+ return if !user_is_allowed('categories', 'delete')
103
+
104
+ resp = Caboose::StdClass.new(
105
+ :error => nil,
106
+ :redirect => nil
107
+ )
108
+
109
+ cat = Category.find(params[:id])
110
+ if cat.products && cat.products.count > 0
111
+ resp.error = "You can't delete a category that has products in it."
112
+ elsif cat.children && cat.children.count > 0
113
+ resp.error = "You can't delete a category that has child categories."
114
+ else
115
+ cat.destroy
116
+ resp.redirect = '/admin/categories'
117
+ end
118
+
119
+ render :json => resp
120
+ end
121
+
122
+ # GET /admin/categories/options
123
+ def admin_options
124
+ return if !user_is_allowed('categories', 'view')
125
+ render :json => Category.options
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,164 @@
1
+ module CabooseStore
2
+ class CheckoutController < ApplicationController
3
+
4
+ helper :authorize_net
5
+ protect_from_forgery :except => :authnet_relay_response
6
+
7
+ # GET /checkout
8
+ def index
9
+ @order = Order.find(session['cart_id'])
10
+ @is_logged_in = logged_in?
11
+ if @is_logged_in
12
+ @order.customer_id = logged_in_user.id
13
+ @order.save
14
+ end
15
+ end
16
+
17
+ # GET /checkout/shipping-address
18
+ def shipping_address
19
+ @order = Order.find(session['cart_id'])
20
+ end
21
+
22
+ # PUT /checkout/shipping-address
23
+ def update_shipping_address
24
+ resp = Caboose::StdClass.new
25
+
26
+ order = Order.find(session['cart_id'])
27
+ a = order.shipping_address ? order.shipping_address : Address.new
28
+ a.name = params[:name]
29
+ a.company = params[:company]
30
+ a.address1 = params[:address1]
31
+ a.address2 = params[:address2]
32
+ a.city = params[:city]
33
+ a.state = params[:state]
34
+ a.zip = params[:zip]
35
+
36
+ if (a.name.strip.length == 0)
37
+ resp.error = "A name is required."
38
+ elsif (a.address1.strip.length == 0)
39
+ resp.error = "An address is required."
40
+ elsif (a.city.strip.length == 0)
41
+ resp.error = "A city is required."
42
+ elsif (a.state.strip.length == 0)
43
+ resp.error = "A state is required."
44
+ elsif (a.zip.strip.length < 5)
45
+ resp.error = "A valid zip code is required."
46
+ end
47
+
48
+ if (resp.error.nil?)
49
+ a.save
50
+ tax_rate = TaxCalculator.tax_rate(a)
51
+ order.tax = order.subtotal * tax_rate
52
+ order.shipping_address_id = a.id
53
+ order.calculate_total
54
+ order.save
55
+ resp.redirect = '/checkout/shipping'
56
+ end
57
+ render :json => resp
58
+ end
59
+
60
+ # GET /checkout/shipping
61
+ def shipping
62
+ @order = Order.find(session['cart_id'])
63
+ end
64
+
65
+ # GET /checkout/shipping-rates
66
+ def shipping_rates
67
+ order = Order.find(session['cart_id'])
68
+ render :json => ShippingCalculator.rates(order)
69
+ end
70
+
71
+ # PUT /checkout/shipping-method
72
+ def update_shipping_method
73
+ resp = Caboose::StdClass.new
74
+ order = Order.find(session['cart_id'])
75
+
76
+ code = params[:shipping_method_code]
77
+ if code.nil? || code.strip.length == 0
78
+ resp.error = "You must select a shipping method."
79
+ else
80
+ order.shipping = params[:shipping].to_f/100
81
+ order.shipping_method = params[:shipping_method]
82
+ order.shipping_method_code = params[:shipping_method_code]
83
+ order.handling = order.shipping * 0.05
84
+ order.calculate_total
85
+ order.save
86
+ resp.redirect = '/checkout/billing'
87
+ end
88
+ render :json => resp
89
+ end
90
+
91
+ # GET /checkout/billing
92
+ def billing
93
+ @order = Order.find(session['cart_id'])
94
+ @logged_in_user = logged_in_user
95
+ @sim_transaction = AuthorizeNet::SIM::Transaction.new(
96
+ AUTHORIZE_NET_CONFIG['api_login_id'],
97
+ AUTHORIZE_NET_CONFIG['api_transaction_key'],
98
+ @order.total,
99
+ :relay_url => 'https://www.tuskwearcollection.com/checkout/authnet-relay-response',
100
+ :transaction_type => 'AUTH_ONLY' #AuthorizeNet::Type::AUTHORIZE_ONLY
101
+ )
102
+ end
103
+
104
+ # POST /checkout/authnet-relay-response
105
+ def authnet_relay_response
106
+ sim_response = AuthorizeNet::SIM::Response.new(params)
107
+ if sim_response.success?(AUTHORIZE_NET_CONFIG['api_login_id'], AUTHORIZE_NET_CONFIG['merchant_hash_value'])
108
+ if (params[:x_response_code].to_i == 1) # Approved
109
+ order = Order.find(params[:x_invoice_num])
110
+ order.date_authorized = DateTime.now
111
+ order.transaction_id = params[:x_trans_id]
112
+ order.auth_code = params[:x_auth_code]
113
+ order.auth_amount = order.total
114
+ order.financial_status = 'authorized'
115
+ order.status = 'pending'
116
+ order.save
117
+ end
118
+ end
119
+ render :text => sim_response.direct_post_reply('https://www.tuskwearcollection.com/checkout/authnet-receipt', :include => true)
120
+ end
121
+
122
+ # GET /checkout/authnet-receipt
123
+ def authnet_receipt
124
+ js = ""
125
+ if (params[:x_response_code].to_i == 1) # Approved
126
+ js = "parent.window.location = '/checkout/finalize';"
127
+ else
128
+ msg = "<p class='note error'>There was an error processing your card:<br /><br />#{params[:x_response_reason_text]}</p>"
129
+ msg = msg.gsub('"', '')
130
+ js = "parent.$('#message').html(\"#{msg}\");"
131
+ end
132
+ render :text => "<script type='text/javascript'>#{js}</script>"
133
+ end
134
+
135
+ # GET /checkout/finalize
136
+ def finalize
137
+ order = Order.find(session['cart_id'])
138
+
139
+ # Make sure they didn't come to the page twice
140
+ if order.line_items.count == 0
141
+ redirect_to "/"
142
+ return
143
+ end
144
+
145
+ # Notify the customer
146
+ OrdersMailer.customer_new_order(order).deliver
147
+
148
+ # Notify the fulfillment center
149
+ OrdersMailer.fulfillment_new_order(order).deliver
150
+
151
+ # Add the order to quickbooks
152
+ #Quickbooks.create_order(order)
153
+
154
+ # Clear everything
155
+ session['cart_id'] = nil
156
+
157
+ redirect_to '/checkout/thank-you'
158
+ end
159
+
160
+ def thank_you
161
+ end
162
+
163
+ end
164
+ end
@@ -0,0 +1,264 @@
1
+ module CabooseStore
2
+ class OrdersController < ApplicationController
3
+
4
+ helper :authorize_net
5
+ protect_from_forgery :except => :authnet_relay_response
6
+
7
+ # GET /admin/orders
8
+ def admin_index
9
+ return if !user_is_allowed('orders', 'view')
10
+
11
+ @gen = Caboose::PageBarGenerator.new(params, {
12
+ 'customer_id' => '',
13
+ 'status' => 'pending',
14
+ 'shipping_method_code' => '',
15
+ 'id' => ''
16
+ },{
17
+ 'model' => 'CabooseStore::Order',
18
+ 'sort' => 'id',
19
+ 'desc' => 1,
20
+ 'base_url' => '/admin/orders'
21
+ })
22
+ @orders = @gen.items
23
+ @customers = Caboose::User.reorder('last_name, first_name').all
24
+ render :layout => 'caboose/admin'
25
+ end
26
+
27
+ # GET /admin/orders/new
28
+ def admin_new
29
+ return if !user_is_allowed('orders', 'add')
30
+ @products = Product.reorder('title').all
31
+ render :layout => 'caboose/admin'
32
+ end
33
+
34
+ # GET /admin/orders/:id
35
+ def admin_edit
36
+ return if !user_is_allowed('orders', 'edit')
37
+ @order = Order.find(params[:id])
38
+ render :layout => 'caboose/admin'
39
+ end
40
+
41
+ # GET /admin/orders/:id/json
42
+ def admin_json
43
+ return if !user_is_allowed('orders', 'edit')
44
+ order = Order.find(params[:id])
45
+ render :json => order, :include => { :order_line_items => { :include => :variant }}
46
+ end
47
+
48
+ # GET /admin/orders/:id/print
49
+ def admin_print
50
+ return if !user_is_allowed('orders', 'edit')
51
+
52
+ pdf = OrderPdf.new
53
+ pdf.order = Order.find(params[:id])
54
+ send_data pdf.to_pdf, filename: "order_#{pdf.order.id}.pdf", type: "application/pdf", disposition: "inline"
55
+
56
+ #@order = Order.find(params[:id])
57
+ #render :layout => 'caboose/admin'
58
+ end
59
+
60
+ # PUT /admin/orders/:id
61
+ def admin_update
62
+ return if !user_is_allowed('orders', 'edit')
63
+
64
+ resp = Caboose::StdClass.new({'attributes' => {}})
65
+ order = Order.find(params[:id])
66
+
67
+ save = true
68
+ params.each do |name,value|
69
+ case name
70
+ when 'tax'
71
+ order.tax = value
72
+ when 'shipping'
73
+ order.shipping = value
74
+ when 'handling'
75
+ order.handling = value
76
+ when 'discount'
77
+ order.discount = value
78
+ when 'status'
79
+ order.status = value
80
+ resp.attributes['status'] = {'text' => value}
81
+ end
82
+ end
83
+ order.calculate_total
84
+ resp.success = save && order.save
85
+ render :json => resp
86
+ end
87
+
88
+ # PUT /admin/orders/:order_id/line-items/:id
89
+ def admin_update_line_item
90
+ return if !user_is_allowed('orders', 'edit')
91
+
92
+ resp = Caboose::StdClass.new({'attributes' => {}})
93
+ li = OrderLineItem.find(params[:id])
94
+
95
+ save = true
96
+ send_status_email = false
97
+ params.each do |name,value|
98
+ case name
99
+ when 'quantity'
100
+ li.quantity = value
101
+ li.save
102
+
103
+ # Recalculate everything
104
+ r = ShippingCalculator.rate(li.order, li.order.shipping_method_code)
105
+ li.order.shipping = r['negotiated_rate'] / 100
106
+ li.order.handling = (r['negotiated_rate'] / 100) * 0.05
107
+ tax_rate = TaxCalculator.tax_rate(li.order.shipping_address)
108
+ li.order.tax = li.order.subtotal * tax_rate
109
+ li.order.calculate_total
110
+ li.order.save
111
+
112
+ when 'tracking_number'
113
+ li.tracking_number = value
114
+ send_status_email = true
115
+ when 'status'
116
+ li.status = value
117
+ resp.attributes['status'] = {'text' => value}
118
+ send_status_email = true
119
+ end
120
+ end
121
+ if send_status_email
122
+ OrdersMailer.customer_status_updated(li.order).deliver
123
+ end
124
+ resp.success = save && li.save
125
+ render :json => resp
126
+ end
127
+
128
+ # DELETE /admin/orders/:id
129
+ def admin_delete
130
+ return if !user_is_allowed('orders', 'delete')
131
+ Order.find(params[:id]).destroy
132
+ render :json => Caboose::StdClass.new({
133
+ :redirect => '/admin/orders'
134
+ })
135
+ end
136
+
137
+ # GET /admin/orders/line-item-status-options
138
+ def admin_line_item_status_options
139
+ arr = ['pending', 'ready to ship', 'shipped', 'backordered', 'canceled']
140
+ options = []
141
+ arr.each do |status|
142
+ options << {
143
+ :value => status,
144
+ :text => status
145
+ }
146
+ end
147
+ render :json => options
148
+ end
149
+
150
+ # GET /admin/orders/:id/capture
151
+ def capture_funds
152
+ return if !user_is_allowed('orders', 'edit')
153
+
154
+ resp = Caboose::StdClass.new({
155
+ 'refresh' => nil,
156
+ 'error' => nil,
157
+ 'success' => nil
158
+ })
159
+
160
+ order = Order.find(params[:id])
161
+ if order.financial_status == 'captured'
162
+ resp.error = "Funds for this order have already been captured."
163
+ elsif order.total > order.auth_amount
164
+ resp.error = "The order total exceeds the authorized amount."
165
+ else
166
+ trans = AuthorizeNet::AIM::Transaction.new(
167
+ AUTHORIZE_NET_CONFIG['api_login_id'],
168
+ AUTHORIZE_NET_CONFIG['api_transaction_key'],
169
+ :gateway => :production
170
+ #:test => true
171
+ )
172
+ amount = order.total < order.auth_amount ? order.total : nil
173
+ r = trans.prior_auth_capture(order.transaction_id, amount)
174
+ Caboose.log(r.inspect)
175
+ if r.success?
176
+ order.financial_status = 'captured'
177
+ order.save
178
+ resp.success = "Captured funds successfully."
179
+ else
180
+ if r.connection_failure?
181
+ resp.error = "Error connecting to authorize.net."
182
+ else
183
+ resp.error = "Error capture funds."
184
+ end
185
+ end
186
+ end
187
+ render :json => resp
188
+ end
189
+
190
+ # GET /admin/orders/:id/send-to-quickbooks
191
+ def admin_send_to_quickbooks
192
+ return if !user_is_allowed('orders', 'edit')
193
+
194
+ resp = Caboose::StdClass.new({
195
+ 'refresh' => nil,
196
+ 'success' => nil,
197
+ 'error' => nil
198
+ })
199
+ order = Order.find(params[:id])
200
+ Quickbooks.create_order(order)
201
+ resp.success = "Order sent to quickbooks successfully."
202
+ render :json => resp
203
+ end
204
+
205
+ # GET /admin/orders/status-options
206
+ def admin_status_options
207
+ return if !user_is_allowed('categories', 'view')
208
+ statuses = ['cart', 'pending', 'ready to ship', 'shipped', 'canceled']
209
+ options = []
210
+ statuses.each do |s|
211
+ options << {
212
+ 'text' => s,
213
+ 'value' => s
214
+ }
215
+ end
216
+ render :json => options
217
+ end
218
+
219
+ # GET /admin/orders/authnet-relay-response
220
+ # POST /admin/orders/authnet-relay-response
221
+ #def authnet_relay_response
222
+ # sim_response = AuthorizeNet::SIM::Response.new(params)
223
+ # if sim_response.success?(AUTHORIZE_NET_CONFIG['api_login_id'], AUTHORIZE_NET_CONFIG['merchant_hash_value'])
224
+ # if (params[:x_response_code].to_i == 1) # Approved
225
+ # order = Order.find(params[:x_invoice_num])
226
+ # order.date_captured = DateTime.now
227
+ # order.financial_status = 'captured'
228
+ # order.save
229
+ # end
230
+ # end
231
+ # render :text => sim_response.direct_post_reply('https://tuskwearadmin.herokuapp.com/admin/orders/authnet-receipt', :include => true)
232
+ #end
233
+
234
+ # GET /admin/orders/authnet-receipt
235
+ #def authnet_receipt
236
+ # return if !user_is_allowed('orders', 'edit')
237
+ #
238
+ # resp = Caboose::StdClass.new({
239
+ # 'refresh' => nil,
240
+ # 'error' => nil
241
+ # })
242
+ #
243
+ # if (params[:x_response_code].to_i == 1) # Approved
244
+ # resp.refresh = true
245
+ # else
246
+ # resp.error = "There was an error capture funds:<br /><br />#{params[:x_response_reason_text]}"
247
+ # end
248
+ # render :text => "<script type='text/javascript'>parent.capture_funds_response(#{resp.to_json});</script>"
249
+ #end
250
+
251
+ # GET /admin/orders/test-info
252
+ def admin_mail_test_info
253
+ TestMailer.test_info.deliver
254
+ render :text => "Sent email to info@tuskwearcollection.com on #{DateTime.now.strftime("%F %T")}"
255
+ end
256
+
257
+ # GET /admin/orders/test-gmail
258
+ def admin_mail_test_gmail
259
+ TestMailer.test_gmail.deliver
260
+ render :text => "Sent email to william@nine.is on #{DateTime.now.strftime("%F %T")}"
261
+ end
262
+
263
+ end
264
+ end
@@ -0,0 +1,38 @@
1
+ module CabooseStore
2
+ class ProductImagesController < ApplicationController
3
+
4
+ #=============================================================================
5
+ # Admin actions
6
+ #=============================================================================
7
+
8
+ # GET /admin/product-images/:id/variant-ids
9
+ def admin_variant_ids
10
+ return if !user_is_allowed('variants', 'edit')
11
+ img = ProductImage.find(params[:id])
12
+ ids = img.variants.collect{ |v| v.id }
13
+ render :json => ids
14
+ end
15
+
16
+ # GET /admin/product-images/:id/variants
17
+ def admin_variants
18
+ return if !user_is_allowed('variants', 'edit')
19
+ img = ProductImage.find(params[:id])
20
+ render :json => img.variants
21
+ end
22
+
23
+ # DELETE /admin/product-images/:id
24
+ def admin_delete
25
+ return if !user_is_allowed('variants', 'delete')
26
+ img = ProductImage.find(params[:id]).destroy
27
+ render :json => true
28
+ end
29
+
30
+ # GET /variant-images/:id
31
+ def variant_images
32
+ var = Variant.find(params[:id])
33
+ img = var.product_images.first
34
+ render :json => img
35
+ end
36
+
37
+ end
38
+ end