kylekthompson-shoppe 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (239) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +55 -0
  4. data/Rakefile +36 -0
  5. data/app/assets/images/shoppe/chosen-sprite.png +0 -0
  6. data/app/assets/images/shoppe/chosen-sprite@2x.png +0 -0
  7. data/app/assets/images/shoppe/document.svg +1 -0
  8. data/app/assets/images/shoppe/icons/bag.svg +1 -0
  9. data/app/assets/images/shoppe/icons/balance.svg +1 -0
  10. data/app/assets/images/shoppe/icons/box.svg +1 -0
  11. data/app/assets/images/shoppe/icons/building.svg +1 -0
  12. data/app/assets/images/shoppe/icons/chart.svg +1 -0
  13. data/app/assets/images/shoppe/icons/chat.svg +1 -0
  14. data/app/assets/images/shoppe/icons/checkbox.svg +1 -0
  15. data/app/assets/images/shoppe/icons/checkbox2.svg +1 -0
  16. data/app/assets/images/shoppe/icons/cloud.svg +1 -0
  17. data/app/assets/images/shoppe/icons/cone.svg +1 -0
  18. data/app/assets/images/shoppe/icons/credit_card.svg +1 -0
  19. data/app/assets/images/shoppe/icons/currency.svg +1 -0
  20. data/app/assets/images/shoppe/icons/edit.svg +14 -0
  21. data/app/assets/images/shoppe/icons/flowchart.svg +1 -0
  22. data/app/assets/images/shoppe/icons/gift.svg +1 -0
  23. data/app/assets/images/shoppe/icons/globe.svg +1 -0
  24. data/app/assets/images/shoppe/icons/id.svg +1 -0
  25. data/app/assets/images/shoppe/icons/id2.svg +1 -0
  26. data/app/assets/images/shoppe/icons/locked.svg +1 -0
  27. data/app/assets/images/shoppe/icons/report.svg +1 -0
  28. data/app/assets/images/shoppe/icons/search.svg +1 -0
  29. data/app/assets/images/shoppe/icons/support.svg +1 -0
  30. data/app/assets/images/shoppe/icons/tags.svg +1 -0
  31. data/app/assets/images/shoppe/icons/toolbox.svg +1 -0
  32. data/app/assets/images/shoppe/icons/unlocked.svg +1 -0
  33. data/app/assets/images/shoppe/icons/wallet.svg +1 -0
  34. data/app/assets/images/shoppe/logo.svg +47 -0
  35. data/app/assets/images/shoppe/move.svg +1 -0
  36. data/app/assets/images/shoppe/shoppe.svg +25 -0
  37. data/app/assets/images/shoppe/square.svg +9 -0
  38. data/app/assets/images/shoppe/statuses/accepted.svg +14 -0
  39. data/app/assets/images/shoppe/statuses/paid.svg +16 -0
  40. data/app/assets/images/shoppe/statuses/received.svg +15 -0
  41. data/app/assets/images/shoppe/statuses/rejected.svg +14 -0
  42. data/app/assets/images/shoppe/statuses/shipped.svg +14 -0
  43. data/app/assets/images/shoppe/table-tear-off.png +0 -0
  44. data/app/assets/javascripts/shoppe/application.coffee +123 -0
  45. data/app/assets/javascripts/shoppe/chosen.jquery.js +1166 -0
  46. data/app/assets/javascripts/shoppe/jquery_ui.js +6 -0
  47. data/app/assets/javascripts/shoppe/mousetrap.js +9 -0
  48. data/app/assets/javascripts/shoppe/order_form.coffee +47 -0
  49. data/app/assets/stylesheets/shoppe/application.scss +601 -0
  50. data/app/assets/stylesheets/shoppe/chosen.scss +424 -0
  51. data/app/assets/stylesheets/shoppe/dialog.scss +25 -0
  52. data/app/assets/stylesheets/shoppe/elements.scss +79 -0
  53. data/app/assets/stylesheets/shoppe/printable.scss +67 -0
  54. data/app/assets/stylesheets/shoppe/reset.scss +93 -0
  55. data/app/assets/stylesheets/shoppe/sub.scss +106 -0
  56. data/app/assets/stylesheets/shoppe/variables.scss +1 -0
  57. data/app/controllers/shoppe/addresses_controller.rb +47 -0
  58. data/app/controllers/shoppe/application_controller.rb +46 -0
  59. data/app/controllers/shoppe/attachments_controller.rb +14 -0
  60. data/app/controllers/shoppe/countries_controller.rb +47 -0
  61. data/app/controllers/shoppe/customers_controller.rb +55 -0
  62. data/app/controllers/shoppe/dashboard_controller.rb +9 -0
  63. data/app/controllers/shoppe/delivery_service_prices_controller.rb +45 -0
  64. data/app/controllers/shoppe/delivery_services_controller.rb +47 -0
  65. data/app/controllers/shoppe/orders_controller.rb +119 -0
  66. data/app/controllers/shoppe/payments_controller.rb +33 -0
  67. data/app/controllers/shoppe/product_categories_controller.rb +47 -0
  68. data/app/controllers/shoppe/product_category_localisations_controller.rb +58 -0
  69. data/app/controllers/shoppe/product_localisations_controller.rb +58 -0
  70. data/app/controllers/shoppe/products_controller.rb +58 -0
  71. data/app/controllers/shoppe/sessions_controller.rb +34 -0
  72. data/app/controllers/shoppe/settings_controller.rb +16 -0
  73. data/app/controllers/shoppe/stock_level_adjustments_controller.rb +40 -0
  74. data/app/controllers/shoppe/tax_rates_controller.rb +49 -0
  75. data/app/controllers/shoppe/users_controller.rb +53 -0
  76. data/app/controllers/shoppe/variants_controller.rb +50 -0
  77. data/app/helpers/shoppe/application_helper.rb +60 -0
  78. data/app/helpers/shoppe/product_category_helper.rb +36 -0
  79. data/app/mailers/shoppe/order_mailer.rb +25 -0
  80. data/app/mailers/shoppe/user_mailer.rb +10 -0
  81. data/app/models/shoppe/address.rb +44 -0
  82. data/app/models/shoppe/country.rb +27 -0
  83. data/app/models/shoppe/customer.rb +41 -0
  84. data/app/models/shoppe/delivery_service.rb +33 -0
  85. data/app/models/shoppe/delivery_service_price.rb +31 -0
  86. data/app/models/shoppe/order.rb +100 -0
  87. data/app/models/shoppe/order/actions.rb +94 -0
  88. data/app/models/shoppe/order/billing.rb +105 -0
  89. data/app/models/shoppe/order/delivery.rb +229 -0
  90. data/app/models/shoppe/order/states.rb +69 -0
  91. data/app/models/shoppe/order_item.rb +239 -0
  92. data/app/models/shoppe/payment.rb +86 -0
  93. data/app/models/shoppe/product.rb +189 -0
  94. data/app/models/shoppe/product/product_attributes.rb +20 -0
  95. data/app/models/shoppe/product/variants.rb +51 -0
  96. data/app/models/shoppe/product_attribute.rb +66 -0
  97. data/app/models/shoppe/product_categorization.rb +14 -0
  98. data/app/models/shoppe/product_category.rb +75 -0
  99. data/app/models/shoppe/setting.rb +68 -0
  100. data/app/models/shoppe/stock_level_adjustment.rb +19 -0
  101. data/app/models/shoppe/tax_rate.rb +46 -0
  102. data/app/models/shoppe/user.rb +49 -0
  103. data/app/validators/permalink_validator.rb +7 -0
  104. data/app/views/layouts/shoppe/application.html.haml +34 -0
  105. data/app/views/layouts/shoppe/printable.html.haml +11 -0
  106. data/app/views/layouts/shoppe/sub.html.haml +10 -0
  107. data/app/views/shoppe/addresses/_form.html.haml +33 -0
  108. data/app/views/shoppe/addresses/edit.html.haml +5 -0
  109. data/app/views/shoppe/addresses/new.html.haml +5 -0
  110. data/app/views/shoppe/countries/_form.html.haml +35 -0
  111. data/app/views/shoppe/countries/edit.html.haml +6 -0
  112. data/app/views/shoppe/countries/index.html.haml +25 -0
  113. data/app/views/shoppe/countries/new.html.haml +7 -0
  114. data/app/views/shoppe/customers/_addresses.html.haml +20 -0
  115. data/app/views/shoppe/customers/_form.html.haml +30 -0
  116. data/app/views/shoppe/customers/_search_form.html.haml +13 -0
  117. data/app/views/shoppe/customers/edit.html.haml +5 -0
  118. data/app/views/shoppe/customers/index.html.haml +32 -0
  119. data/app/views/shoppe/customers/new.html.haml +5 -0
  120. data/app/views/shoppe/customers/show.html.haml +53 -0
  121. data/app/views/shoppe/delivery_service_prices/_form.html.haml +44 -0
  122. data/app/views/shoppe/delivery_service_prices/edit.html.haml +6 -0
  123. data/app/views/shoppe/delivery_service_prices/index.html.haml +23 -0
  124. data/app/views/shoppe/delivery_service_prices/new.html.haml +6 -0
  125. data/app/views/shoppe/delivery_services/_form.html.haml +38 -0
  126. data/app/views/shoppe/delivery_services/edit.html.haml +9 -0
  127. data/app/views/shoppe/delivery_services/index.html.haml +27 -0
  128. data/app/views/shoppe/delivery_services/new.html.haml +6 -0
  129. data/app/views/shoppe/order_mailer/accepted.text.erb +12 -0
  130. data/app/views/shoppe/order_mailer/received.text.erb +9 -0
  131. data/app/views/shoppe/order_mailer/rejected.text.erb +10 -0
  132. data/app/views/shoppe/order_mailer/shipped.text.erb +16 -0
  133. data/app/views/shoppe/orders/_form.html.haml +58 -0
  134. data/app/views/shoppe/orders/_order_details.html.haml +57 -0
  135. data/app/views/shoppe/orders/_order_items.html.haml +38 -0
  136. data/app/views/shoppe/orders/_order_items_form.html.haml +61 -0
  137. data/app/views/shoppe/orders/_payments_form.html.haml +15 -0
  138. data/app/views/shoppe/orders/_payments_table.html.haml +37 -0
  139. data/app/views/shoppe/orders/_search_form.html.haml +24 -0
  140. data/app/views/shoppe/orders/_status_bar.html.haml +35 -0
  141. data/app/views/shoppe/orders/despatch_note.html.haml +45 -0
  142. data/app/views/shoppe/orders/edit.html.haml +21 -0
  143. data/app/views/shoppe/orders/index.html.haml +39 -0
  144. data/app/views/shoppe/orders/new.html.haml +14 -0
  145. data/app/views/shoppe/orders/show.html.haml +25 -0
  146. data/app/views/shoppe/payments/refund.html.haml +13 -0
  147. data/app/views/shoppe/product_categories/_form.html.haml +50 -0
  148. data/app/views/shoppe/product_categories/edit.html.haml +8 -0
  149. data/app/views/shoppe/product_categories/index.html.haml +27 -0
  150. data/app/views/shoppe/product_categories/new.html.haml +6 -0
  151. data/app/views/shoppe/product_category_localisations/form.html.haml +29 -0
  152. data/app/views/shoppe/product_category_localisations/index.html.haml +26 -0
  153. data/app/views/shoppe/product_localisations/form.html.haml +32 -0
  154. data/app/views/shoppe/product_localisations/index.html.haml +26 -0
  155. data/app/views/shoppe/products/_form.html.haml +118 -0
  156. data/app/views/shoppe/products/_table.html.haml +42 -0
  157. data/app/views/shoppe/products/edit.html.haml +9 -0
  158. data/app/views/shoppe/products/import.html.haml +67 -0
  159. data/app/views/shoppe/products/index.html.haml +9 -0
  160. data/app/views/shoppe/products/new.html.haml +7 -0
  161. data/app/views/shoppe/sessions/new.html.haml +12 -0
  162. data/app/views/shoppe/sessions/reset.html.haml +12 -0
  163. data/app/views/shoppe/settings/edit.html.haml +19 -0
  164. data/app/views/shoppe/shared/error.html.haml +6 -0
  165. data/app/views/shoppe/stock_level_adjustments/index.html.haml +40 -0
  166. data/app/views/shoppe/tax_rates/form.html.haml +28 -0
  167. data/app/views/shoppe/tax_rates/index.html.haml +17 -0
  168. data/app/views/shoppe/user_mailer/new_password.text.erb +9 -0
  169. data/app/views/shoppe/users/_form.html.haml +27 -0
  170. data/app/views/shoppe/users/edit.html.haml +5 -0
  171. data/app/views/shoppe/users/index.html.haml +17 -0
  172. data/app/views/shoppe/users/new.html.haml +7 -0
  173. data/app/views/shoppe/variants/form.html.haml +68 -0
  174. data/app/views/shoppe/variants/index.html.haml +33 -0
  175. data/config/locales/de.yml +653 -0
  176. data/config/locales/en.yml +744 -0
  177. data/config/locales/es.yml +653 -0
  178. data/config/locales/pl.yml +662 -0
  179. data/config/locales/pt-BR.yml +655 -0
  180. data/config/routes.rb +53 -0
  181. data/db/countries.txt +252 -0
  182. data/db/migrate/20130926094549_create_shoppe_initial_schema.rb +175 -0
  183. data/db/migrate/20131024201501_add_address_type_to_shoppe_tax_rates.rb +5 -0
  184. data/db/migrate/20131024204815_create_shoppe_payments.rb +32 -0
  185. data/db/migrate/20131102143930_remove_default_on_order_item_weight.rb +9 -0
  186. data/db/migrate/20141013192427_create_shoppe_customers.rb +14 -0
  187. data/db/migrate/20141026175622_add_indexes_to_shoppe_order_items.rb +6 -0
  188. data/db/migrate/20141026175943_add_indexes_to_shoppe_orders.rb +7 -0
  189. data/db/migrate/20141026180333_add_indexes_to_shoppe_payments.rb +6 -0
  190. data/db/migrate/20141026180835_add_indexes_to_shoppe_product_attributes.rb +7 -0
  191. data/db/migrate/20141026180952_add_indexes_to_shoppe_product_categories.rb +5 -0
  192. data/db/migrate/20141026181040_add_indexes_to_shoppe_products.rb +8 -0
  193. data/db/migrate/20141026181312_add_indexes_to_shoppe_settings.rb +5 -0
  194. data/db/migrate/20141026181354_add_indexes_to_shoppe_stock_level_adjustments.rb +6 -0
  195. data/db/migrate/20141026181559_add_indexes_to_shoppe_users.rb +5 -0
  196. data/db/migrate/20141026181716_add_indexes_to_shoppe_delivery_services.rb +9 -0
  197. data/db/migrate/20141026181717_allow_multiple_shoppe_products_per_shoppe_product_category.rb +46 -0
  198. data/db/migrate/20141026181718_add_nested_to_product_categories.rb +30 -0
  199. data/db/migrate/20141027215005_create_shoppe_addresses.rb +17 -0
  200. data/db/migrate/20150315215633_add_customer_to_shoppe_orders.rb +5 -0
  201. data/db/migrate/20150513171350_create_shoppe_product_category_translation_table.rb +17 -0
  202. data/db/migrate/20150519173350_create_shoppe_product_translation_table.rb +18 -0
  203. data/db/schema.rb +308 -0
  204. data/db/seeds.rb +137 -0
  205. data/db/seeds_data/poe400.jpg +0 -0
  206. data/db/seeds_data/snom-870-blk.jpg +0 -0
  207. data/db/seeds_data/snom-870-grey.jpg +0 -0
  208. data/db/seeds_data/snom-mm2.jpg +0 -0
  209. data/db/seeds_data/spa303.jpg +0 -0
  210. data/db/seeds_data/t18p.jpg +0 -0
  211. data/db/seeds_data/t20p.jpg +0 -0
  212. data/db/seeds_data/t22p.jpg +0 -0
  213. data/db/seeds_data/t26p.jpg +0 -0
  214. data/db/seeds_data/t41pn.jpg +0 -0
  215. data/db/seeds_data/t46gn.jpg +0 -0
  216. data/db/seeds_data/w52p.jpg +0 -0
  217. data/db/seeds_data/yhs32.jpg +0 -0
  218. data/lib/shoppe.rb +60 -0
  219. data/lib/shoppe/associated_countries.rb +20 -0
  220. data/lib/shoppe/country_importer.rb +15 -0
  221. data/lib/shoppe/default_navigation.rb +21 -0
  222. data/lib/shoppe/engine.rb +55 -0
  223. data/lib/shoppe/error.rb +21 -0
  224. data/lib/shoppe/errors/inappropriate_delivery_service.rb +6 -0
  225. data/lib/shoppe/errors/insufficient_stock_to_fulfil.rb +15 -0
  226. data/lib/shoppe/errors/invalid_configuration.rb +6 -0
  227. data/lib/shoppe/errors/not_enough_stock.rb +15 -0
  228. data/lib/shoppe/errors/payment_declined.rb +6 -0
  229. data/lib/shoppe/errors/refund_failed.rb +6 -0
  230. data/lib/shoppe/errors/unorderable_item.rb +6 -0
  231. data/lib/shoppe/navigation_manager.rb +81 -0
  232. data/lib/shoppe/orderable_item.rb +39 -0
  233. data/lib/shoppe/settings.rb +26 -0
  234. data/lib/shoppe/settings_loader.rb +16 -0
  235. data/lib/shoppe/setup_generator.rb +10 -0
  236. data/lib/shoppe/version.rb +3 -0
  237. data/lib/shoppe/view_helpers.rb +16 -0
  238. data/lib/tasks/shoppe.rake +29 -0
  239. metadata +662 -0
@@ -0,0 +1,9 @@
1
+ module Shoppe
2
+ class DashboardController < Shoppe::ApplicationController
3
+
4
+ def home
5
+ redirect_to :orders
6
+ end
7
+
8
+ end
9
+ end
@@ -0,0 +1,45 @@
1
+ module Shoppe
2
+ class DeliveryServicePricesController < Shoppe::ApplicationController
3
+
4
+ before_filter { @active_nav = :delivery_services }
5
+ before_filter { @delivery_service = Shoppe::DeliveryService.find(params[:delivery_service_id])}
6
+ before_filter { params[:id] && @delivery_service_price = @delivery_service.delivery_service_prices.find(params[:id])}
7
+
8
+ def index
9
+ @delivery_service_prices = @delivery_service.delivery_service_prices.ordered
10
+ end
11
+
12
+ def new
13
+ @delivery_service_price = @delivery_service.delivery_service_prices.build
14
+ end
15
+
16
+ def create
17
+ @delivery_service_price = @delivery_service.delivery_service_prices.build(safe_params)
18
+ if @delivery_service_price.save
19
+ redirect_to [@delivery_service, :delivery_service_prices], :notice => t('shoppe.delivery_service_prices.create_notice')
20
+ else
21
+ render :action => "new"
22
+ end
23
+ end
24
+
25
+ def update
26
+ if @delivery_service_price.update(safe_params)
27
+ redirect_to [@delivery_service, :delivery_service_prices], :notice => t('shoppe.delivery_service_prices.update_notice')
28
+ else
29
+ render :action => "edit"
30
+ end
31
+ end
32
+
33
+ def destroy
34
+ @delivery_service_price.destroy
35
+ redirect_to [@delivery_service, :delivery_service_prices], :notice => t('shoppe.delivery_service_prices.destroy_notice')
36
+ end
37
+
38
+ private
39
+
40
+ def safe_params
41
+ params[:delivery_service_price].permit(:price, :cost_price, :tax_rate_id, :min_weight, :max_weight, :code, :country_ids => [])
42
+ end
43
+
44
+ end
45
+ end
@@ -0,0 +1,47 @@
1
+ module Shoppe
2
+ class DeliveryServicesController < Shoppe::ApplicationController
3
+
4
+ before_filter { @active_nav = :delivery_services }
5
+ before_filter { params[:id] && @delivery_service = Shoppe::DeliveryService.find(params[:id]) }
6
+
7
+ def index
8
+ @delivery_services = Shoppe::DeliveryService.all
9
+ end
10
+
11
+ def new
12
+ @delivery_service = Shoppe::DeliveryService.new
13
+ end
14
+
15
+ def create
16
+ @delivery_service = Shoppe::DeliveryService.new(safe_params)
17
+ if @delivery_service.save
18
+ redirect_to :delivery_services, :flash => {:notice => t('shoppe.delivery_services.create_notice')}
19
+ else
20
+ render :action => "new"
21
+ end
22
+ end
23
+
24
+ def edit
25
+ end
26
+
27
+ def update
28
+ if @delivery_service.update(safe_params)
29
+ redirect_to [:edit, @delivery_service], :flash => {:notice => t('shoppe.delivery_services.update_notice')}
30
+ else
31
+ render :action => "edit"
32
+ end
33
+ end
34
+
35
+ def destroy
36
+ @delivery_service.destroy
37
+ redirect_to :delivery_services, :flash => {:notice =>t('shoppe.delivery_services.destroy_notice')}
38
+ end
39
+
40
+ private
41
+
42
+ def safe_params
43
+ params[:delivery_service].permit(:name, :code, :active, :default, :courier, :tracking_url)
44
+ end
45
+
46
+ end
47
+ end
@@ -0,0 +1,119 @@
1
+ module Shoppe
2
+ class OrdersController < Shoppe::ApplicationController
3
+
4
+ before_filter { @active_nav = :orders }
5
+ before_filter { params[:id] && @order = Shoppe::Order.find(params[:id])}
6
+
7
+ def index
8
+ @query = Shoppe::Order.ordered.received.includes(:order_items => :ordered_item).page(params[:page]).search(params[:q])
9
+ @orders = @query.result
10
+ end
11
+
12
+ def new
13
+ @order = Shoppe::Order.new
14
+ @order.order_items.build(:ordered_item_type => 'Shoppe::Product')
15
+ end
16
+
17
+ def create
18
+ Shoppe::Order.transaction do
19
+ @order = Shoppe::Order.new(safe_params)
20
+ @order.status = 'confirming'
21
+
22
+ if safe_params[:customer_id]
23
+ @customer = Shoppe::Customer.find safe_params[:customer_id]
24
+ @order.first_name = @customer.first_name
25
+ @order.last_name = @customer.last_name
26
+ @order.company = @customer.company
27
+ @order.email_address = @customer.email
28
+ @order.phone_number = @customer.phone
29
+ if @customer.addresses.billing.present?
30
+ billing = @customer.addresses.billing.first
31
+ @order.billing_address1 = billing.address1
32
+ @order.billing_address2 = billing.address2
33
+ @order.billing_address3 = billing.address3
34
+ @order.billing_address4 = billing.address4
35
+ @order.billing_postcode = billing.postcode
36
+ @order.billing_country_id = billing.country_id
37
+ end
38
+ if @customer.addresses.delivery.present?
39
+ delivery = @customer.addresses.delivery.first
40
+ @order.delivery_address1 = delivery.address1
41
+ @order.delivery_address2 = delivery.address2
42
+ @order.delivery_address3 = delivery.address3
43
+ @order.delivery_address4 = delivery.address4
44
+ @order.delivery_postcode = delivery.postcode
45
+ @order.delivery_country_id = delivery.country_id
46
+ end
47
+ end
48
+
49
+ if !request.xhr? && @order.save
50
+ @order.confirm!
51
+ redirect_to @order, :notice => t('shoppe.orders.create_notice')
52
+ else
53
+ @order.order_items.build(:ordered_item_type => 'Shoppe::Product')
54
+ render :action => "new"
55
+ end
56
+ end
57
+ rescue Shoppe::Errors::InsufficientStockToFulfil => e
58
+ flash.now[:alert] = t('shoppe.orders.insufficient_stock_order', out_of_stock_items: e.out_of_stock_items.map { |t| t.ordered_item.full_name }.to_sentence)
59
+ render :action => 'new'
60
+ end
61
+
62
+ def show
63
+ @payments = @order.payments.to_a
64
+ end
65
+
66
+ def update
67
+ @order.attributes = safe_params
68
+ if !request.xhr? && @order.update_attributes(safe_params)
69
+ redirect_to @order, :notice => t('shoppe.orders.update_notice')
70
+ else
71
+ render :action => "edit"
72
+ end
73
+ end
74
+
75
+ def search
76
+ index
77
+ render :action => "index"
78
+ end
79
+
80
+ def accept
81
+ @order.accept!(current_user)
82
+ redirect_to @order, :notice => t('shoppe.orders.accept_notice')
83
+ rescue Shoppe::Errors::PaymentDeclined => e
84
+ redirect_to @order, :alert => e.message
85
+ end
86
+
87
+ def reject
88
+ @order.reject!(current_user)
89
+ redirect_to @order, :notice => t('shoppe.orders.reject_notice')
90
+ rescue Shoppe::Errors::PaymentDeclined => e
91
+ redirect_to @order, :alert => e.message
92
+ end
93
+
94
+ def ship
95
+ @order.ship!(params[:consignment_number], current_user)
96
+ redirect_to @order, :notice => t('shoppe.orders.ship_notice')
97
+ end
98
+
99
+ def despatch_note
100
+ render :layout => 'shoppe/printable'
101
+ end
102
+
103
+ private
104
+
105
+ def safe_params
106
+ params[:order].permit(
107
+ :customer_id,
108
+ :first_name, :last_name, :company,
109
+ :billing_address1, :billing_address2, :billing_address3, :billing_address4, :billing_postcode, :billing_country_id,
110
+ :separate_delivery_address,
111
+ :delivery_name, :delivery_address1, :delivery_address2, :delivery_address3, :delivery_address4, :delivery_postcode, :delivery_country_id,
112
+ :delivery_price, :delivery_service_id, :delivery_tax_amount,
113
+ :email_address, :phone_number,
114
+ :notes,
115
+ :order_items_attributes => [:ordered_item_id, :ordered_item_type, :quantity, :unit_price, :tax_amount, :id, :weight]
116
+ )
117
+ end
118
+ end
119
+ end
@@ -0,0 +1,33 @@
1
+ module Shoppe
2
+ class PaymentsController < ApplicationController
3
+
4
+ before_filter { @order = Shoppe::Order.find(params[:order_id]) }
5
+ before_filter { params[:id] && @payment = @order.payments.find(params[:id]) }
6
+
7
+ def create
8
+ payment = @order.payments.build(params[:payment].permit(:amount, :method, :reference))
9
+ if payment.save
10
+ redirect_to @order, :notice => t('shoppe.payments.create_notice')
11
+ else
12
+ redirect_to @order, :alert => payment.errors.full_messages.to_sentence
13
+ end
14
+ end
15
+
16
+ def destroy
17
+ @payment.destroy
18
+ redirect_to @order, :notice => t('shoppe.payments.destroy_notice')
19
+ end
20
+
21
+ def refund
22
+ if request.post?
23
+ @payment.refund!(params[:amount])
24
+ redirect_to @order, :notice => t('shoppe.payments.refund_notice')
25
+ else
26
+ render :layout => false
27
+ end
28
+ rescue Shoppe::Errors::RefundFailed => e
29
+ redirect_to @order, :alert => e.message
30
+ end
31
+
32
+ end
33
+ end
@@ -0,0 +1,47 @@
1
+ module Shoppe
2
+ class ProductCategoriesController < Shoppe::ApplicationController
3
+
4
+ before_filter { @active_nav = :product_categories }
5
+ before_filter { params[:id] && @product_category = Shoppe::ProductCategory.find(params[:id]) }
6
+
7
+ def index
8
+ @product_categories_without_parent = Shoppe::ProductCategory.without_parent.ordered
9
+ end
10
+
11
+ def new
12
+ @product_category = Shoppe::ProductCategory.new
13
+ end
14
+
15
+ def create
16
+ @product_category = Shoppe::ProductCategory.new(safe_params)
17
+ if @product_category.save
18
+ redirect_to :product_categories, :flash => { :notice => t('shoppe.product_category.create_notice') }
19
+ else
20
+ render :action => "new"
21
+ end
22
+ end
23
+
24
+ def edit
25
+ end
26
+
27
+ def update
28
+ if @product_category.update(safe_params)
29
+ redirect_to [:edit, @product_category], :flash => { :notice => t('shoppe.product_category.update_notice') }
30
+ else
31
+ render :action => "edit"
32
+ end
33
+ end
34
+
35
+ def destroy
36
+ @product_category.destroy
37
+ redirect_to :product_categories, :flash => { :notice => t('shoppe.product_category.destroy_notice') }
38
+ end
39
+
40
+ private
41
+
42
+ def safe_params
43
+ params[:product_category].permit(:name, :permalink, :description, :image_file, :parent_id, :permalink_includes_ancestors)
44
+ end
45
+
46
+ end
47
+ end
@@ -0,0 +1,58 @@
1
+ require "globalize"
2
+
3
+ module Shoppe
4
+ class ProductCategoryLocalisationsController < ApplicationController
5
+
6
+ before_filter { @active_nav = :product_categories }
7
+ before_filter { @product_category = Shoppe::ProductCategory.find(params[:product_category_id]) }
8
+ before_filter { params[:id] && @localisation = @product_category.translations.find(params[:id]) }
9
+
10
+ def index
11
+ @localisations = @product_category.translations
12
+ end
13
+
14
+ def new
15
+ @localisation = @product_category.translations.new
16
+ render :action => "form"
17
+ end
18
+
19
+ def create
20
+ if I18n.available_locales.include? safe_params[:locale].to_sym
21
+ I18n.locale = safe_params[:locale].to_sym
22
+
23
+ if @product_category.update(safe_params)
24
+ I18n.locale = I18n.default_locale
25
+ redirect_to [@product_category, :localisations], :flash => { :notice => t("shoppe.localisations.localisation_created") }
26
+ else
27
+ render :action => "edit"
28
+ end
29
+ else
30
+ redirect_to [@product_category, :localisations]
31
+ end
32
+ end
33
+
34
+ def edit
35
+ render :action => "form"
36
+ end
37
+
38
+ def update
39
+ if @localisation.update(safe_params)
40
+ redirect_to [@product_category, :localisations], :notice => t('shoppe.localisations.localisation_updated')
41
+ else
42
+ render :action => "form"
43
+ end
44
+ end
45
+
46
+ def destroy
47
+ @localisation.destroy
48
+ redirect_to [@product_category, :localisations], :notice => t('shoppe.localisations.localisation_destroyed')
49
+ end
50
+
51
+ private
52
+
53
+ def safe_params
54
+ params[:product_category_translation].permit(:name, :locale, :permalink, :description)
55
+ end
56
+
57
+ end
58
+ end
@@ -0,0 +1,58 @@
1
+ require "globalize"
2
+
3
+ module Shoppe
4
+ class ProductLocalisationsController < ApplicationController
5
+
6
+ before_filter { @active_nav = :products }
7
+ before_filter { @product = Shoppe::Product.find(params[:product_id]) }
8
+ before_filter { params[:id] && @localisation = @product.translations.find(params[:id]) }
9
+
10
+ def index
11
+ @localisations = @product.translations
12
+ end
13
+
14
+ def new
15
+ @localisation = @product.translations.new
16
+ render :action => "form"
17
+ end
18
+
19
+ def create
20
+ if I18n.available_locales.include? safe_params[:locale].to_sym
21
+ I18n.locale = safe_params[:locale].to_sym
22
+
23
+ if @product.update(safe_params)
24
+ I18n.locale = I18n.default_locale
25
+ redirect_to [@product, :localisations], :flash => { :notice => t("shoppe.localisations.localisation_created") }
26
+ else
27
+ render :action => "form"
28
+ end
29
+ else
30
+ redirect_to [@product, :localisations]
31
+ end
32
+ end
33
+
34
+ def edit
35
+ render :action => "form"
36
+ end
37
+
38
+ def update
39
+ if @localisation.update(safe_params)
40
+ redirect_to [@product, :localisations], :notice => t('shoppe.localisations.localisation_updated')
41
+ else
42
+ render :action => "form"
43
+ end
44
+ end
45
+
46
+ def destroy
47
+ @localisation.destroy
48
+ redirect_to [@product, :localisations], :notice => t('shoppe.localisations.localisation_destroyed')
49
+ end
50
+
51
+ private
52
+
53
+ def safe_params
54
+ params[:product_translation].permit(:name, :locale, :permalink, :description, :short_description)
55
+ end
56
+
57
+ end
58
+ end
@@ -0,0 +1,58 @@
1
+ module Shoppe
2
+ class ProductsController < Shoppe::ApplicationController
3
+
4
+ before_filter { @active_nav = :products }
5
+ before_filter { params[:id] && @product = Shoppe::Product.root.find(params[:id]) }
6
+
7
+ def index
8
+ @products = Shoppe::Product.root.includes(:translations, :stock_level_adjustments, :default_image, :product_categories, :variants).order(:name).group_by(&:product_category).sort_by { |cat,pro| cat.name }
9
+ end
10
+
11
+ def new
12
+ @product = Shoppe::Product.new
13
+ end
14
+
15
+ def create
16
+ @product = Shoppe::Product.new(safe_params)
17
+ if @product.save
18
+ redirect_to :products, :flash => {:notice => t('shoppe.products.create_notice') }
19
+ else
20
+ render :action => "new"
21
+ end
22
+ end
23
+
24
+ def edit
25
+ end
26
+
27
+ def update
28
+ if @product.update(safe_params)
29
+ redirect_to [:edit, @product], :flash => {:notice => t('shoppe.products.update_notice') }
30
+ else
31
+ render :action => "edit"
32
+ end
33
+ end
34
+
35
+ def destroy
36
+ @product.destroy
37
+ redirect_to :products, :flash => {:notice => t('shoppe.products.destroy_notice')}
38
+ end
39
+
40
+ def import
41
+ if request.post?
42
+ if params[:import].nil?
43
+ redirect_to import_products_path, :flash => {:alert => I18n.t('shoppe.imports.errors.no_file')}
44
+ else
45
+ Shoppe::Product.import(params[:import][:import_file])
46
+ redirect_to products_path, :flash => {:notice => I18n.t("shoppe.products.imports.success")}
47
+ end
48
+ end
49
+ end
50
+
51
+ private
52
+
53
+ def safe_params
54
+ params[:product].permit(:name, :sku, :permalink, :description, :short_description, :weight, :price, :cost_price, :tax_rate_id, :stock_control, :default_image_file, :data_sheet_file, :active, :featured, :in_the_box, :product_attributes_array => [:key, :value, :searchable, :public], :product_category_ids => [])
55
+ end
56
+
57
+ end
58
+ end