spree_core 0.30.0.beta1

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 (795) hide show
  1. data/LICENSE +26 -0
  2. data/README.md +19 -0
  3. data/app/controllers/admin/adjustments_controller.rb +25 -0
  4. data/app/controllers/admin/base_controller.rb +47 -0
  5. data/app/controllers/admin/checkouts_controller.rb +58 -0
  6. data/app/controllers/admin/configurations_controller.rb +26 -0
  7. data/app/controllers/admin/general_settings_controller.rb +13 -0
  8. data/app/controllers/admin/images_controller.rb +54 -0
  9. data/app/controllers/admin/inventory_settings_controller.rb +13 -0
  10. data/app/controllers/admin/inventory_units_controller.rb +2 -0
  11. data/app/controllers/admin/line_items_controller.rb +69 -0
  12. data/app/controllers/admin/mail_settings_controller.rb +14 -0
  13. data/app/controllers/admin/option_types_controller.rb +58 -0
  14. data/app/controllers/admin/orders_controller.rb +94 -0
  15. data/app/controllers/admin/overview_controller.rb +14 -0
  16. data/app/controllers/admin/payment_methods_controller.rb +31 -0
  17. data/app/controllers/admin/payments_controller.rb +105 -0
  18. data/app/controllers/admin/product_groups_controller.rb +45 -0
  19. data/app/controllers/admin/product_properties_controller.rb +14 -0
  20. data/app/controllers/admin/product_scopes_controller.rb +19 -0
  21. data/app/controllers/admin/products_controller.rb +115 -0
  22. data/app/controllers/admin/properties_controller.rb +27 -0
  23. data/app/controllers/admin/prototypes_controller.rb +52 -0
  24. data/app/controllers/admin/reports_controller.rb +44 -0
  25. data/app/controllers/admin/return_authorizations_controller.rb +36 -0
  26. data/app/controllers/admin/shipments_controller.rb +79 -0
  27. data/app/controllers/admin/shipping_categories_controller.rb +16 -0
  28. data/app/controllers/admin/shipping_methods_controller.rb +21 -0
  29. data/app/controllers/admin/states_controller.rb +30 -0
  30. data/app/controllers/admin/tax_categories_controller.rb +13 -0
  31. data/app/controllers/admin/tax_rates_controller.rb +32 -0
  32. data/app/controllers/admin/tax_settings_controller.rb +13 -0
  33. data/app/controllers/admin/taxonomies_controller.rb +17 -0
  34. data/app/controllers/admin/taxons_controller.rb +127 -0
  35. data/app/controllers/admin/trackers_controller.rb +7 -0
  36. data/app/controllers/admin/users_controller.rb +67 -0
  37. data/app/controllers/admin/variants_controller.rb +55 -0
  38. data/app/controllers/admin/zones_controller.rb +35 -0
  39. data/app/controllers/checkout_controller.rb +68 -0
  40. data/app/controllers/content_controller.rb +13 -0
  41. data/app/controllers/countries_controller.rb +11 -0
  42. data/app/controllers/locale_controller.rb +14 -0
  43. data/app/controllers/orders_controller.rb +49 -0
  44. data/app/controllers/password_resets_controller.rb +49 -0
  45. data/app/controllers/products_controller.rb +38 -0
  46. data/app/controllers/spree/base_controller.rb +111 -0
  47. data/app/controllers/states_controller.rb +16 -0
  48. data/app/controllers/taxons_controller.rb +23 -0
  49. data/app/helpers/account_helper.rb +2 -0
  50. data/app/helpers/admin/base_helper.rb +194 -0
  51. data/app/helpers/admin/inventory_settings_helper.rb +5 -0
  52. data/app/helpers/admin/navigation_helper.rb +140 -0
  53. data/app/helpers/admin/orders_helper.rb +22 -0
  54. data/app/helpers/admin/overview_helper.rb +12 -0
  55. data/app/helpers/admin/payments_helper.rb +7 -0
  56. data/app/helpers/admin/product_groups_helper.rb +11 -0
  57. data/app/helpers/admin/product_properties_helper.rb +21 -0
  58. data/app/helpers/admin/products_helper.rb +11 -0
  59. data/app/helpers/admin/taxons_helper.rb +5 -0
  60. data/app/helpers/admin/users_helper.rb +5 -0
  61. data/app/helpers/admin/zones_helper.rb +11 -0
  62. data/app/helpers/checkout_helper.rb +32 -0
  63. data/app/helpers/hook_helper.rb +20 -0
  64. data/app/helpers/orders_helper.rb +3 -0
  65. data/app/helpers/products_helper.rb +49 -0
  66. data/app/helpers/search_helper.rb +10 -0
  67. data/app/helpers/spree/base_helper.rb +91 -0
  68. data/app/helpers/taxons_helper.rb +32 -0
  69. data/app/helpers/trackers_helper.rb +2 -0
  70. data/app/helpers/users_helper.rb +13 -0
  71. data/app/models/address.rb +88 -0
  72. data/app/models/adjustment.rb +46 -0
  73. data/app/models/app_configuration.rb +54 -0
  74. data/app/models/asset.rb +4 -0
  75. data/app/models/billing_integration.rb +23 -0
  76. data/app/models/calculator/flat_percent_item_total.rb +18 -0
  77. data/app/models/calculator/flat_rate.rb +16 -0
  78. data/app/models/calculator/flexi_rate.rb +32 -0
  79. data/app/models/calculator/per_item.rb +16 -0
  80. data/app/models/calculator/price_bucket.rb +30 -0
  81. data/app/models/calculator/sales_tax.rb +48 -0
  82. data/app/models/calculator/vat.rb +63 -0
  83. data/app/models/calculator.rb +46 -0
  84. data/app/models/checkout.rb +141 -0
  85. data/app/models/configuration.rb +3 -0
  86. data/app/models/country.rb +17 -0
  87. data/app/models/creditcard.rb +240 -0
  88. data/app/models/gateway/authorize_net.rb +8 -0
  89. data/app/models/gateway/authorize_net_cim.rb +121 -0
  90. data/app/models/gateway/beanstream.rb +164 -0
  91. data/app/models/gateway/bogus.rb +80 -0
  92. data/app/models/gateway/eway.rb +11 -0
  93. data/app/models/gateway/linkpoint.rb +8 -0
  94. data/app/models/gateway/pay_pal.rb +11 -0
  95. data/app/models/gateway/sage_pay.rb +9 -0
  96. data/app/models/gateway.rb +48 -0
  97. data/app/models/image.rb +30 -0
  98. data/app/models/inventory_unit.rb +132 -0
  99. data/app/models/line_item.rb +67 -0
  100. data/app/models/option_type.rb +8 -0
  101. data/app/models/option_value.rb +5 -0
  102. data/app/models/order.rb +536 -0
  103. data/app/models/order_mailer.rb +24 -0
  104. data/app/models/payment.rb +136 -0
  105. data/app/models/payment_method/check.rb +2 -0
  106. data/app/models/payment_method.rb +54 -0
  107. data/app/models/preference.rb +51 -0
  108. data/app/models/product.rb +239 -0
  109. data/app/models/product_group.rb +208 -0
  110. data/app/models/product_option_type.rb +5 -0
  111. data/app/models/product_property.rb +15 -0
  112. data/app/models/product_scope.rb +58 -0
  113. data/app/models/property.rb +20 -0
  114. data/app/models/prototype.rb +5 -0
  115. data/app/models/return_authorization.rb +70 -0
  116. data/app/models/role.rb +3 -0
  117. data/app/models/shipment.rb +133 -0
  118. data/app/models/shipping_category.rb +3 -0
  119. data/app/models/shipping_method.rb +20 -0
  120. data/app/models/state.rb +17 -0
  121. data/app/models/state_event.rb +16 -0
  122. data/app/models/state_monitor.rb +25 -0
  123. data/app/models/tax_category.rb +14 -0
  124. data/app/models/tax_rate.rb +17 -0
  125. data/app/models/taxon.rb +51 -0
  126. data/app/models/taxonomy.rb +17 -0
  127. data/app/models/tracker.rb +5 -0
  128. data/app/models/user.rb +13 -0
  129. data/app/models/variant.rb +104 -0
  130. data/app/models/zone.rb +84 -0
  131. data/app/models/zone_member.rb +10 -0
  132. data/app/stylesheets/_buttons.less +80 -0
  133. data/app/stylesheets/_cart.less +24 -0
  134. data/app/stylesheets/_checkout.less +76 -0
  135. data/app/stylesheets/_checkout_progress.less +62 -0
  136. data/app/stylesheets/_colors.less +16 -0
  137. data/app/stylesheets/_forms.less +50 -0
  138. data/app/stylesheets/_layout.less +77 -0
  139. data/app/stylesheets/_messages.less +32 -0
  140. data/app/stylesheets/_mixins.less +71 -0
  141. data/app/stylesheets/_navigation.less +130 -0
  142. data/app/stylesheets/_prices.less +18 -0
  143. data/app/stylesheets/_product_details.less +56 -0
  144. data/app/stylesheets/_product_lists.less +66 -0
  145. data/app/stylesheets/_registration.less +24 -0
  146. data/app/stylesheets/_reset.less +69 -0
  147. data/app/stylesheets/_typography.less +158 -0
  148. data/app/stylesheets/screen.less +13 -0
  149. data/app/views/account/login.html.erb +4 -0
  150. data/app/views/admin/adjustments/_form.html.erb +12 -0
  151. data/app/views/admin/adjustments/edit.html.erb +13 -0
  152. data/app/views/admin/adjustments/index.html.erb +34 -0
  153. data/app/views/admin/adjustments/new.html.erb +13 -0
  154. data/app/views/admin/checkouts/_form.html.erb +42 -0
  155. data/app/views/admin/checkouts/edit.html.erb +21 -0
  156. data/app/views/admin/checkouts/show.html.erb +131 -0
  157. data/app/views/admin/configurations/index.html.erb +66 -0
  158. data/app/views/admin/configurations/new.html.erb +13 -0
  159. data/app/views/admin/extensions/index.html.erb +23 -0
  160. data/app/views/admin/general_settings/edit.html.erb +35 -0
  161. data/app/views/admin/general_settings/show.html.erb +28 -0
  162. data/app/views/admin/images/_form.html.erb +16 -0
  163. data/app/views/admin/images/edit.html.erb +19 -0
  164. data/app/views/admin/images/index.html.erb +66 -0
  165. data/app/views/admin/images/new.html.erb +22 -0
  166. data/app/views/admin/inventory_settings/edit.html.erb +27 -0
  167. data/app/views/admin/inventory_settings/show.html.erb +9 -0
  168. data/app/views/admin/inventory_units/adjust.html.erb +33 -0
  169. data/app/views/admin/mail_settings/edit.html.erb +114 -0
  170. data/app/views/admin/mail_settings/show.html.erb +59 -0
  171. data/app/views/admin/option_types/_available.html.erb +27 -0
  172. data/app/views/admin/option_types/_form.html.erb +11 -0
  173. data/app/views/admin/option_types/_option_value_fields.html.erb +5 -0
  174. data/app/views/admin/option_types/_selected.html.erb +26 -0
  175. data/app/views/admin/option_types/available.js.erb +2 -0
  176. data/app/views/admin/option_types/edit.html.erb +30 -0
  177. data/app/views/admin/option_types/index.html.erb +33 -0
  178. data/app/views/admin/option_types/new.html.erb +11 -0
  179. data/app/views/admin/option_types/select.js.erb +3 -0
  180. data/app/views/admin/option_types/selected.html.erb +6 -0
  181. data/app/views/admin/orders/_add_product.html.erb +20 -0
  182. data/app/views/admin/orders/_form.html.erb +66 -0
  183. data/app/views/admin/orders/_line_item.html.erb +16 -0
  184. data/app/views/admin/orders/edit.html.erb +30 -0
  185. data/app/views/admin/orders/history.html.erb +25 -0
  186. data/app/views/admin/orders/index.html.erb +96 -0
  187. data/app/views/admin/orders/new.html.erb +19 -0
  188. data/app/views/admin/orders/show.html.erb +32 -0
  189. data/app/views/admin/payment_methods/_form.html.erb +50 -0
  190. data/app/views/admin/payment_methods/edit.html.erb +10 -0
  191. data/app/views/admin/payment_methods/index.html.erb +47 -0
  192. data/app/views/admin/payment_methods/new.html.erb +11 -0
  193. data/app/views/admin/payments/_bill_address_form.html.erb +9 -0
  194. data/app/views/admin/payments/_card_form.html.erb +49 -0
  195. data/app/views/admin/payments/_form.html.erb +15 -0
  196. data/app/views/admin/payments/_list.html.erb +24 -0
  197. data/app/views/admin/payments/_transaction_list.html.erb +24 -0
  198. data/app/views/admin/payments/credit.html.erb +14 -0
  199. data/app/views/admin/payments/index.html.erb +27 -0
  200. data/app/views/admin/payments/new.html.erb +19 -0
  201. data/app/views/admin/payments/show.html.erb +10 -0
  202. data/app/views/admin/payments/source_forms/_check.html.erb +0 -0
  203. data/app/views/admin/payments/source_forms/_gateway.html.erb +43 -0
  204. data/app/views/admin/payments/source_views/_check.html.erb +0 -0
  205. data/app/views/admin/payments/source_views/_gateway.html.erb +35 -0
  206. data/app/views/admin/product_groups/_preview.html.erb +34 -0
  207. data/app/views/admin/product_groups/_product_scope.html.erb +24 -0
  208. data/app/views/admin/product_groups/edit.html.erb +56 -0
  209. data/app/views/admin/product_groups/index.html.erb +35 -0
  210. data/app/views/admin/product_groups/new.html.erb +12 -0
  211. data/app/views/admin/product_groups/show.html.erb +32 -0
  212. data/app/views/admin/product_groups/update.js.erb +7 -0
  213. data/app/views/admin/product_properties/_product_property_fields.html.erb +11 -0
  214. data/app/views/admin/product_properties/index.html.erb +50 -0
  215. data/app/views/admin/product_scopes/_form.html.erb +106 -0
  216. data/app/views/admin/product_scopes/create.js.erb +3 -0
  217. data/app/views/admin/product_scopes/destroy.js.erb +2 -0
  218. data/app/views/admin/product_scopes/new.html.erb +1 -0
  219. data/app/views/admin/products/_form.html.erb +106 -0
  220. data/app/views/admin/products/_option_types.html.erb +40 -0
  221. data/app/views/admin/products/_properties_form.erb +7 -0
  222. data/app/views/admin/products/edit.html.erb +10 -0
  223. data/app/views/admin/products/index.html.erb +81 -0
  224. data/app/views/admin/products/new.html.erb +53 -0
  225. data/app/views/admin/products/show.html.erb +4 -0
  226. data/app/views/admin/properties/_form.html.erb +12 -0
  227. data/app/views/admin/properties/edit.html.erb +10 -0
  228. data/app/views/admin/properties/filtered.html.erb +1 -0
  229. data/app/views/admin/properties/index.html.erb +40 -0
  230. data/app/views/admin/properties/new.html.erb +11 -0
  231. data/app/views/admin/prototypes/_form.html.erb +44 -0
  232. data/app/views/admin/prototypes/available.html.erb +22 -0
  233. data/app/views/admin/prototypes/edit.html.erb +9 -0
  234. data/app/views/admin/prototypes/index.html.erb +37 -0
  235. data/app/views/admin/prototypes/new.html.erb +11 -0
  236. data/app/views/admin/prototypes/select.js.erb +4 -0
  237. data/app/views/admin/reports/index.html.erb +19 -0
  238. data/app/views/admin/reports/sales_total.html.erb +27 -0
  239. data/app/views/admin/return_authorizations/_form.html.erb +64 -0
  240. data/app/views/admin/return_authorizations/edit.html.erb +27 -0
  241. data/app/views/admin/return_authorizations/index.html.erb +43 -0
  242. data/app/views/admin/return_authorizations/new.html.erb +13 -0
  243. data/app/views/admin/shared/_additional_field.html.erb +5 -0
  244. data/app/views/admin/shared/_address.html.erb +5 -0
  245. data/app/views/admin/shared/_address_form.html.erb +76 -0
  246. data/app/views/admin/shared/_calculator_fields.html.erb +19 -0
  247. data/app/views/admin/shared/_configuration_menu.html.erb +22 -0
  248. data/app/views/admin/shared/_edit_resource_links.html.erb +4 -0
  249. data/app/views/admin/shared/_group_from_products_form.html.erb +12 -0
  250. data/app/views/admin/shared/_new_resource_links.html.erb +4 -0
  251. data/app/views/admin/shared/_order_details.html.erb +3 -0
  252. data/app/views/admin/shared/_order_sub_menu.html.erb +0 -0
  253. data/app/views/admin/shared/_order_tabs.html.erb +60 -0
  254. data/app/views/admin/shared/_product_sub_menu.html.erb +11 -0
  255. data/app/views/admin/shared/_product_tabs.html.erb +34 -0
  256. data/app/views/admin/shared/_report_criteria.html.erb +15 -0
  257. data/app/views/admin/shared/_show_resource_links.html.erb +5 -0
  258. data/app/views/admin/shared/_tabs.html.erb +6 -0
  259. data/app/views/admin/shipments/_form.html.erb +79 -0
  260. data/app/views/admin/shipments/edit.html.erb +40 -0
  261. data/app/views/admin/shipments/index.html.erb +45 -0
  262. data/app/views/admin/shipments/new.html.erb +18 -0
  263. data/app/views/admin/shipping_categories/_form.html.erb +6 -0
  264. data/app/views/admin/shipping_categories/edit.html.erb +6 -0
  265. data/app/views/admin/shipping_categories/index.html.erb +29 -0
  266. data/app/views/admin/shipping_categories/new.html.erb +8 -0
  267. data/app/views/admin/shipping_methods/_form.html.erb +24 -0
  268. data/app/views/admin/shipping_methods/edit.html.erb +16 -0
  269. data/app/views/admin/shipping_methods/index.html.erb +48 -0
  270. data/app/views/admin/shipping_methods/new.html.erb +17 -0
  271. data/app/views/admin/states/_form.html.erb +9 -0
  272. data/app/views/admin/states/_state_list.html.erb +28 -0
  273. data/app/views/admin/states/edit.html.erb +10 -0
  274. data/app/views/admin/states/index.html.erb +16 -0
  275. data/app/views/admin/states/new.html.erb +8 -0
  276. data/app/views/admin/tax_categories/_form.html.erb +12 -0
  277. data/app/views/admin/tax_categories/edit.html.erb +10 -0
  278. data/app/views/admin/tax_categories/index.html.erb +39 -0
  279. data/app/views/admin/tax_categories/new.html.erb +10 -0
  280. data/app/views/admin/tax_categories/show.html.erb +1 -0
  281. data/app/views/admin/tax_rates/_form.html.erb +16 -0
  282. data/app/views/admin/tax_rates/edit.html.erb +6 -0
  283. data/app/views/admin/tax_rates/index.html.erb +34 -0
  284. data/app/views/admin/tax_rates/new.html.erb +8 -0
  285. data/app/views/admin/tax_settings/edit.html.erb +17 -0
  286. data/app/views/admin/tax_settings/show.html.erb +14 -0
  287. data/app/views/admin/taxonomies/_form.html.erb +7 -0
  288. data/app/views/admin/taxonomies/_js_head.html.erb +11 -0
  289. data/app/views/admin/taxonomies/_list.html.erb +17 -0
  290. data/app/views/admin/taxonomies/_taxon.html.erb +12 -0
  291. data/app/views/admin/taxonomies/edit.html.erb +49 -0
  292. data/app/views/admin/taxonomies/get_children.json.erb +9 -0
  293. data/app/views/admin/taxonomies/index.html.erb +16 -0
  294. data/app/views/admin/taxonomies/new.html.erb +12 -0
  295. data/app/views/admin/taxons/_form.html.erb +23 -0
  296. data/app/views/admin/taxons/_taxon_table.html.erb +28 -0
  297. data/app/views/admin/taxons/available.js.erb +36 -0
  298. data/app/views/admin/taxons/edit.html.erb +11 -0
  299. data/app/views/admin/taxons/remove.html.erb +1 -0
  300. data/app/views/admin/taxons/select.html.erb +1 -0
  301. data/app/views/admin/taxons/selected.html.erb +42 -0
  302. data/app/views/admin/trackers/_form.html.erb +26 -0
  303. data/app/views/admin/trackers/edit.html.erb +8 -0
  304. data/app/views/admin/trackers/index.html.erb +41 -0
  305. data/app/views/admin/trackers/new.html.erb +9 -0
  306. data/app/views/admin/users/_form.html.erb +36 -0
  307. data/app/views/admin/users/edit.html.erb +14 -0
  308. data/app/views/admin/users/index.html.erb +62 -0
  309. data/app/views/admin/users/new.html.erb +14 -0
  310. data/app/views/admin/users/show.html.erb +21 -0
  311. data/app/views/admin/variants/_form.html.erb +40 -0
  312. data/app/views/admin/variants/edit.html.erb +13 -0
  313. data/app/views/admin/variants/index.html.erb +51 -0
  314. data/app/views/admin/variants/new.html.erb +11 -0
  315. data/app/views/admin/zones/_country_member.html.erb +5 -0
  316. data/app/views/admin/zones/_form.html.erb +29 -0
  317. data/app/views/admin/zones/_member_type.html.erb +15 -0
  318. data/app/views/admin/zones/_state_member.html.erb +5 -0
  319. data/app/views/admin/zones/_zone_member.html.erb +5 -0
  320. data/app/views/admin/zones/edit.html.erb +10 -0
  321. data/app/views/admin/zones/index.html.erb +40 -0
  322. data/app/views/admin/zones/new.html.erb +10 -0
  323. data/app/views/checkout/_address.html.erb +161 -0
  324. data/app/views/checkout/_complete.html.erb +1 -0
  325. data/app/views/checkout/_confirm.html.erb +11 -0
  326. data/app/views/checkout/_delivery.html.erb +25 -0
  327. data/app/views/checkout/_payment.html.erb +28 -0
  328. data/app/views/checkout/_summary.html.erb +31 -0
  329. data/app/views/checkout/edit.html.erb +18 -0
  330. data/app/views/checkout/payment/_check.html.erb +0 -0
  331. data/app/views/checkout/payment/_gateway.html.erb +31 -0
  332. data/app/views/content/cvv.html.erb +13 -0
  333. data/app/views/countries/index.js.erb +1 -0
  334. data/app/views/layouts/admin.html.erb +79 -0
  335. data/app/views/layouts/spree_application.html.erb +52 -0
  336. data/app/views/order_mailer/cancel.html.erb +16 -0
  337. data/app/views/order_mailer/confirm.html.erb +19 -0
  338. data/app/views/orders/_form.html.erb +19 -0
  339. data/app/views/orders/_line_item.html.erb +43 -0
  340. data/app/views/orders/edit.html.erb +40 -0
  341. data/app/views/orders/new.html.erb +9 -0
  342. data/app/views/orders/show.html.erb +16 -0
  343. data/app/views/password_resets/edit.html.erb +12 -0
  344. data/app/views/password_resets/new.html.erb +12 -0
  345. data/app/views/products/_cart_form.html.erb +54 -0
  346. data/app/views/products/_image.html.erb +5 -0
  347. data/app/views/products/_properties.html.erb +8 -0
  348. data/app/views/products/_taxons.html.erb +16 -0
  349. data/app/views/products/_thumbnails.html.erb +40 -0
  350. data/app/views/products/index.html.erb +30 -0
  351. data/app/views/products/show.html.erb +31 -0
  352. data/app/views/shared/_additional_field.html.erb +7 -0
  353. data/app/views/shared/_admin_head.html.erb +34 -0
  354. data/app/views/shared/_edit_resource_links.html.erb +1 -0
  355. data/app/views/shared/_error_messages.html.erb +11 -0
  356. data/app/views/shared/_filters.html.erb +52 -0
  357. data/app/views/shared/_footer.html.erb +13 -0
  358. data/app/views/shared/_google_analytics.html.erb +39 -0
  359. data/app/views/shared/_head.html.erb +10 -0
  360. data/app/views/shared/_login.html.erb +21 -0
  361. data/app/views/shared/_method_error_message.html.erb +4 -0
  362. data/app/views/shared/_nav_bar.html.erb +5 -0
  363. data/app/views/shared/_new_resource_links.html.erb +1 -0
  364. data/app/views/shared/_order_details.html.erb +50 -0
  365. data/app/views/shared/_products.html.erb +35 -0
  366. data/app/views/shared/_search.html.erb +9 -0
  367. data/app/views/shared/_show_resource_links.html.erb +3 -0
  368. data/app/views/shared/_store_menu.html.erb +3 -0
  369. data/app/views/shared/_taxonomies.html.erb +10 -0
  370. data/app/views/shared/_test_hook.html.erb +1 -0
  371. data/app/views/shared/_user_form.html.erb +17 -0
  372. data/app/views/states/index.js.erb +1 -0
  373. data/app/views/taxons/_taxon.html.erb +4 -0
  374. data/app/views/taxons/show.html.erb +17 -0
  375. data/app/views/users/edit.html.erb +9 -0
  376. data/app/views/users/show.html.erb +46 -0
  377. data/config/initializers/form_builder.rb +23 -0
  378. data/config/initializers/load_unobtrusive_date_picker.rb +8 -0
  379. data/config/initializers/spree.rb +41 -0
  380. data/config/initializers/touch.rb +14 -0
  381. data/config/initializers/workarounds_for_ruby19.rb +72 -0
  382. data/config/locales/en_spree.yml +950 -0
  383. data/config/routes.rb +186 -0
  384. data/lib/active_merchant/billing/authorize_net_cim.rb +871 -0
  385. data/lib/custom_fixtures.rb +7 -0
  386. data/lib/generators/spree_core/extension_generator.rb +57 -0
  387. data/lib/generators/spree_core/install_generator.rb +59 -0
  388. data/lib/generators/templates/LICENSE +23 -0
  389. data/lib/generators/templates/README.md +13 -0
  390. data/lib/generators/templates/Rakefile +1 -0
  391. data/lib/generators/templates/application_controller.rb +4 -0
  392. data/lib/generators/templates/config/initializers/%file_name%.rb.tt +1 -0
  393. data/lib/generators/templates/config/locales/%current_locale%.yml.tt +2 -0
  394. data/lib/generators/templates/config/routes.rb +3 -0
  395. data/lib/generators/templates/db/default/countries.yml +1583 -0
  396. data/lib/generators/templates/db/default/roles.yml +7 -0
  397. data/lib/generators/templates/db/default/states.yml +256 -0
  398. data/lib/generators/templates/db/default/zone_members.yml +169 -0
  399. data/lib/generators/templates/db/default/zones.yml +13 -0
  400. data/lib/generators/templates/db/migrate/20090823005402_spree_zero_nine_zero.rb +442 -0
  401. data/lib/generators/templates/db/migrate/20090904192342_create_indexes_for_inventory_units.rb +12 -0
  402. data/lib/generators/templates/db/migrate/20090923100315_add_count_on_hand_to_variants_and_products.rb +36 -0
  403. data/lib/generators/templates/db/migrate/20091007134354_change_taxons_to_nested_set.rb +40 -0
  404. data/lib/generators/templates/db/migrate/20091008091614_move_to_configurable_gateways.rb +55 -0
  405. data/lib/generators/templates/db/migrate/20091012120519_product_groups_and_scopes.rb +25 -0
  406. data/lib/generators/templates/db/migrate/20091015110842_add_open_id_authentication_tables.rb +20 -0
  407. data/lib/generators/templates/db/migrate/20091015153048_add_openid_field_to_users.rb +19 -0
  408. data/lib/generators/templates/db/migrate/20091016174634_change_preference_value_type.rb +9 -0
  409. data/lib/generators/templates/db/migrate/20091017175558_create_billing_integrations.rb +16 -0
  410. data/lib/generators/templates/db/migrate/20091021133257_charge_refactoring.rb +32 -0
  411. data/lib/generators/templates/db/migrate/20091104151730_add_some_indexes.rb +21 -0
  412. data/lib/generators/templates/db/migrate/20091126190904_checkout_state_machine.rb +13 -0
  413. data/lib/generators/templates/db/migrate/20091209153045_state_for_shipments.rb +9 -0
  414. data/lib/generators/templates/db/migrate/20091209202200_make_state_events_polymorphic.rb +12 -0
  415. data/lib/generators/templates/db/migrate/20091211203813_ship_address_id_for_checkouts.rb +9 -0
  416. data/lib/generators/templates/db/migrate/20091212161118_shipping_method_id_for_checkouts.rb +9 -0
  417. data/lib/generators/templates/db/migrate/20091213222815_creditcard_last_four_digits.rb +19 -0
  418. data/lib/generators/templates/db/migrate/20091214183826_populate_legacy_shipment_state.rb +19 -0
  419. data/lib/generators/templates/db/migrate/20100105090147_add_cost_price.rb +9 -0
  420. data/lib/generators/templates/db/migrate/20100105132138_shipment_id_for_inventory_units.rb +21 -0
  421. data/lib/generators/templates/db/migrate/20100111205525_cim_fields_for_creditcards.rb +11 -0
  422. data/lib/generators/templates/db/migrate/20100112151511_create_return_authorizations.rb +16 -0
  423. data/lib/generators/templates/db/migrate/20100113090919_add_return_authorization_to_inventory_units.rb +9 -0
  424. data/lib/generators/templates/db/migrate/20100113203104_create_trackers.rb +14 -0
  425. data/lib/generators/templates/db/migrate/20100121160010_creditcard_id_for_creditcard_txns.rb +9 -0
  426. data/lib/generators/templates/db/migrate/20100121183934_original_creditcard_txn_id_for_creditcard_txns.rb +9 -0
  427. data/lib/generators/templates/db/migrate/20100125145351_add_test_mode_to_billing_integration.rb +11 -0
  428. data/lib/generators/templates/db/migrate/20100126103714_create_products_product_groups.rb +12 -0
  429. data/lib/generators/templates/db/migrate/20100209025806_create_payment_methods.rb +20 -0
  430. data/lib/generators/templates/db/migrate/20100209144531_polymorphic_payments.rb +29 -0
  431. data/lib/generators/templates/db/migrate/20100213103131_change_payments_payment_method_to_belongs_to.rb +11 -0
  432. data/lib/generators/templates/db/migrate/20100214212536_assign_creditcard_txns_to_payment.rb +16 -0
  433. data/lib/generators/templates/db/migrate/20100223170312_sti_for_transactions.rb +14 -0
  434. data/lib/generators/templates/db/migrate/20100223183812_drop_billing_integrations.rb +16 -0
  435. data/lib/generators/templates/db/migrate/20100224153127_deleted_at_for_payment_methods.rb +13 -0
  436. data/lib/generators/templates/db/migrate/20100301163454_add_adjustments_index.rb +10 -0
  437. data/lib/generators/templates/db/migrate/20100306153445_fix_by_popularity.rb +8 -0
  438. data/lib/generators/templates/db/migrate/20100317120946_add_alt_text_to_images.rb +9 -0
  439. data/lib/generators/templates/db/migrate/20100427121301_add_display_to_payment_methods.rb +9 -0
  440. data/lib/generators/templates/db/migrate/20100504142133_add_addresses_checkouts_indexes.rb +16 -0
  441. data/lib/generators/templates/db/migrate/20100506180619_add_icon_to_taxons.rb +18 -0
  442. data/lib/generators/templates/db/migrate/20100506185838_add_description_to_taxons.rb +11 -0
  443. data/lib/generators/templates/db/migrate/20100528155333_index_for_shipments_number.rb +9 -0
  444. data/lib/generators/templates/db/migrate/20100528185820_add_index_on_users_persistence_token.rb +9 -0
  445. data/lib/generators/templates/db/migrate/20100605152042_add_default_to_tax_categories.rb +9 -0
  446. data/lib/generators/templates/db/migrate/20100624110730_add_display_to_shipping_methods.rb +9 -0
  447. data/lib/generators/templates/db/migrate/20100624123336_rename_payment_method_display.rb +9 -0
  448. data/lib/generators/templates/db/migrate/20100624175547_rename_preferences_field.rb +8 -0
  449. data/lib/generators/templates/db/migrate/20100811163637_add_guest_flag.rb +13 -0
  450. data/lib/generators/templates/db/migrate/20100811205836_drop_order_token.rb +11 -0
  451. data/lib/generators/templates/db/migrate/20100812162326_payments_state_and_assigned_to_order_only.rb +11 -0
  452. data/lib/generators/templates/db/migrate/20100813023502_create_address_keys_for_order.rb +15 -0
  453. data/lib/generators/templates/db/migrate/20100813185745_payment_total_for_orders.rb +9 -0
  454. data/lib/generators/templates/db/migrate/20100816212146_shipping_method_id_for_orders.rb +9 -0
  455. data/lib/generators/templates/db/migrate/20100817152723_add_shipment_and_payment_state.rb +15 -0
  456. data/lib/generators/templates/db/migrate/20100819170125_refactor_adjustments.rb +19 -0
  457. data/lib/generators/templates/db/migrate/20100820135707_response_code_and_avs_response_for_payments.rb +11 -0
  458. data/lib/generators/templates/db/migrate/20100901171814_change_guest_flag_to_anonymous.rb +13 -0
  459. data/lib/generators/templates/db/sample/users.rb +61 -0
  460. data/lib/generators/templates/extension/engine.rb.tt +14 -0
  461. data/lib/generators/templates/extension/extension.rb.tt +1 -0
  462. data/lib/generators/templates/extension.gemspec.tt +21 -0
  463. data/lib/generators/templates/lib/tasks/%file_name%.rake.tt +1 -0
  464. data/lib/generators/templates/public/images/add-to-cart.png +0 -0
  465. data/lib/generators/templates/public/images/admin/bg/active-tab.png +0 -0
  466. data/lib/generators/templates/public/images/admin/bg/admin_tab_back.png +0 -0
  467. data/lib/generators/templates/public/images/admin/bg/admin_tab_selected_back.png +0 -0
  468. data/lib/generators/templates/public/images/admin/bg/content-back-blue.png +0 -0
  469. data/lib/generators/templates/public/images/admin/bg/content-back-green.png +0 -0
  470. data/lib/generators/templates/public/images/admin/bg/content-back.png +0 -0
  471. data/lib/generators/templates/public/images/admin/bg/flash-error.png +0 -0
  472. data/lib/generators/templates/public/images/admin/bg/flash-notice.png +0 -0
  473. data/lib/generators/templates/public/images/admin/bg/green-stripes.gif +0 -0
  474. data/lib/generators/templates/public/images/admin/bg/green-stripes.png +0 -0
  475. data/lib/generators/templates/public/images/admin/bg/grid_header_back.png +0 -0
  476. data/lib/generators/templates/public/images/admin/bg/grid_header_back_green.png +0 -0
  477. data/lib/generators/templates/public/images/admin/bg/header-bg.png +0 -0
  478. data/lib/generators/templates/public/images/admin/bg/header.png +0 -0
  479. data/lib/generators/templates/public/images/admin/bg/header_bg.jpg +0 -0
  480. data/lib/generators/templates/public/images/admin/bg/menu-current.png +0 -0
  481. data/lib/generators/templates/public/images/admin/bg/red-stripes.gif +0 -0
  482. data/lib/generators/templates/public/images/admin/bg/red-stripes.png +0 -0
  483. data/lib/generators/templates/public/images/admin/bg/spree_50.png +0 -0
  484. data/lib/generators/templates/public/images/admin/bg/subnav-divider.png +0 -0
  485. data/lib/generators/templates/public/images/admin/bg/subnav.png +0 -0
  486. data/lib/generators/templates/public/images/admin/bg/tab-back.png +0 -0
  487. data/lib/generators/templates/public/images/admin/buttons/blue/left_01.png +0 -0
  488. data/lib/generators/templates/public/images/admin/buttons/blue/right_01.png +0 -0
  489. data/lib/generators/templates/public/images/admin/buttons/drag-handle-green.png +0 -0
  490. data/lib/generators/templates/public/images/admin/buttons/green/left_01.png +0 -0
  491. data/lib/generators/templates/public/images/admin/buttons/green/right_01.png +0 -0
  492. data/lib/generators/templates/public/images/admin/buttons/left_01.png +0 -0
  493. data/lib/generators/templates/public/images/admin/buttons/left_01_small.png +0 -0
  494. data/lib/generators/templates/public/images/admin/buttons/orange/left_03.png +0 -0
  495. data/lib/generators/templates/public/images/admin/buttons/orange/right_03.png +0 -0
  496. data/lib/generators/templates/public/images/admin/buttons/right_01.png +0 -0
  497. data/lib/generators/templates/public/images/admin/buttons/right_01_small.png +0 -0
  498. data/lib/generators/templates/public/images/admin/icons/16x16/1.png +0 -0
  499. data/lib/generators/templates/public/images/admin/icons/16x16/10.png +0 -0
  500. data/lib/generators/templates/public/images/admin/icons/16x16/2.png +0 -0
  501. data/lib/generators/templates/public/images/admin/icons/16x16/3.png +0 -0
  502. data/lib/generators/templates/public/images/admin/icons/16x16/4.png +0 -0
  503. data/lib/generators/templates/public/images/admin/icons/16x16/5.png +0 -0
  504. data/lib/generators/templates/public/images/admin/icons/16x16/6.png +0 -0
  505. data/lib/generators/templates/public/images/admin/icons/16x16/7.png +0 -0
  506. data/lib/generators/templates/public/images/admin/icons/16x16/8.png +0 -0
  507. data/lib/generators/templates/public/images/admin/icons/16x16/9.png +0 -0
  508. data/lib/generators/templates/public/images/admin/icons/32x32/1.png +0 -0
  509. data/lib/generators/templates/public/images/admin/icons/32x32/10.png +0 -0
  510. data/lib/generators/templates/public/images/admin/icons/32x32/11.png +0 -0
  511. data/lib/generators/templates/public/images/admin/icons/32x32/2.png +0 -0
  512. data/lib/generators/templates/public/images/admin/icons/32x32/3.png +0 -0
  513. data/lib/generators/templates/public/images/admin/icons/32x32/4.png +0 -0
  514. data/lib/generators/templates/public/images/admin/icons/32x32/5.png +0 -0
  515. data/lib/generators/templates/public/images/admin/icons/32x32/6.png +0 -0
  516. data/lib/generators/templates/public/images/admin/icons/32x32/7.png +0 -0
  517. data/lib/generators/templates/public/images/admin/icons/32x32/8.png +0 -0
  518. data/lib/generators/templates/public/images/admin/icons/32x32/9.png +0 -0
  519. data/lib/generators/templates/public/images/admin/icons/accept.png +0 -0
  520. data/lib/generators/templates/public/images/admin/icons/add.gif +0 -0
  521. data/lib/generators/templates/public/images/admin/icons/add.png +0 -0
  522. data/lib/generators/templates/public/images/admin/icons/arrow-down.gif +0 -0
  523. data/lib/generators/templates/public/images/admin/icons/cross.png +0 -0
  524. data/lib/generators/templates/public/images/admin/icons/delete.gif +0 -0
  525. data/lib/generators/templates/public/images/admin/icons/delete.png +0 -0
  526. data/lib/generators/templates/public/images/admin/icons/drag.gif +0 -0
  527. data/lib/generators/templates/public/images/admin/icons/edit.gif +0 -0
  528. data/lib/generators/templates/public/images/admin/icons/edit.png +0 -0
  529. data/lib/generators/templates/public/images/admin/icons/email.png +0 -0
  530. data/lib/generators/templates/public/images/admin/icons/error.png +0 -0
  531. data/lib/generators/templates/public/images/admin/icons/exclamation.png +0 -0
  532. data/lib/generators/templates/public/images/admin/icons/feed.png +0 -0
  533. data/lib/generators/templates/public/images/admin/icons/pdf.png +0 -0
  534. data/lib/generators/templates/public/images/admin/icons/reorder.gif +0 -0
  535. data/lib/generators/templates/public/images/admin/icons/search.gif +0 -0
  536. data/lib/generators/templates/public/images/admin/icons/send-email.png +0 -0
  537. data/lib/generators/templates/public/images/admin/icons/stop.png +0 -0
  538. data/lib/generators/templates/public/images/admin/icons/tick.png +0 -0
  539. data/lib/generators/templates/public/images/admin/icons/up.gif +0 -0
  540. data/lib/generators/templates/public/images/admin/icons/xls.png +0 -0
  541. data/lib/generators/templates/public/images/admin/tabs/off-left.png +0 -0
  542. data/lib/generators/templates/public/images/admin/tabs/off-right.png +0 -0
  543. data/lib/generators/templates/public/images/admin/tabs/on-left.png +0 -0
  544. data/lib/generators/templates/public/images/admin/tabs/on-right.png +0 -0
  545. data/lib/generators/templates/public/images/ajax_loader.gif +0 -0
  546. data/lib/generators/templates/public/images/amex_cid.gif +0 -0
  547. data/lib/generators/templates/public/images/bg-button-hover.png +0 -0
  548. data/lib/generators/templates/public/images/bg-button-pressed.png +0 -0
  549. data/lib/generators/templates/public/images/bg-button.gif +0 -0
  550. data/lib/generators/templates/public/images/bg-button.png +0 -0
  551. data/lib/generators/templates/public/images/blue/left_01.png +0 -0
  552. data/lib/generators/templates/public/images/blue/right_01.png +0 -0
  553. data/lib/generators/templates/public/images/body-back.png +0 -0
  554. data/lib/generators/templates/public/images/bottom_shine.png +0 -0
  555. data/lib/generators/templates/public/images/breadcrumb.gif +0 -0
  556. data/lib/generators/templates/public/images/button-dark-hover.png +0 -0
  557. data/lib/generators/templates/public/images/button-dark.png +0 -0
  558. data/lib/generators/templates/public/images/buttons/bg-button-hover.png +0 -0
  559. data/lib/generators/templates/public/images/buttons/bg-button-pressed.png +0 -0
  560. data/lib/generators/templates/public/images/buttons/bg-button.gif +0 -0
  561. data/lib/generators/templates/public/images/buttons/bg-button.png +0 -0
  562. data/lib/generators/templates/public/images/buttons/blue/left_01.png +0 -0
  563. data/lib/generators/templates/public/images/buttons/blue/right_01.png +0 -0
  564. data/lib/generators/templates/public/images/buttons/button-dark-hover.png +0 -0
  565. data/lib/generators/templates/public/images/buttons/button-dark.png +0 -0
  566. data/lib/generators/templates/public/images/buttons/drag-handle-green.png +0 -0
  567. data/lib/generators/templates/public/images/buttons/green/left_01.png +0 -0
  568. data/lib/generators/templates/public/images/buttons/green/right_01.png +0 -0
  569. data/lib/generators/templates/public/images/buttons/left_01.png +0 -0
  570. data/lib/generators/templates/public/images/buttons/left_01_small.png +0 -0
  571. data/lib/generators/templates/public/images/buttons/orange/left_03.png +0 -0
  572. data/lib/generators/templates/public/images/buttons/orange/right_03.png +0 -0
  573. data/lib/generators/templates/public/images/buttons/right_01.png +0 -0
  574. data/lib/generators/templates/public/images/buttons/right_01_small.png +0 -0
  575. data/lib/generators/templates/public/images/buttons/sxsw-ribbon-v1.png +0 -0
  576. data/lib/generators/templates/public/images/buttons/top-shine.png +0 -0
  577. data/lib/generators/templates/public/images/calendar_date_select/calendar.gif +0 -0
  578. data/lib/generators/templates/public/images/cart-empty.png +0 -0
  579. data/lib/generators/templates/public/images/cart-empty_x32.png +0 -0
  580. data/lib/generators/templates/public/images/cart-full.png +0 -0
  581. data/lib/generators/templates/public/images/cart-full_x32.png +0 -0
  582. data/lib/generators/templates/public/images/checkout.png +0 -0
  583. data/lib/generators/templates/public/images/creditcard.gif +0 -0
  584. data/lib/generators/templates/public/images/datepicker/backstripes.gif +0 -0
  585. data/lib/generators/templates/public/images/datepicker/bg_header.jpg +0 -0
  586. data/lib/generators/templates/public/images/datepicker/bullet1.gif +0 -0
  587. data/lib/generators/templates/public/images/datepicker/bullet2.gif +0 -0
  588. data/lib/generators/templates/public/images/datepicker/cal.gif +0 -0
  589. data/lib/generators/templates/public/images/datepicker/gradient-e5e5e5-ffffff.gif +0 -0
  590. data/lib/generators/templates/public/images/discover_cid.gif +0 -0
  591. data/lib/generators/templates/public/images/drag-handle-green.png +0 -0
  592. data/lib/generators/templates/public/images/favicon.ico +0 -0
  593. data/lib/generators/templates/public/images/green/left_01.png +0 -0
  594. data/lib/generators/templates/public/images/green/right_01.png +0 -0
  595. data/lib/generators/templates/public/images/grid.png +0 -0
  596. data/lib/generators/templates/public/images/left_01.png +0 -0
  597. data/lib/generators/templates/public/images/left_01_small.png +0 -0
  598. data/lib/generators/templates/public/images/master_cid.jpg +0 -0
  599. data/lib/generators/templates/public/images/menu-current.png +0 -0
  600. data/lib/generators/templates/public/images/menu-hover.png +0 -0
  601. data/lib/generators/templates/public/images/noimage/mini.jpg +0 -0
  602. data/lib/generators/templates/public/images/noimage/product.jpg +0 -0
  603. data/lib/generators/templates/public/images/noimage/small.jpg +0 -0
  604. data/lib/generators/templates/public/images/openid-inputicon.gif +0 -0
  605. data/lib/generators/templates/public/images/orange/left_03.png +0 -0
  606. data/lib/generators/templates/public/images/orange/right_03.png +0 -0
  607. data/lib/generators/templates/public/images/progress.gif +0 -0
  608. data/lib/generators/templates/public/images/right_01.png +0 -0
  609. data/lib/generators/templates/public/images/right_01_small.png +0 -0
  610. data/lib/generators/templates/public/images/separator.png +0 -0
  611. data/lib/generators/templates/public/images/shadow-top.png +0 -0
  612. data/lib/generators/templates/public/images/shadow_top.png +0 -0
  613. data/lib/generators/templates/public/images/spinner.gif +0 -0
  614. data/lib/generators/templates/public/images/spree/progress.gif +0 -0
  615. data/lib/generators/templates/public/images/spree/spinner.gif +0 -0
  616. data/lib/generators/templates/public/images/spree/spree.jpg +0 -0
  617. data/lib/generators/templates/public/images/spree.jpg +0 -0
  618. data/lib/generators/templates/public/images/step-progress/completed-completed.gif +0 -0
  619. data/lib/generators/templates/public/images/step-progress/completed-current.gif +0 -0
  620. data/lib/generators/templates/public/images/step-progress/completed-first.gif +0 -0
  621. data/lib/generators/templates/public/images/step-progress/current-first.gif +0 -0
  622. data/lib/generators/templates/public/images/step-progress/current-incomplete.gif +0 -0
  623. data/lib/generators/templates/public/images/step-progress/current-right.gif +0 -0
  624. data/lib/generators/templates/public/images/step-progress/incomplete-incomplete.gif +0 -0
  625. data/lib/generators/templates/public/images/step-progress/incomplete-right.gif +0 -0
  626. data/lib/generators/templates/public/images/steps/1.png +0 -0
  627. data/lib/generators/templates/public/images/steps/1_small.png +0 -0
  628. data/lib/generators/templates/public/images/steps/2.png +0 -0
  629. data/lib/generators/templates/public/images/steps/2_small.png +0 -0
  630. data/lib/generators/templates/public/images/steps/3.png +0 -0
  631. data/lib/generators/templates/public/images/steps/3_small.png +0 -0
  632. data/lib/generators/templates/public/images/steps/4.png +0 -0
  633. data/lib/generators/templates/public/images/steps/4_small.png +0 -0
  634. data/lib/generators/templates/public/images/steps/5.png +0 -0
  635. data/lib/generators/templates/public/images/steps/5_small.png +0 -0
  636. data/lib/generators/templates/public/images/steps/6.png +0 -0
  637. data/lib/generators/templates/public/images/steps/6_small.png +0 -0
  638. data/lib/generators/templates/public/images/sxsw-ribbon-v1.png +0 -0
  639. data/lib/generators/templates/public/images/tab_bottom.gif +0 -0
  640. data/lib/generators/templates/public/images/tile-header.png +0 -0
  641. data/lib/generators/templates/public/images/tile-slider.png +0 -0
  642. data/lib/generators/templates/public/images/top-shine.png +0 -0
  643. data/lib/generators/templates/public/images/tree-nav-icons/bullet.gif +0 -0
  644. data/lib/generators/templates/public/images/tree-nav-icons/minus.gif +0 -0
  645. data/lib/generators/templates/public/images/tree-nav-icons/plus.gif +0 -0
  646. data/lib/generators/templates/public/images/tree-nav-icons/treeview-loading.gif +0 -0
  647. data/lib/generators/templates/public/images/tree-nav-icons/treeview-sprite.gif +0 -0
  648. data/lib/generators/templates/public/images/update.png +0 -0
  649. data/lib/generators/templates/public/images/visa_cid.gif +0 -0
  650. data/lib/generators/templates/public/images/wrapper-back-2.png +0 -0
  651. data/lib/generators/templates/public/images/wrapper-back.png +0 -0
  652. data/lib/generators/templates/public/images/yui-menubaritem_submenuindicator.png +0 -0
  653. data/lib/generators/templates/public/images/yui-menubaritem_submenuindicator_disabled.png +0 -0
  654. data/lib/generators/templates/public/images/yui-menuitem_checkbox.png +0 -0
  655. data/lib/generators/templates/public/images/yui-menuitem_checkbox_disabled.png +0 -0
  656. data/lib/generators/templates/public/images/yui-menuitem_submenuindicator.png +0 -0
  657. data/lib/generators/templates/public/images/yui-menuitem_submenuindicator_disabled.png +0 -0
  658. data/lib/generators/templates/public/images/yui-sprite.png +0 -0
  659. data/lib/generators/templates/public/javascripts/additional-methods.js +236 -0
  660. data/lib/generators/templates/public/javascripts/admin/address_states.js +25 -0
  661. data/lib/generators/templates/public/javascripts/admin/checkouts/edit.js +129 -0
  662. data/lib/generators/templates/public/javascripts/admin/orders/edit.js +23 -0
  663. data/lib/generators/templates/public/javascripts/admin/orders/edit_form.js +15 -0
  664. data/lib/generators/templates/public/javascripts/admin/payments/new.js +9 -0
  665. data/lib/generators/templates/public/javascripts/admin/unobtrusive_handlers.js +15 -0
  666. data/lib/generators/templates/public/javascripts/admin.js +226 -0
  667. data/lib/generators/templates/public/javascripts/application.js +12 -0
  668. data/lib/generators/templates/public/javascripts/calculator.js +15 -0
  669. data/lib/generators/templates/public/javascripts/checkout.js +64 -0
  670. data/lib/generators/templates/public/javascripts/datepicker.js +1445 -0
  671. data/lib/generators/templates/public/javascripts/gateway.js +13 -0
  672. data/lib/generators/templates/public/javascripts/jquery-1.3.2.min.js +19 -0
  673. data/lib/generators/templates/public/javascripts/jquery-1.4.2.min.js +154 -0
  674. data/lib/generators/templates/public/javascripts/jquery-and-plugins.js +36 -0
  675. data/lib/generators/templates/public/javascripts/jquery-ui.js +188 -0
  676. data/lib/generators/templates/public/javascripts/jquery.alerts/images/help.gif +0 -0
  677. data/lib/generators/templates/public/javascripts/jquery.alerts/images/important.gif +0 -0
  678. data/lib/generators/templates/public/javascripts/jquery.alerts/images/info.gif +0 -0
  679. data/lib/generators/templates/public/javascripts/jquery.alerts/images/title.gif +0 -0
  680. data/lib/generators/templates/public/javascripts/jquery.alerts/jquery.alerts.css +57 -0
  681. data/lib/generators/templates/public/javascripts/jquery.alerts/jquery.alerts.js +235 -0
  682. data/lib/generators/templates/public/javascripts/jquery.alerts/jquery.alerts.spree.css +30 -0
  683. data/lib/generators/templates/public/javascripts/jquery.autocomplete.min.js +13 -0
  684. data/lib/generators/templates/public/javascripts/jquery.js +19 -0
  685. data/lib/generators/templates/public/javascripts/jquery.suggest.js +276 -0
  686. data/lib/generators/templates/public/javascripts/jquery.template.js +255 -0
  687. data/lib/generators/templates/public/javascripts/jquery.tokeninput.js +618 -0
  688. data/lib/generators/templates/public/javascripts/jquery.validate.min.js +16 -0
  689. data/lib/generators/templates/public/javascripts/jrails.autocomplete.js +274 -0
  690. data/lib/generators/templates/public/javascripts/jrails.js +1 -0
  691. data/lib/generators/templates/public/javascripts/jsTree/jquery.tree.js +2058 -0
  692. data/lib/generators/templates/public/javascripts/jsTree/plugins/jquery.tree.contextmenu.js +129 -0
  693. data/lib/generators/templates/public/javascripts/jsTree/themes/apple/bg.jpg +0 -0
  694. data/lib/generators/templates/public/javascripts/jsTree/themes/apple/dot_for_ie.gif +0 -0
  695. data/lib/generators/templates/public/javascripts/jsTree/themes/apple/icons.png +0 -0
  696. data/lib/generators/templates/public/javascripts/jsTree/themes/apple/style.css +34 -0
  697. data/lib/generators/templates/public/javascripts/jsTree/themes/apple/throbber.gif +0 -0
  698. data/lib/generators/templates/public/javascripts/lang/af.js +40 -0
  699. data/lib/generators/templates/public/javascripts/lang/ar.js +50 -0
  700. data/lib/generators/templates/public/javascripts/lang/de.js +40 -0
  701. data/lib/generators/templates/public/javascripts/lang/du.js +40 -0
  702. data/lib/generators/templates/public/javascripts/lang/en.js +42 -0
  703. data/lib/generators/templates/public/javascripts/lang/es.js +41 -0
  704. data/lib/generators/templates/public/javascripts/lang/fi.js +40 -0
  705. data/lib/generators/templates/public/javascripts/lang/fr.js +44 -0
  706. data/lib/generators/templates/public/javascripts/lang/gr.js +40 -0
  707. data/lib/generators/templates/public/javascripts/lang/he.js +49 -0
  708. data/lib/generators/templates/public/javascripts/lang/it.js +13 -0
  709. data/lib/generators/templates/public/javascripts/lang/nl.js +40 -0
  710. data/lib/generators/templates/public/javascripts/lang/no.js +40 -0
  711. data/lib/generators/templates/public/javascripts/lang/pt.js +50 -0
  712. data/lib/generators/templates/public/javascripts/lang/ro.js +40 -0
  713. data/lib/generators/templates/public/javascripts/lang/ru.js +40 -0
  714. data/lib/generators/templates/public/javascripts/lang/sp.js +40 -0
  715. data/lib/generators/templates/public/javascripts/lang/sv.js +41 -0
  716. data/lib/generators/templates/public/javascripts/lang/ua.js +40 -0
  717. data/lib/generators/templates/public/javascripts/localization/messages_cn.js +24 -0
  718. data/lib/generators/templates/public/javascripts/localization/messages_cs.js +23 -0
  719. data/lib/generators/templates/public/javascripts/localization/messages_da.js +21 -0
  720. data/lib/generators/templates/public/javascripts/localization/messages_de.js +21 -0
  721. data/lib/generators/templates/public/javascripts/localization/messages_es.js +24 -0
  722. data/lib/generators/templates/public/javascripts/localization/messages_fr.js +23 -0
  723. data/lib/generators/templates/public/javascripts/localization/messages_hu.js +21 -0
  724. data/lib/generators/templates/public/javascripts/localization/messages_it.js +26 -0
  725. data/lib/generators/templates/public/javascripts/localization/messages_kk.js +23 -0
  726. data/lib/generators/templates/public/javascripts/localization/messages_nl.js +23 -0
  727. data/lib/generators/templates/public/javascripts/localization/messages_no.js +23 -0
  728. data/lib/generators/templates/public/javascripts/localization/messages_pl.js +23 -0
  729. data/lib/generators/templates/public/javascripts/localization/messages_ptbr.js +30 -0
  730. data/lib/generators/templates/public/javascripts/localization/messages_ro.js +24 -0
  731. data/lib/generators/templates/public/javascripts/localization/messages_ru.js +23 -0
  732. data/lib/generators/templates/public/javascripts/localization/messages_se.js +23 -0
  733. data/lib/generators/templates/public/javascripts/localization/messages_sk.js +21 -0
  734. data/lib/generators/templates/public/javascripts/localization/messages_tr.js +24 -0
  735. data/lib/generators/templates/public/javascripts/localization/messages_tw.js +24 -0
  736. data/lib/generators/templates/public/javascripts/localization/messages_ua.js +24 -0
  737. data/lib/generators/templates/public/javascripts/nested-attribute.js +26 -0
  738. data/lib/generators/templates/public/javascripts/open_id.js +15 -0
  739. data/lib/generators/templates/public/javascripts/product.js +49 -0
  740. data/lib/generators/templates/public/javascripts/rails.js +127 -0
  741. data/lib/generators/templates/public/javascripts/taxonomy.js +196 -0
  742. data/lib/generators/templates/public/javascripts/zone.js +40 -0
  743. data/lib/generators/templates/public/stylesheets/admin/admin-forms.css +159 -0
  744. data/lib/generators/templates/public/stylesheets/admin/admin-reset.css +67 -0
  745. data/lib/generators/templates/public/stylesheets/admin/admin-tables.css +39 -0
  746. data/lib/generators/templates/public/stylesheets/admin/admin-typography.css +117 -0
  747. data/lib/generators/templates/public/stylesheets/admin/admin.css +576 -0
  748. data/lib/generators/templates/public/stylesheets/admin/autocomplete.css +74 -0
  749. data/lib/generators/templates/public/stylesheets/admin/dashboard.css +143 -0
  750. data/lib/generators/templates/public/stylesheets/admin/edit_checkouts.css +57 -0
  751. data/lib/generators/templates/public/stylesheets/admin/grids.css +314 -0
  752. data/lib/generators/templates/public/stylesheets/admin/reset-fonts-grids-2-6-0.css +7 -0
  753. data/lib/generators/templates/public/stylesheets/admin/token-input.css +109 -0
  754. data/lib/generators/templates/public/stylesheets/admin/yui-includes.css +14 -0
  755. data/lib/generators/templates/public/stylesheets/datepicker.css +263 -0
  756. data/lib/generators/templates/public/stylesheets/jquery.autocomplete.css +48 -0
  757. data/lib/generators/templates/public/stylesheets/scaffold.css +54 -0
  758. data/lib/generators/templates/public/stylesheets/screen.css +1195 -0
  759. data/lib/generators/templates/spree_site.rb +8 -0
  760. data/lib/product_filters.rb +174 -0
  761. data/lib/redirect_legacy_product_url.rb +13 -0
  762. data/lib/scopes/dynamic.rb +38 -0
  763. data/lib/scopes/product.rb +242 -0
  764. data/lib/scopes/variant.rb +17 -0
  765. data/lib/scopes.rb +69 -0
  766. data/lib/seo_assist.rb +38 -0
  767. data/lib/spree/calculated_adjustments.rb +66 -0
  768. data/lib/spree/config.rb +31 -0
  769. data/lib/spree/current_order.rb +14 -0
  770. data/lib/spree/file_utilz.rb +73 -0
  771. data/lib/spree/gateway_error.rb +3 -0
  772. data/lib/spree/preference_access.rb +27 -0
  773. data/lib/spree/search/base.rb +21 -0
  774. data/lib/spree/search.rb +47 -0
  775. data/lib/spree_core/delegate_belongs_to.rb +95 -0
  776. data/lib/spree_core/enumerable_constants.rb +209 -0
  777. data/lib/spree_core/ext/active_record.rb +13 -0
  778. data/lib/spree_core/ext/array.rb +14 -0
  779. data/lib/spree_core/ext/string.rb +10 -0
  780. data/lib/spree_core/find_by_param.rb +117 -0
  781. data/lib/spree_core/preferences/mail_settings.rb +57 -0
  782. data/lib/spree_core/preferences/model_hooks.rb +293 -0
  783. data/lib/spree_core/preferences/preference_definition.rb +53 -0
  784. data/lib/spree_core/ssl_requirement.rb +109 -0
  785. data/lib/spree_core/theme_support/hook.rb +51 -0
  786. data/lib/spree_core/theme_support/hook_listener.rb +68 -0
  787. data/lib/spree_core/theme_support/hook_modifier.rb +35 -0
  788. data/lib/spree_core/theme_support/more_patches.rb +118 -0
  789. data/lib/spree_core/theme_support.rb +4 -0
  790. data/lib/spree_core/validation_group.rb +143 -0
  791. data/lib/spree_core.rb +144 -0
  792. data/lib/store_helpers.rb +10 -0
  793. data/lib/tasks/core.rake +112 -0
  794. data/lib/tasks/themes.rake +34 -0
  795. metadata +1027 -0
@@ -0,0 +1,536 @@
1
+ class Order < ActiveRecord::Base
2
+ # module Totaling
3
+ # def total
4
+ # map(&:amount).sum
5
+ # end
6
+ # end
7
+
8
+ attr_accessible :line_items, :bill_address, :ship_address
9
+ #attr_protected :charge_total, :item_total, :total, :user, :user_id, :number, :token
10
+
11
+ belongs_to :user
12
+
13
+ belongs_to :bill_address, :foreign_key => "bill_address_id", :class_name => "Address"
14
+ belongs_to :ship_address, :foreign_key => "ship_address_id", :class_name => "Address"
15
+ belongs_to :shipping_method
16
+ has_many :state_events, :as => :stateful
17
+ has_many :line_items, :dependent => :destroy
18
+ has_many :inventory_units
19
+ has_many :payments, :dependent => :destroy#, :extend => Totaling
20
+ has_many :shipments, :dependent => :destroy
21
+ has_many :return_authorizations, :dependent => :destroy
22
+
23
+ accepts_nested_attributes_for :line_items
24
+ accepts_nested_attributes_for :bill_address
25
+ accepts_nested_attributes_for :ship_address
26
+ accepts_nested_attributes_for :payments
27
+ accepts_nested_attributes_for :shipments
28
+
29
+ has_many :adjustments
30
+
31
+ before_create :create_user
32
+ before_create :generate_order_number
33
+
34
+ delegate :email, :to => :user
35
+ #delegate :ip_address, :to => :checkout
36
+ def ip_address
37
+ '192.168.1.100'
38
+ end
39
+ #delegate :special_instructions, :to => :checkout
40
+
41
+ #validates :item_total, :total, :numericality => true
42
+
43
+ scope :by_number, lambda {|number| where("orders.number = ?", number)}
44
+ scope :between, lambda {|*dates| where("orders.created_at between :start and :stop").where(:start, dates.first.to_date).where(:stop, dates.last.to_date)}
45
+ scope :by_customer, lambda {|customer| where("uses.email =?", customer).includes(:user)}
46
+ scope :by_state, lambda {|state| where("state = ?", state)}
47
+ scope :complete, where("orders.completed_at IS NOT NULL")
48
+ scope :incomplete, where("orders.completed_at IS NULL")
49
+
50
+ make_permalink :field => :number
51
+
52
+ # attr_accessible is a nightmare with attachment_fu, so use attr_protected instead.
53
+ attr_protected :charge_total, :item_total, :total, :user, :user_id, :number, :token #,:state
54
+
55
+ attr_accessor :out_of_stock_items
56
+
57
+ def to_param
58
+ number.to_s.parameterize.upcase
59
+ end
60
+
61
+ def complete?
62
+ !! completed_at
63
+ end
64
+
65
+ # Indicates whether or not the user is allowed to proceed to checkout. Currently this is implemented as a
66
+ # check for whether or not there is at least one LineItem in the Order. Feel free to override this logic
67
+ # in your own application if you require additional steps before allowing a checkout.
68
+ def checkout_allowed?
69
+ line_items.count > 0
70
+ end
71
+
72
+ # Indicates the number of items in the order
73
+ def item_count
74
+ line_items.map(&:quantity).sum
75
+ end
76
+
77
+ # order state machine (see http://github.com/pluginaweek/state_machine/tree/master for details)
78
+ state_machine :initial => 'cart', :use_transactions => false do
79
+
80
+ event :next do
81
+ transition :from => 'address', :to => 'delivery'
82
+ transition :from => 'delivery', :to => 'payment'
83
+ transition :from => 'payment', :to => 'confirm'
84
+ transition :from => 'confirm', :to => 'complete'
85
+ end
86
+ #TODO - add conditional confirmation step (only when gateway supports it, etc.)
87
+
88
+ event :cancel do
89
+ transition :to => 'canceled', :if => :allow_cancel?
90
+ end
91
+ event :return do
92
+ transition :to => 'returned', :from => 'awaiting_return'
93
+ end
94
+ event :resume do
95
+ transition :to => 'resumed', :from => 'canceled', :if => :allow_resume?
96
+ end
97
+ event :authorize_return do
98
+ transition :to => 'awaiting_return'
99
+ end
100
+
101
+ before_transition :to => 'complete', :do => :process_payments!
102
+ after_transition :to => 'complete', :do => :finalize!
103
+ after_transition :to => 'delivery', :do => :create_tax_charge!
104
+ after_transition :to => 'payment', :do => :create_shipment_and_shipping_charge!
105
+
106
+ end
107
+
108
+ # Indicates whether there are any backordered InventoryUnits associated with the Order.
109
+ def backordered?
110
+ inventory_units.backorder.present?
111
+ end
112
+
113
+ # This is a multi-purpose method for processing logic related to changes in the Order. It is meant to be called from
114
+ # various observers so that the Order is aware of changes that affect totals and other values stored in the Order.
115
+ # This method should never do anything to the Order that results in a save call on the object (otherwise you will end
116
+ # up in an infinite recursion as the associations try to save and then in turn try to call +update!+ again.)
117
+ def update!
118
+ update_totals
119
+ update_shipment_state
120
+ update_payment_state
121
+ update_adjustments
122
+ # update totals a second time in case updated adjustments have an effect on the total
123
+ update_totals
124
+ update_attributes_without_callbacks({
125
+ :payment_state => payment_state,
126
+ :shipment_state => shipment_state,
127
+ :item_total => item_total,
128
+ :adjustment_total => adjustment_total,
129
+ :payment_total => payment_total,
130
+ :total => total
131
+ })
132
+ end
133
+
134
+ def restore_state
135
+ # pop the resume event so we can see what the event before that was
136
+ state_events.pop if state_events.last.name == "resume"
137
+ update_attribute("state", state_events.last.previous_state)
138
+
139
+ if paid?
140
+ InventoryUnit.sell_units(self) if inventory_units.empty?
141
+ shipment.inventory_units = inventory_units
142
+ shipment.ready!
143
+ end
144
+
145
+ end
146
+
147
+ before_validation :clone_billing_address, :if => "@use_billing"
148
+ attr_accessor :use_billing
149
+
150
+ def clone_billing_address
151
+ if bill_address and self.ship_address.nil?
152
+ self.ship_address = bill_address.clone
153
+ else
154
+ self.ship_address.attributes = bill_address.attributes.except("id", "updated_at", "created_at")
155
+ end
156
+ true
157
+ end
158
+
159
+
160
+
161
+ # def make_shipments_shipped
162
+ # shipments.reject(&:shipped?).each do |shipment|
163
+ # shipment.update_attributes(:state => 'shipped', :shipped_at => Time.now)
164
+ # end
165
+ # end
166
+ #
167
+ # def make_shipments_ready
168
+ # shipments.each(&:ready)
169
+ # end
170
+ #
171
+ # def make_shipments_pending
172
+ # shipments.each(&:pend)
173
+ # end
174
+ #
175
+ # def shipped_units
176
+ # shipped_units = shipments.inject([]) { |units, shipment| units.concat(shipment.shipped? ? shipment.inventory_units : []) }
177
+ # return nil if shipped_units.empty?
178
+ #
179
+ # shipped = {}
180
+ # shipped_units.group_by(&:variant_id).each do |variant_id, ship_units|
181
+ # shipped[Variant.find(variant_id)] = ship_units.size
182
+ # end
183
+ # shipped
184
+ # end
185
+
186
+ # def returnable_units
187
+ # returned_units = return_authorizations.inject([]) { |units, return_auth| units << return_auth.inventory_units}
188
+ # returned_units.flatten! unless returned_units.nil?
189
+ #
190
+ # returnable = shipped_units
191
+ # return if returnable.nil?
192
+ #
193
+ # returned_units.group_by(&:variant_id).each do |variant_id, returned_units|
194
+ # variant = returnable.detect { |ru| ru.first.id == variant_id }[0]
195
+ #
196
+ # count = returnable[variant] - returned_units.size
197
+ # if count > 0
198
+ # returnable[variant] = returnable[variant] - returned_units.size
199
+ # else
200
+ # returnable.delete variant
201
+ # end
202
+ # end
203
+ #
204
+ # returnable.empty? ? nil : returnable
205
+ # end
206
+
207
+ def allow_cancel?
208
+ self.state != 'canceled'
209
+ end
210
+
211
+ def allow_resume?
212
+ # we shouldn't allow resume for legacy orders b/c we lack the information necessary to restore to a previous state
213
+ return false if state_events.empty? || state_events.last.previous_state.nil?
214
+ true
215
+ end
216
+
217
+ def add_variant(variant, quantity = 1)
218
+ current_item = contains?(variant)
219
+ if current_item
220
+ current_item.quantity += quantity
221
+ current_item.save
222
+ else
223
+ current_item = LineItem.new(:quantity => quantity)
224
+ current_item.variant = variant
225
+ current_item.price = variant.price
226
+ self.line_items << current_item
227
+ end
228
+
229
+ # populate line_items attributes for additional_fields entries
230
+ # that have populate => [:line_item]
231
+ Variant.additional_fields.select{|f| !f[:populate].nil? && f[:populate].include?(:line_item) }.each do |field|
232
+ value = ""
233
+
234
+ if field[:only].nil? || field[:only].include?(:variant)
235
+ value = variant.send(field[:name].gsub(" ", "_").downcase)
236
+ elsif field[:only].include?(:product)
237
+ value = variant.product.send(field[:name].gsub(" ", "_").downcase)
238
+ end
239
+ current_item.update_attribute(field[:name].gsub(" ", "_").downcase, value)
240
+ end
241
+
242
+ current_item
243
+ end
244
+
245
+ def generate_order_number
246
+ record = true
247
+ while record
248
+ random = "R#{Array.new(9){rand(9)}.join}"
249
+ record = Order.find(:first, :conditions => ["number = ?", random])
250
+ end
251
+ self.number = random
252
+ end
253
+
254
+ # convenience method since many stores will not allow user to create multiple shipments
255
+ def shipment
256
+ @shipment ||= shipments.last
257
+ end
258
+
259
+ def contains?(variant)
260
+ line_items.detect{|line_item| line_item.variant_id == variant.id}
261
+ end
262
+
263
+ # def mark_shipped
264
+ # inventory_units.each do |inventory_unit|
265
+ # inventory_unit.ship!
266
+ # end
267
+ # end
268
+
269
+ # TODO: Re-implement these 4 methods
270
+ def ship_total
271
+ # shipping_charges.reload.map(&:amount).sum
272
+ 0
273
+ end
274
+
275
+ def tax_total
276
+ # tax_charges.reload.map(&:amount).sum
277
+ 0
278
+ end
279
+
280
+ def credit_total
281
+ # credits.reload.map(&:amount).sum.abs
282
+ 0
283
+ end
284
+
285
+ def charge_total
286
+ # charges.reload.map(&:amount).sum
287
+ 0
288
+ end
289
+
290
+ # Creates a new tax charge if applicable. Uses the highest possible matching rate and destroys any previous
291
+ # tax charges if they were created by rates that no longer apply.
292
+ def create_tax_charge!
293
+ return unless rate = TaxRate.match(bill_address) or adjustments.tax.present?
294
+ if old_charge = adjustments.tax.first
295
+ old_charge.destroy unless old_charge.originator == rate
296
+ return
297
+ end
298
+ rate.create_adjustment(I18n.t(:tax), self, self, true)
299
+ end
300
+
301
+ def create_shipment_and_shipping_charge!
302
+ shipping_method.reload
303
+ if shipment.present?
304
+ shipment.update_attributes(:shipping_method => shipping_method)
305
+ else
306
+ self.shipments << Shipment.create(:order => self, :shipping_method => shipping_method)
307
+ end
308
+ if shipping_charge = adjustments.shipping.first
309
+ # shipping_charge.update_attributes(:originator_id => shipping_method.id)
310
+ shipping_charge.originator = shipping_method
311
+ shipping_charge.save
312
+ else
313
+ shipping_method.create_adjustment(I18n.t(:shipping), self, shipment, true)
314
+ end
315
+ end
316
+
317
+ def outstanding_balance
318
+ total - payment_total
319
+ end
320
+
321
+ def destroy_inapplicable_adjustments
322
+ destroyed = adjustments.reject(&:applicable?).map(&:destroy)
323
+ adjustments.reload if destroyed.any?
324
+ end
325
+
326
+ def name
327
+ address = bill_address || ship_address
328
+ "#{address.firstname} #{address.lastname}" if address
329
+ end
330
+
331
+ # def outstanding_balance?
332
+ # outstanding_balance > 0
333
+ # end
334
+ #
335
+ # def outstanding_credit
336
+ # [0, payments.total - total].max
337
+ # end
338
+ #
339
+ # def outstanding_credit?
340
+ # outstanding_credit > 0
341
+ # end
342
+
343
+ # def creditcards
344
+ # creditcard_ids = (payments.from_creditcard + checkout.payments.from_creditcard).map(&:source_id).uniq
345
+ # Creditcard.scoped(:conditions => {:id => creditcard_ids})
346
+ # end
347
+
348
+ # Indicates whether order has a real user associated with it or just a placeholder anonymous user
349
+ def anonymous?
350
+ user && user.anonymous?
351
+ end
352
+
353
+ # Associates the order with a registered user (replacing the previously associated guest user)
354
+ #
355
+ # throws an Exception if there is already a registered user associated with the order
356
+ def register!(user)
357
+ raise "Already registred" if user and not user.anonymous?
358
+ self.user = user and save!
359
+ end
360
+
361
+ def process_payments!
362
+ payments.each(&:process!)
363
+ end
364
+
365
+ # Finalizes an in progress order after checkout is complete.
366
+ # Called after transition to complete state when payments will have been processed
367
+ def finalize!
368
+ self.out_of_stock_items = InventoryUnit.sell_units(self)
369
+ shipments.create(:inventory_units => inventory_units.reload)
370
+ update_attribute(:completed_at, Time.now)
371
+ end
372
+
373
+
374
+ # Helper methods for checkout steps
375
+
376
+ def available_shipping_methods(display_on = nil)
377
+ return [] unless ship_address
378
+ ShippingMethod.all_available(self, display_on)
379
+ end
380
+
381
+ def rate_hash
382
+ begin
383
+ @rate_hash ||= available_shipping_methods(:front_end).collect do |ship_method|
384
+ { :id => ship_method.id,
385
+ :shipping_method => ship_method,
386
+ :name => ship_method.name,
387
+ :cost => ship_method.calculator.compute(self)
388
+ }
389
+ end.sort_by{|r| r[:cost]}
390
+ rescue Spree::ShippingError => ship_error
391
+ flash[:error] = ship_error.to_s
392
+ []
393
+ end
394
+ end
395
+
396
+ def payment
397
+ payments.first
398
+ end
399
+
400
+ def available_payment_methods
401
+ @available_payment_methods ||= PaymentMethod.available(:front_end)
402
+ end
403
+
404
+ def payment_method
405
+ if payment and payment.payment_method
406
+ payment.payment_method
407
+ else
408
+ available_payment_methods.first
409
+ end
410
+ end
411
+
412
+ def billing_firstname
413
+ bill_address.try(:firstname)
414
+ end
415
+
416
+ def billing_lastname
417
+ bill_address.try(:lastname)
418
+ end
419
+
420
+
421
+
422
+
423
+ private
424
+ # def complete_order
425
+ # self.adjustments.each(&:update_amount)
426
+ # update_attribute(:completed_at, Time.now)
427
+ #
428
+ # if email
429
+ # OrderMailer.confirm(self).deliver
430
+ # end
431
+ #
432
+ # begin
433
+ # @out_of_stock_items = InventoryUnit.sell_units(self)
434
+ # update_totals unless @out_of_stock_items.empty?
435
+ # shipment.inventory_units = inventory_units
436
+ # save!
437
+ # rescue Exception => e
438
+ # logger.error "Problem saving authorized order: #{e.message}"
439
+ # logger.error self.to_yaml
440
+ # end
441
+ # end
442
+ #
443
+ # def cancel_order
444
+ # make_shipments_pending
445
+ # restock_inventory
446
+ # OrderMailer.cancel(self).deliver
447
+ # end
448
+ #
449
+ # def restock_inventory
450
+ # inventory_units.each do |inventory_unit|
451
+ # inventory_unit.restock! if inventory_unit.can_restock?
452
+ # end
453
+ #
454
+ # inventory_units.reload
455
+ # end
456
+ #
457
+ # def update_line_items
458
+ # to_wipe = self.line_items.select {|li| 0 == li.quantity || li.quantity.nil? }
459
+ # LineItem.destroy(to_wipe)
460
+ # self.line_items -= to_wipe # important: remove defunct items, avoid a reload
461
+ # end
462
+
463
+ def create_user
464
+ self.user ||= User.anonymous!
465
+ end
466
+
467
+ # Updates the +shipment_state+ attribute according to the following logic:
468
+ #
469
+ # shipped when all Shipments are in the "shipped" state
470
+ # partial when at least one Shipment has a state of "shipped" and there is another Shipment with a state other than "shipped"
471
+ # or there are InventoryUnits associated with the order that have a state of "sold" but are not associated with a Shipment.
472
+ # ready when all Shipments are in the "ready" state
473
+ # backorder when there is backordered inventory associated with an order
474
+ #
475
+ # The +shipment_state+ value helps with reporting, etc. since it provides a quick and easy way to locate Orders needing attention.
476
+ def update_shipment_state
477
+ self.shipment_state =
478
+ case shipments.count
479
+ when 0
480
+ nil
481
+ when shipments.shipped.count
482
+ "shipped"
483
+ when shipments.ready.count
484
+ "ready"
485
+ else
486
+ "partial"
487
+ end
488
+ self.shipment_state = "backorder" if backordered?
489
+ end
490
+
491
+ # Updates the +payment_state+ attribute according to the following logic:
492
+ #
493
+ # paid when +payment_total+ is equal to +total+
494
+ # balance_due when +payment_total+ is less than +total+
495
+ # credit_owed when +payment_total+ is greater than +total+
496
+ #
497
+ # The +payment_state+ value helps with reporting, etc. since it provides a quick and easy way to locate Orders needing attention.
498
+ def update_payment_state
499
+ if payment_total < total
500
+ self.payment_state = "balance_due"
501
+ elsif payment_total > total
502
+ self.payment_state = "credit_owed"
503
+ else
504
+ self.payment_state = "paid"
505
+ end
506
+ end
507
+
508
+ # Updates the following Order total values:
509
+ #
510
+ # +payment_total+ The total value of all finalized Payments (NOTE: non-finalized Payments are excluded)
511
+ # +item_total+ The total value of all LineItems
512
+ # +adjustment_total+ The total value of all adjustments (promotions, credits, etc.)
513
+ # +total+ The so-called "order total." This is equivalent to +item_total+ plus +adjustment_total+.
514
+ def update_totals
515
+ # update_adjustments
516
+ self.payment_total = payments.completed.map(&:amount).sum
517
+ self.item_total = line_items.map(&:amount).sum
518
+ self.adjustment_total = adjustments.map(&:amount).sum
519
+ self.total = item_total + adjustment_total
520
+ end
521
+
522
+ # Updates each of the Order adjustments. This is intended to be called from an Observer so that the Order can
523
+ # respond to external changes to LineItem, Shipment, other Adjustments, etc. Adjustments that are no longer
524
+ # applicable will be removed from the association and destroyed.
525
+ def update_adjustments
526
+ # separate into adjustments to keep and adjustements to toss
527
+ obsolete_adjustments = adjustments.select{|adjustment| !adjustment.applicable?}
528
+ obsolete_adjustments.each(&:destroy)
529
+ self.adjustments.reload.each(&:update!)
530
+ end
531
+
532
+ # def create_shipment
533
+ # self.shipments << Shipment.create(:order => self)
534
+ # end
535
+
536
+ end
@@ -0,0 +1,24 @@
1
+ class OrderMailer < ActionMailer::Base
2
+ helper "spree/base"
3
+ default :from => Spree::Config[:order_from]
4
+
5
+ def confirm(order, resend = false)
6
+ @subject = (resend ? "[RESEND] " : "")
7
+ @subject += Spree::Config[:site_name] + ' ' + 'Order Confirmation #' + order.number
8
+ mail(:subject => @subject, :body => {"order" => order}, :to => order.email, :bcc => order_bcc)
9
+ end
10
+
11
+ def cancel(order)
12
+ @subject = '[CANCEL]' + Spree::Config[:site_name] + ' Order Confirmation #' + order.number
13
+ mail(:subject => @subject, :body => {"order" => order}, :to => order.email, :bcc => order_bcc)
14
+ end
15
+
16
+ private
17
+ def order_bcc
18
+ bcc = [Spree::Config[:order_bcc] || "", Spree::Config[:mail_bcc] || ""]
19
+ bcc = bcc.inject([]){|array, config_string| array + config_string.split(",")}
20
+ bcc = bcc.collect{|email| email.strip}
21
+ bcc = bcc.uniq
22
+ bcc
23
+ end
24
+ end
@@ -0,0 +1,136 @@
1
+ class Payment < ActiveRecord::Base
2
+ belongs_to :order
3
+ belongs_to :source, :polymorphic => true
4
+ belongs_to :payment_method
5
+
6
+ has_many :transactions
7
+ alias :txns :transactions
8
+ has_many :offsets, :class_name => 'Payment', :foreign_key => 'source_id', :conditions => "source_type = 'Payment' AND amount < 0"
9
+
10
+ after_save :create_payment_profile, :if => :payment_profiles_supported?
11
+
12
+ # update the order totals, etc.
13
+ after_save {order.try(:update!)}
14
+
15
+ #after_save :check_payments
16
+ #after_destroy :check_payments
17
+
18
+ accepts_nested_attributes_for :source
19
+
20
+ #validate :amount_is_valid_for_outstanding_balance_or_credit
21
+ validates :payment_method, :presence => true, :if => Proc.new { |payable| payable.is_a? Checkout }
22
+
23
+ scope :from_creditcard, where(:source_type => 'Creditcard')
24
+ scope :with_state, lambda {|s| where(:state => s)}
25
+ scope :completed, with_state('completed')
26
+
27
+
28
+
29
+ # order state machine (see http://github.com/pluginaweek/state_machine/tree/master for details)
30
+ state_machine :initial => 'checkout' do
31
+ # With card payments, happens before purchase or authorization happens
32
+ event :started_processing do
33
+ transition :from => ['checkout', 'pending', 'completed'], :to => 'processing'
34
+ end
35
+ # When processing during checkout fails
36
+ event :fail do
37
+ transition :from => 'processing', :to => 'failed'
38
+ end
39
+ # With card payments this represents authorizing the payment
40
+ event :pend do
41
+ transition :from => 'processing', :to => 'pending'
42
+ end
43
+ # With card payments this represents completing a purchase or capture transaction
44
+ event :complete do
45
+ transition :from => ['processing', 'pending'], :to => 'completed'
46
+ end
47
+ event :void do
48
+ transition :from => ['pending', 'complete'], :to => 'void'
49
+ end
50
+ end
51
+
52
+
53
+ def offsets_total
54
+ offsets.map(&:amount).sum
55
+ end
56
+
57
+ def credit_allowed
58
+ amount - offsets_total
59
+ end
60
+
61
+ def can_credit?
62
+ credit_allowed > 0
63
+ end
64
+
65
+ def credit(amount)
66
+ return if amount > credit_allowed
67
+ started_processing!
68
+ source.credit(self, amount)
69
+ end
70
+
71
+ # With nested attributes, Rails calls build_[association_name] for the nested model which won't work for a polymorphic association
72
+ def build_source(params)
73
+ if payment_method and payment_method.payment_source_class
74
+ self.source = payment_method.payment_source_class.new(params)
75
+ end
76
+ end
77
+
78
+ def process!
79
+ if !processing? and source and source.respond_to?(:process!)
80
+ started_processing!
81
+ source.process!(self) # source is responsible for updating the payment state when it's done processing
82
+ end
83
+ end
84
+
85
+ def actions
86
+ return [] unless source and source.respond_to? :actions
87
+ source.actions.select { |action| !source.respond_to?("can_#{action}?") or source.send("can_#{action}?", self) }
88
+ end
89
+
90
+ private
91
+
92
+ # def check_payments
93
+ # return unless order and order.complete?
94
+ # #sorting by created_at.to_f to ensure millisecond percsision, plus ID - just in case
95
+ # events = order.state_events.sort_by { |e| [e.created_at.to_f, e.id] }.reverse
96
+ # # TODO: think the below implementation will need replacing
97
+ # # if order.returnable_units.nil? && order.return_authorizations.size >0
98
+ # # order.return!
99
+ # # elsif events.present? and %w(over_paid under_paid).include?(events.first.name)
100
+ # # events.each do |event|
101
+ # # if %w(shipped paid new).include?(event.previous_state)
102
+ # # order.pay!
103
+ # # order.update_attribute("state", event.previous_state) if %w(shipped returned).include?(event.previous_state)
104
+ # # return
105
+ # # end
106
+ # # end
107
+ # # elsif order.payment_total >= order.total
108
+ # # order.pay!
109
+ # # end
110
+ # end
111
+
112
+ def amount_is_valid_for_outstanding_balance_or_credit
113
+ return unless order
114
+ if amount < 0
115
+ if amount.abs > order.outstanding_credit
116
+ errors.add(:amount, "Is greater than the credit owed (#{order.outstanding_credit})")
117
+ end
118
+ else
119
+ if amount > order.outstanding_balance
120
+ errors.add(:amount, "Is greater than the outstanding balance (#{order.outstanding_balance})")
121
+ end
122
+ end
123
+ end
124
+
125
+ def payment_profiles_supported?
126
+ source && source.respond_to?(:payment_gateway) && source.payment_gateway && source.payment_gateway.payment_profiles_supported?
127
+ end
128
+
129
+ def create_payment_profile
130
+ return unless payment_profiles_supported? and source.number and !source.has_payment_profile?
131
+ source.payment_gateway.create_profile(self)
132
+ rescue ActiveMerchant::ConnectionError => e
133
+ gateway_error I18n.t(:unable_to_connect_to_gateway)
134
+ end
135
+
136
+ end
@@ -0,0 +1,2 @@
1
+ class PaymentMethod::Check < PaymentMethod
2
+ end