muck-commerce 0.1.8

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 (773) hide show
  1. data/.document +5 -0
  2. data/.gitignore +31 -0
  3. data/LICENSE +20 -0
  4. data/README.rdoc +107 -0
  5. data/Rakefile +64 -0
  6. data/VERSION +1 -0
  7. data/app/controllers/admin/muck/billing_informations_controller.rb +45 -0
  8. data/app/controllers/admin/muck/coupons_controller.rb +68 -0
  9. data/app/controllers/admin/muck/orders_controller.rb +23 -0
  10. data/app/controllers/admin/muck/subscription_plans_controller.rb +57 -0
  11. data/app/controllers/admin/muck/subscriptions_controller.rb +7 -0
  12. data/app/controllers/muck/billing_informations_controller.rb +54 -0
  13. data/app/controllers/muck/cart_items_controller.rb +23 -0
  14. data/app/controllers/muck/carts_controller.rb +17 -0
  15. data/app/controllers/muck/orders_controller.rb +127 -0
  16. data/app/controllers/muck/subscriptions_controller.rb +105 -0
  17. data/app/helpers/muck_cart_helper.rb +7 -0
  18. data/app/helpers/muck_commerce_helper.rb +3 -0
  19. data/app/models/muck_commerce_mailer.rb +27 -0
  20. data/app/views/admin/billing_informations/edit.html.erb +23 -0
  21. data/app/views/admin/billing_informations/new.html.erb +0 -0
  22. data/app/views/admin/coupons/_coupon.html.erb +12 -0
  23. data/app/views/admin/coupons/_form.html.erb +24 -0
  24. data/app/views/admin/coupons/bulk.html.erb +27 -0
  25. data/app/views/admin/coupons/edit.html.erb +5 -0
  26. data/app/views/admin/coupons/index.html.erb +26 -0
  27. data/app/views/admin/coupons/new.html.erb +5 -0
  28. data/app/views/admin/order_transactions/_order_transaction.html.erb +9 -0
  29. data/app/views/admin/order_transactions/index.html.erb +0 -0
  30. data/app/views/admin/orders/_order.html.erb +8 -0
  31. data/app/views/admin/orders/index.csv.erb +6 -0
  32. data/app/views/admin/orders/index.html.erb +12 -0
  33. data/app/views/admin/orders/show.html.erb +26 -0
  34. data/app/views/admin/subscription_plans/_form.html.erb +6 -0
  35. data/app/views/admin/subscription_plans/edit.html.erb +7 -0
  36. data/app/views/admin/subscription_plans/index.html.erb +26 -0
  37. data/app/views/admin/subscription_plans/new.html.erb +7 -0
  38. data/app/views/admin/subscription_plans/show.html.erb +0 -0
  39. data/app/views/billing_informations/_billing_information.html.erb +8 -0
  40. data/app/views/billing_informations/_form.html.erb +15 -0
  41. data/app/views/billing_informations/cvv_info.html.erb +0 -0
  42. data/app/views/billing_informations/edit.html.erb +6 -0
  43. data/app/views/billing_informations/index.html.erb +16 -0
  44. data/app/views/billing_informations/new.html.erb +6 -0
  45. data/app/views/carts/show.html.erb +0 -0
  46. data/app/views/muck_commerce_mailer/coupon_code.text.html.erb +0 -0
  47. data/app/views/muck_commerce_mailer/coupon_code.text.plain.erb +0 -0
  48. data/app/views/muck_commerce_mailer/user_subscribe_notification.text.html.erb +0 -0
  49. data/app/views/muck_commerce_mailer/user_subscribe_notification.text.plain.erb +0 -0
  50. data/app/views/orders/index.html.erb +0 -0
  51. data/app/views/orders/new.html.erb +0 -0
  52. data/app/views/orders/show.html.erb +0 -0
  53. data/app/views/subscriptions/confirm.html.erb +0 -0
  54. data/app/views/subscriptions/confirm_unsubscribe.html.erb +0 -0
  55. data/app/views/subscriptions/new.html.erb +0 -0
  56. data/app/views/subscriptions/receipt.html.erb +0 -0
  57. data/app/views/subscriptions/show.html.erb +0 -0
  58. data/config/muck_commerce_routes.rb +21 -0
  59. data/db/migrate/20091230220327_create_muck_commerce.rb +144 -0
  60. data/db/migrate/20100119221052_add_name_to_billing.rb +9 -0
  61. data/db/migrate/20100120060511_add_company_to_billing.rb +9 -0
  62. data/db/migrate/20100228060913_create_subscription_coupons.rb +14 -0
  63. data/db/migrate/20100309183304_add_coupon_subscrption_uses.rb +11 -0
  64. data/db/migrate/20100310180031_create_coupon_types.rb +15 -0
  65. data/lib/action_controller/muck_billing_application.rb +77 -0
  66. data/lib/active_record/acts/muck_billing_information.rb +231 -0
  67. data/lib/active_record/acts/muck_cart.rb +56 -0
  68. data/lib/active_record/acts/muck_cart_coupon.rb +35 -0
  69. data/lib/active_record/acts/muck_commerce_user.rb +64 -0
  70. data/lib/active_record/acts/muck_coupon.rb +137 -0
  71. data/lib/active_record/acts/muck_coupon_type.rb +34 -0
  72. data/lib/active_record/acts/muck_order.rb +155 -0
  73. data/lib/active_record/acts/muck_order_coupon.rb +36 -0
  74. data/lib/active_record/acts/muck_order_transaction.rb +209 -0
  75. data/lib/active_record/acts/muck_subscription.rb +289 -0
  76. data/lib/active_record/acts/muck_subscription_plan.rb +34 -0
  77. data/lib/muck_commerce/cart_methods.rb +54 -0
  78. data/lib/muck_commerce/configure.rb +94 -0
  79. data/lib/muck_commerce/currency_methods.rb +36 -0
  80. data/lib/muck_commerce/discount_methods.rb +17 -0
  81. data/lib/muck_commerce/exceptions.rb +8 -0
  82. data/lib/muck_commerce/initialize_routes.rb +8 -0
  83. data/lib/muck_commerce/muck_custom_form_builder.rb +22 -0
  84. data/lib/muck_commerce/order_methods.rb +19 -0
  85. data/lib/muck_commerce/paypal_methods.rb +28 -0
  86. data/lib/muck_commerce/tasks.rb +41 -0
  87. data/lib/muck_commerce.rb +38 -0
  88. data/lib/muck_commerce_test_helper.rb +2 -0
  89. data/lib/test/muck_commerce_factories.rb +130 -0
  90. data/lib/test/muck_commerce_test_definitions.rb +30 -0
  91. data/locales/en.yml +84 -0
  92. data/muck-commerce.gemspec +917 -0
  93. data/rails/init.rb +4 -0
  94. data/test/rails_root/.gitignore +8 -0
  95. data/test/rails_root/.rake_tasks +103 -0
  96. data/test/rails_root/Rakefile +16 -0
  97. data/test/rails_root/app/controllers/application_controller.rb +21 -0
  98. data/test/rails_root/app/controllers/default_controller.rb +7 -0
  99. data/test/rails_root/app/controllers/profiles_controller.rb +3 -0
  100. data/test/rails_root/app/controllers/users_controller.rb +3 -0
  101. data/test/rails_root/app/helpers/application_helper.rb +3 -0
  102. data/test/rails_root/app/models/billing_information.rb +5 -0
  103. data/test/rails_root/app/models/cart.rb +3 -0
  104. data/test/rails_root/app/models/cart_coupon.rb +3 -0
  105. data/test/rails_root/app/models/coupon.rb +3 -0
  106. data/test/rails_root/app/models/order.rb +3 -0
  107. data/test/rails_root/app/models/order_coupon.rb +3 -0
  108. data/test/rails_root/app/models/order_transaction.rb +3 -0
  109. data/test/rails_root/app/models/profile.rb +3 -0
  110. data/test/rails_root/app/models/subscription.rb +3 -0
  111. data/test/rails_root/app/models/subscription_plan.rb +3 -0
  112. data/test/rails_root/app/models/user.rb +8 -0
  113. data/test/rails_root/app/models/user_session.rb +2 -0
  114. data/test/rails_root/app/views/default/index.html.erb +0 -0
  115. data/test/rails_root/app/views/layouts/default.html.erb +26 -0
  116. data/test/rails_root/config/boot.rb +109 -0
  117. data/test/rails_root/config/database.yml +15 -0
  118. data/test/rails_root/config/environment.rb +37 -0
  119. data/test/rails_root/config/environments/development.rb +20 -0
  120. data/test/rails_root/config/environments/production.rb +1 -0
  121. data/test/rails_root/config/environments/test.rb +25 -0
  122. data/test/rails_root/config/initializers/geokit_config.rb +63 -0
  123. data/test/rails_root/config/initializers/inflections.rb +10 -0
  124. data/test/rails_root/config/initializers/mime_types.rb +5 -0
  125. data/test/rails_root/config/initializers/requires.rb +13 -0
  126. data/test/rails_root/config/initializers/session_store.rb +8 -0
  127. data/test/rails_root/config/routes.rb +12 -0
  128. data/test/rails_root/db/migrate/20090320174818_create_muck_permissions_and_roles.rb +16 -0
  129. data/test/rails_root/db/migrate/20090327231918_create_users.rb +40 -0
  130. data/test/rails_root/db/migrate/20090402234137_create_languages.rb +18 -0
  131. data/test/rails_root/db/migrate/20090426041056_create_countries.rb +15 -0
  132. data/test/rails_root/db/migrate/20090426041103_create_states.rb +18 -0
  133. data/test/rails_root/db/migrate/20090512013727_create_profiles.rb +21 -0
  134. data/test/rails_root/db/migrate/20091124203137_add_location_to_profiles.rb +15 -0
  135. data/test/rails_root/db/migrate/20091124205819_add_fields_to_profiles.rb +21 -0
  136. data/test/rails_root/db/migrate/20091230220327_create_muck_commerce.rb +146 -0
  137. data/test/rails_root/db/migrate/20100119221052_add_name_to_billing.rb +9 -0
  138. data/test/rails_root/db/migrate/20100120060511_add_company_to_billing.rb +9 -0
  139. data/test/rails_root/db/migrate/20100123035450_create_access_codes.rb +19 -0
  140. data/test/rails_root/db/migrate/20100123233654_create_access_code_requests.rb +14 -0
  141. data/test/rails_root/db/migrate/20100206000906_remove_name_fields.rb +15 -0
  142. data/test/rails_root/db/migrate/20100309183304_add_coupon_subscrption_uses.rb +11 -0
  143. data/test/rails_root/db/migrate/20100310180031_create_coupon_types.rb +15 -0
  144. data/test/rails_root/features/step_definitions/webrat_steps.rb +99 -0
  145. data/test/rails_root/features/support/env.rb +14 -0
  146. data/test/rails_root/lib/tasks/muck.rake +7 -0
  147. data/test/rails_root/lib/tasks/remote.rake +22 -0
  148. data/test/rails_root/public/.htaccess +40 -0
  149. data/test/rails_root/public/404.html +30 -0
  150. data/test/rails_root/public/422.html +30 -0
  151. data/test/rails_root/public/500.html +30 -0
  152. data/test/rails_root/public/dispatch.rb +10 -0
  153. data/test/rails_root/public/favicon.ico +0 -0
  154. data/test/rails_root/public/images/admin/Home.gif +0 -0
  155. data/test/rails_root/public/images/admin/roles.gif +0 -0
  156. data/test/rails_root/public/images/admin/source/Home.png +0 -0
  157. data/test/rails_root/public/images/admin/source/User.png +0 -0
  158. data/test/rails_root/public/images/admin/source/roles.png +0 -0
  159. data/test/rails_root/public/images/admin/user.gif +0 -0
  160. data/test/rails_root/public/images/arrow_down.gif +0 -0
  161. data/test/rails_root/public/images/arrow_left.gif +0 -0
  162. data/test/rails_root/public/images/arrow_right.gif +0 -0
  163. data/test/rails_root/public/images/arrow_up.gif +0 -0
  164. data/test/rails_root/public/images/blue/preview.gif +0 -0
  165. data/test/rails_root/public/images/fancybox/fancy_closebox.png +0 -0
  166. data/test/rails_root/public/images/fancybox/fancy_left.png +0 -0
  167. data/test/rails_root/public/images/fancybox/fancy_progress.png +0 -0
  168. data/test/rails_root/public/images/fancybox/fancy_right.png +0 -0
  169. data/test/rails_root/public/images/fancybox/fancy_shadow_e.png +0 -0
  170. data/test/rails_root/public/images/fancybox/fancy_shadow_n.png +0 -0
  171. data/test/rails_root/public/images/fancybox/fancy_shadow_ne.png +0 -0
  172. data/test/rails_root/public/images/fancybox/fancy_shadow_nw.png +0 -0
  173. data/test/rails_root/public/images/fancybox/fancy_shadow_s.png +0 -0
  174. data/test/rails_root/public/images/fancybox/fancy_shadow_se.png +0 -0
  175. data/test/rails_root/public/images/fancybox/fancy_shadow_sw.png +0 -0
  176. data/test/rails_root/public/images/fancybox/fancy_shadow_w.png +0 -0
  177. data/test/rails_root/public/images/fancybox/fancy_title_left.png +0 -0
  178. data/test/rails_root/public/images/fancybox/fancy_title_main.png +0 -0
  179. data/test/rails_root/public/images/fancybox/fancy_title_right.png +0 -0
  180. data/test/rails_root/public/images/icons/accept.png +0 -0
  181. data/test/rails_root/public/images/icons/add.png +0 -0
  182. data/test/rails_root/public/images/icons/blue_guy.png +0 -0
  183. data/test/rails_root/public/images/icons/button_background.png +0 -0
  184. data/test/rails_root/public/images/icons/cancel.png +0 -0
  185. data/test/rails_root/public/images/icons/close.png +0 -0
  186. data/test/rails_root/public/images/icons/comment.png +0 -0
  187. data/test/rails_root/public/images/icons/delete.png +0 -0
  188. data/test/rails_root/public/images/icons/exclaim.png +0 -0
  189. data/test/rails_root/public/images/icons/external.png +0 -0
  190. data/test/rails_root/public/images/icons/feed.png +0 -0
  191. data/test/rails_root/public/images/icons/grey_guy.png +0 -0
  192. data/test/rails_root/public/images/icons/hide.png +0 -0
  193. data/test/rails_root/public/images/icons/information.png +0 -0
  194. data/test/rails_root/public/images/icons/minus.png +0 -0
  195. data/test/rails_root/public/images/icons/pending.png +0 -0
  196. data/test/rails_root/public/images/icons/question.png +0 -0
  197. data/test/rails_root/public/images/icons/search_box.png +0 -0
  198. data/test/rails_root/public/images/icons/star.png +0 -0
  199. data/test/rails_root/public/images/icons/stop.png +0 -0
  200. data/test/rails_root/public/images/icons/thumb_down.png +0 -0
  201. data/test/rails_root/public/images/icons/thumb_up.png +0 -0
  202. data/test/rails_root/public/images/icons/vote.png +0 -0
  203. data/test/rails_root/public/images/loading.gif +0 -0
  204. data/test/rails_root/public/images/nothing.png +0 -0
  205. data/test/rails_root/public/images/profile_default.jpg +0 -0
  206. data/test/rails_root/public/images/rails.png +0 -0
  207. data/test/rails_root/public/images/red/preview.gif +0 -0
  208. data/test/rails_root/public/images/service_icons/16/amazon.png +0 -0
  209. data/test/rails_root/public/images/service_icons/16/ask.png +0 -0
  210. data/test/rails_root/public/images/service_icons/16/bibsonomy.png +0 -0
  211. data/test/rails_root/public/images/service_icons/16/bing.png +0 -0
  212. data/test/rails_root/public/images/service_icons/16/blogger.png +0 -0
  213. data/test/rails_root/public/images/service_icons/16/bloglines.png +0 -0
  214. data/test/rails_root/public/images/service_icons/16/citeulike.png +0 -0
  215. data/test/rails_root/public/images/service_icons/16/clipmarks.png +0 -0
  216. data/test/rails_root/public/images/service_icons/16/connotea.png +0 -0
  217. data/test/rails_root/public/images/service_icons/16/dailymotion.png +0 -0
  218. data/test/rails_root/public/images/service_icons/16/delicious.png +0 -0
  219. data/test/rails_root/public/images/service_icons/16/digg.png +0 -0
  220. data/test/rails_root/public/images/service_icons/16/diigo.png +0 -0
  221. data/test/rails_root/public/images/service_icons/16/facebook.png +0 -0
  222. data/test/rails_root/public/images/service_icons/16/feed.png +0 -0
  223. data/test/rails_root/public/images/service_icons/16/fireeagle.png +0 -0
  224. data/test/rails_root/public/images/service_icons/16/flickr.png +0 -0
  225. data/test/rails_root/public/images/service_icons/16/fotolog.png +0 -0
  226. data/test/rails_root/public/images/service_icons/16/friendfeed.png +0 -0
  227. data/test/rails_root/public/images/service_icons/16/friendster.png +0 -0
  228. data/test/rails_root/public/images/service_icons/16/furl.png +0 -0
  229. data/test/rails_root/public/images/service_icons/16/goodreads.png +0 -0
  230. data/test/rails_root/public/images/service_icons/16/google.png +0 -0
  231. data/test/rails_root/public/images/service_icons/16/googleblog.png +0 -0
  232. data/test/rails_root/public/images/service_icons/16/googlenews.png +0 -0
  233. data/test/rails_root/public/images/service_icons/16/icerocket.png +0 -0
  234. data/test/rails_root/public/images/service_icons/16/identica.png +0 -0
  235. data/test/rails_root/public/images/service_icons/16/joost.png +0 -0
  236. data/test/rails_root/public/images/service_icons/16/lastfm.png +0 -0
  237. data/test/rails_root/public/images/service_icons/16/librarything.png +0 -0
  238. data/test/rails_root/public/images/service_icons/16/linkedin.png +0 -0
  239. data/test/rails_root/public/images/service_icons/16/livejournal.png +0 -0
  240. data/test/rails_root/public/images/service_icons/16/magnolia.png +0 -0
  241. data/test/rails_root/public/images/service_icons/16/mendeley.png +0 -0
  242. data/test/rails_root/public/images/service_icons/16/metacafe.png +0 -0
  243. data/test/rails_root/public/images/service_icons/16/mixx.png +0 -0
  244. data/test/rails_root/public/images/service_icons/16/myspace.png +0 -0
  245. data/test/rails_root/public/images/service_icons/16/netflix.png +0 -0
  246. data/test/rails_root/public/images/service_icons/16/netvibes.png +0 -0
  247. data/test/rails_root/public/images/service_icons/16/newsvine.png +0 -0
  248. data/test/rails_root/public/images/service_icons/16/oai.png +0 -0
  249. data/test/rails_root/public/images/service_icons/16/odeo.png +0 -0
  250. data/test/rails_root/public/images/service_icons/16/opml.png +0 -0
  251. data/test/rails_root/public/images/service_icons/16/pandora.png +0 -0
  252. data/test/rails_root/public/images/service_icons/16/photobucket.png +0 -0
  253. data/test/rails_root/public/images/service_icons/16/picasa.png +0 -0
  254. data/test/rails_root/public/images/service_icons/16/polyvore.png +0 -0
  255. data/test/rails_root/public/images/service_icons/16/pownce.png +0 -0
  256. data/test/rails_root/public/images/service_icons/16/reddit.png +0 -0
  257. data/test/rails_root/public/images/service_icons/16/simpy.png +0 -0
  258. data/test/rails_root/public/images/service_icons/16/smugmug.png +0 -0
  259. data/test/rails_root/public/images/service_icons/16/stumbleupon.png +0 -0
  260. data/test/rails_root/public/images/service_icons/16/tag.png +0 -0
  261. data/test/rails_root/public/images/service_icons/16/technorati.png +0 -0
  262. data/test/rails_root/public/images/service_icons/16/tumblr.png +0 -0
  263. data/test/rails_root/public/images/service_icons/16/twine.png +0 -0
  264. data/test/rails_root/public/images/service_icons/16/twitter.png +0 -0
  265. data/test/rails_root/public/images/service_icons/16/vimeo.png +0 -0
  266. data/test/rails_root/public/images/service_icons/16/webshots.png +0 -0
  267. data/test/rails_root/public/images/service_icons/16/wordpress.png +0 -0
  268. data/test/rails_root/public/images/service_icons/16/xanga.png +0 -0
  269. data/test/rails_root/public/images/service_icons/16/yahoo.png +0 -0
  270. data/test/rails_root/public/images/service_icons/16/yelp.png +0 -0
  271. data/test/rails_root/public/images/service_icons/16/youtube.png +0 -0
  272. data/test/rails_root/public/images/service_icons/16/zooomr.png +0 -0
  273. data/test/rails_root/public/images/service_icons/16/zotero.png +0 -0
  274. data/test/rails_root/public/images/service_icons/24/amazon.png +0 -0
  275. data/test/rails_root/public/images/service_icons/24/ask.png +0 -0
  276. data/test/rails_root/public/images/service_icons/24/bibsonomy.png +0 -0
  277. data/test/rails_root/public/images/service_icons/24/bing.png +0 -0
  278. data/test/rails_root/public/images/service_icons/24/blogger.png +0 -0
  279. data/test/rails_root/public/images/service_icons/24/bloglines.png +0 -0
  280. data/test/rails_root/public/images/service_icons/24/citeulike.png +0 -0
  281. data/test/rails_root/public/images/service_icons/24/clipmarks.png +0 -0
  282. data/test/rails_root/public/images/service_icons/24/connotea.png +0 -0
  283. data/test/rails_root/public/images/service_icons/24/dailymotion.png +0 -0
  284. data/test/rails_root/public/images/service_icons/24/delicious.png +0 -0
  285. data/test/rails_root/public/images/service_icons/24/digg.png +0 -0
  286. data/test/rails_root/public/images/service_icons/24/diigo.png +0 -0
  287. data/test/rails_root/public/images/service_icons/24/facebook.png +0 -0
  288. data/test/rails_root/public/images/service_icons/24/feed.png +0 -0
  289. data/test/rails_root/public/images/service_icons/24/fireeagle.png +0 -0
  290. data/test/rails_root/public/images/service_icons/24/flickr.png +0 -0
  291. data/test/rails_root/public/images/service_icons/24/fotolog.png +0 -0
  292. data/test/rails_root/public/images/service_icons/24/friendfeed.png +0 -0
  293. data/test/rails_root/public/images/service_icons/24/friendster.png +0 -0
  294. data/test/rails_root/public/images/service_icons/24/furl.png +0 -0
  295. data/test/rails_root/public/images/service_icons/24/goodreads.png +0 -0
  296. data/test/rails_root/public/images/service_icons/24/google.png +0 -0
  297. data/test/rails_root/public/images/service_icons/24/googleblog.png +0 -0
  298. data/test/rails_root/public/images/service_icons/24/googlenews.png +0 -0
  299. data/test/rails_root/public/images/service_icons/24/icerocket.png +0 -0
  300. data/test/rails_root/public/images/service_icons/24/identica.png +0 -0
  301. data/test/rails_root/public/images/service_icons/24/joost.png +0 -0
  302. data/test/rails_root/public/images/service_icons/24/lastfm.png +0 -0
  303. data/test/rails_root/public/images/service_icons/24/librarything.png +0 -0
  304. data/test/rails_root/public/images/service_icons/24/linkedin.png +0 -0
  305. data/test/rails_root/public/images/service_icons/24/livejournal.png +0 -0
  306. data/test/rails_root/public/images/service_icons/24/magnolia.png +0 -0
  307. data/test/rails_root/public/images/service_icons/24/mendeley.png +0 -0
  308. data/test/rails_root/public/images/service_icons/24/metacafe.png +0 -0
  309. data/test/rails_root/public/images/service_icons/24/mixx.png +0 -0
  310. data/test/rails_root/public/images/service_icons/24/myspace.png +0 -0
  311. data/test/rails_root/public/images/service_icons/24/netflix.png +0 -0
  312. data/test/rails_root/public/images/service_icons/24/netvibes.png +0 -0
  313. data/test/rails_root/public/images/service_icons/24/newsvine.png +0 -0
  314. data/test/rails_root/public/images/service_icons/24/oai.png +0 -0
  315. data/test/rails_root/public/images/service_icons/24/odeo.png +0 -0
  316. data/test/rails_root/public/images/service_icons/24/opml.png +0 -0
  317. data/test/rails_root/public/images/service_icons/24/pandora.png +0 -0
  318. data/test/rails_root/public/images/service_icons/24/photobucket.png +0 -0
  319. data/test/rails_root/public/images/service_icons/24/picasa.png +0 -0
  320. data/test/rails_root/public/images/service_icons/24/polyvore.png +0 -0
  321. data/test/rails_root/public/images/service_icons/24/pownce.png +0 -0
  322. data/test/rails_root/public/images/service_icons/24/reddit.png +0 -0
  323. data/test/rails_root/public/images/service_icons/24/simpy.png +0 -0
  324. data/test/rails_root/public/images/service_icons/24/smugmug.png +0 -0
  325. data/test/rails_root/public/images/service_icons/24/stumbleupon.png +0 -0
  326. data/test/rails_root/public/images/service_icons/24/tag.png +0 -0
  327. data/test/rails_root/public/images/service_icons/24/technorati.png +0 -0
  328. data/test/rails_root/public/images/service_icons/24/tumblr.png +0 -0
  329. data/test/rails_root/public/images/service_icons/24/twine.png +0 -0
  330. data/test/rails_root/public/images/service_icons/24/twitter.png +0 -0
  331. data/test/rails_root/public/images/service_icons/24/vimeo.png +0 -0
  332. data/test/rails_root/public/images/service_icons/24/webshots.png +0 -0
  333. data/test/rails_root/public/images/service_icons/24/wordpress.png +0 -0
  334. data/test/rails_root/public/images/service_icons/24/xanga.png +0 -0
  335. data/test/rails_root/public/images/service_icons/24/yahoo.png +0 -0
  336. data/test/rails_root/public/images/service_icons/24/yelp.png +0 -0
  337. data/test/rails_root/public/images/service_icons/24/youtube.png +0 -0
  338. data/test/rails_root/public/images/service_icons/24/zooomr.png +0 -0
  339. data/test/rails_root/public/images/service_icons/24/zotero.png +0 -0
  340. data/test/rails_root/public/images/service_icons/48/amazon.png +0 -0
  341. data/test/rails_root/public/images/service_icons/48/ask.png +0 -0
  342. data/test/rails_root/public/images/service_icons/48/bibsonomy.png +0 -0
  343. data/test/rails_root/public/images/service_icons/48/bing.png +0 -0
  344. data/test/rails_root/public/images/service_icons/48/blogger.png +0 -0
  345. data/test/rails_root/public/images/service_icons/48/bloglines.png +0 -0
  346. data/test/rails_root/public/images/service_icons/48/citeulike.png +0 -0
  347. data/test/rails_root/public/images/service_icons/48/clipmarks.png +0 -0
  348. data/test/rails_root/public/images/service_icons/48/connotea.png +0 -0
  349. data/test/rails_root/public/images/service_icons/48/dailymotion.png +0 -0
  350. data/test/rails_root/public/images/service_icons/48/delicious.png +0 -0
  351. data/test/rails_root/public/images/service_icons/48/digg.png +0 -0
  352. data/test/rails_root/public/images/service_icons/48/diigo.png +0 -0
  353. data/test/rails_root/public/images/service_icons/48/facebook.png +0 -0
  354. data/test/rails_root/public/images/service_icons/48/feed.png +0 -0
  355. data/test/rails_root/public/images/service_icons/48/fireeagle.png +0 -0
  356. data/test/rails_root/public/images/service_icons/48/flickr.png +0 -0
  357. data/test/rails_root/public/images/service_icons/48/fotolog.png +0 -0
  358. data/test/rails_root/public/images/service_icons/48/friendfeed.png +0 -0
  359. data/test/rails_root/public/images/service_icons/48/friendster.png +0 -0
  360. data/test/rails_root/public/images/service_icons/48/furl.png +0 -0
  361. data/test/rails_root/public/images/service_icons/48/goodreads.png +0 -0
  362. data/test/rails_root/public/images/service_icons/48/google.png +0 -0
  363. data/test/rails_root/public/images/service_icons/48/googleblog.png +0 -0
  364. data/test/rails_root/public/images/service_icons/48/googlenews.png +0 -0
  365. data/test/rails_root/public/images/service_icons/48/icerocket.png +0 -0
  366. data/test/rails_root/public/images/service_icons/48/identica.png +0 -0
  367. data/test/rails_root/public/images/service_icons/48/joost.png +0 -0
  368. data/test/rails_root/public/images/service_icons/48/lastfm.png +0 -0
  369. data/test/rails_root/public/images/service_icons/48/librarything.png +0 -0
  370. data/test/rails_root/public/images/service_icons/48/linkedin.png +0 -0
  371. data/test/rails_root/public/images/service_icons/48/livejournal.png +0 -0
  372. data/test/rails_root/public/images/service_icons/48/magnolia.png +0 -0
  373. data/test/rails_root/public/images/service_icons/48/mendeley.png +0 -0
  374. data/test/rails_root/public/images/service_icons/48/metacafe.png +0 -0
  375. data/test/rails_root/public/images/service_icons/48/mixx.png +0 -0
  376. data/test/rails_root/public/images/service_icons/48/myspace.png +0 -0
  377. data/test/rails_root/public/images/service_icons/48/netflix.png +0 -0
  378. data/test/rails_root/public/images/service_icons/48/netvibes.png +0 -0
  379. data/test/rails_root/public/images/service_icons/48/newsvine.png +0 -0
  380. data/test/rails_root/public/images/service_icons/48/oai.png +0 -0
  381. data/test/rails_root/public/images/service_icons/48/odeo.png +0 -0
  382. data/test/rails_root/public/images/service_icons/48/opml.png +0 -0
  383. data/test/rails_root/public/images/service_icons/48/pandora.png +0 -0
  384. data/test/rails_root/public/images/service_icons/48/photobucket.png +0 -0
  385. data/test/rails_root/public/images/service_icons/48/picasa.png +0 -0
  386. data/test/rails_root/public/images/service_icons/48/polyvore.png +0 -0
  387. data/test/rails_root/public/images/service_icons/48/pownce.png +0 -0
  388. data/test/rails_root/public/images/service_icons/48/reddit.png +0 -0
  389. data/test/rails_root/public/images/service_icons/48/simpy.png +0 -0
  390. data/test/rails_root/public/images/service_icons/48/smugmug.png +0 -0
  391. data/test/rails_root/public/images/service_icons/48/stumbleupon.png +0 -0
  392. data/test/rails_root/public/images/service_icons/48/tag.png +0 -0
  393. data/test/rails_root/public/images/service_icons/48/technorati.png +0 -0
  394. data/test/rails_root/public/images/service_icons/48/tumblr.png +0 -0
  395. data/test/rails_root/public/images/service_icons/48/twine.png +0 -0
  396. data/test/rails_root/public/images/service_icons/48/twitter.png +0 -0
  397. data/test/rails_root/public/images/service_icons/48/vimeo.png +0 -0
  398. data/test/rails_root/public/images/service_icons/48/webshots.png +0 -0
  399. data/test/rails_root/public/images/service_icons/48/wordpress.png +0 -0
  400. data/test/rails_root/public/images/service_icons/48/xanga.png +0 -0
  401. data/test/rails_root/public/images/service_icons/48/yahoo.png +0 -0
  402. data/test/rails_root/public/images/service_icons/48/yelp.png +0 -0
  403. data/test/rails_root/public/images/service_icons/48/youtube.png +0 -0
  404. data/test/rails_root/public/images/service_icons/48/zooomr.png +0 -0
  405. data/test/rails_root/public/images/service_icons/48/zotero.png +0 -0
  406. data/test/rails_root/public/images/service_icons/60/amazon.png +0 -0
  407. data/test/rails_root/public/images/service_icons/60/ask.png +0 -0
  408. data/test/rails_root/public/images/service_icons/60/bibsonomy.png +0 -0
  409. data/test/rails_root/public/images/service_icons/60/bing.png +0 -0
  410. data/test/rails_root/public/images/service_icons/60/blogger.png +0 -0
  411. data/test/rails_root/public/images/service_icons/60/bloglines.png +0 -0
  412. data/test/rails_root/public/images/service_icons/60/citeulike.png +0 -0
  413. data/test/rails_root/public/images/service_icons/60/clipmarks.png +0 -0
  414. data/test/rails_root/public/images/service_icons/60/connotea.png +0 -0
  415. data/test/rails_root/public/images/service_icons/60/dailymotion.png +0 -0
  416. data/test/rails_root/public/images/service_icons/60/delicious.png +0 -0
  417. data/test/rails_root/public/images/service_icons/60/digg.png +0 -0
  418. data/test/rails_root/public/images/service_icons/60/diigo.png +0 -0
  419. data/test/rails_root/public/images/service_icons/60/facebook.png +0 -0
  420. data/test/rails_root/public/images/service_icons/60/feed.png +0 -0
  421. data/test/rails_root/public/images/service_icons/60/fireeagle.png +0 -0
  422. data/test/rails_root/public/images/service_icons/60/flickr.png +0 -0
  423. data/test/rails_root/public/images/service_icons/60/fotolog.png +0 -0
  424. data/test/rails_root/public/images/service_icons/60/friendfeed.png +0 -0
  425. data/test/rails_root/public/images/service_icons/60/friendster.png +0 -0
  426. data/test/rails_root/public/images/service_icons/60/furl.png +0 -0
  427. data/test/rails_root/public/images/service_icons/60/goodreads.png +0 -0
  428. data/test/rails_root/public/images/service_icons/60/google.png +0 -0
  429. data/test/rails_root/public/images/service_icons/60/googleblog.png +0 -0
  430. data/test/rails_root/public/images/service_icons/60/googlenews.png +0 -0
  431. data/test/rails_root/public/images/service_icons/60/icerocket.png +0 -0
  432. data/test/rails_root/public/images/service_icons/60/identica.png +0 -0
  433. data/test/rails_root/public/images/service_icons/60/joost.png +0 -0
  434. data/test/rails_root/public/images/service_icons/60/lastfm.png +0 -0
  435. data/test/rails_root/public/images/service_icons/60/librarything.png +0 -0
  436. data/test/rails_root/public/images/service_icons/60/linkedin.png +0 -0
  437. data/test/rails_root/public/images/service_icons/60/livejournal.png +0 -0
  438. data/test/rails_root/public/images/service_icons/60/magnolia.png +0 -0
  439. data/test/rails_root/public/images/service_icons/60/mendeley.png +0 -0
  440. data/test/rails_root/public/images/service_icons/60/metacafe.png +0 -0
  441. data/test/rails_root/public/images/service_icons/60/mixx.png +0 -0
  442. data/test/rails_root/public/images/service_icons/60/myspace.png +0 -0
  443. data/test/rails_root/public/images/service_icons/60/netflix.png +0 -0
  444. data/test/rails_root/public/images/service_icons/60/netvibes.png +0 -0
  445. data/test/rails_root/public/images/service_icons/60/newsvine.png +0 -0
  446. data/test/rails_root/public/images/service_icons/60/oai.png +0 -0
  447. data/test/rails_root/public/images/service_icons/60/odeo.png +0 -0
  448. data/test/rails_root/public/images/service_icons/60/opml.png +0 -0
  449. data/test/rails_root/public/images/service_icons/60/pandora.png +0 -0
  450. data/test/rails_root/public/images/service_icons/60/photobucket.png +0 -0
  451. data/test/rails_root/public/images/service_icons/60/picasa.png +0 -0
  452. data/test/rails_root/public/images/service_icons/60/polyvore.png +0 -0
  453. data/test/rails_root/public/images/service_icons/60/pownce.png +0 -0
  454. data/test/rails_root/public/images/service_icons/60/reddit.png +0 -0
  455. data/test/rails_root/public/images/service_icons/60/simpy.png +0 -0
  456. data/test/rails_root/public/images/service_icons/60/smugmug.png +0 -0
  457. data/test/rails_root/public/images/service_icons/60/stumbleupon.png +0 -0
  458. data/test/rails_root/public/images/service_icons/60/tag.png +0 -0
  459. data/test/rails_root/public/images/service_icons/60/technorati.png +0 -0
  460. data/test/rails_root/public/images/service_icons/60/tumblr.png +0 -0
  461. data/test/rails_root/public/images/service_icons/60/twine.png +0 -0
  462. data/test/rails_root/public/images/service_icons/60/twitter.png +0 -0
  463. data/test/rails_root/public/images/service_icons/60/vimeo.png +0 -0
  464. data/test/rails_root/public/images/service_icons/60/webshots.png +0 -0
  465. data/test/rails_root/public/images/service_icons/60/wordpress.png +0 -0
  466. data/test/rails_root/public/images/service_icons/60/xanga.png +0 -0
  467. data/test/rails_root/public/images/service_icons/60/yahoo.png +0 -0
  468. data/test/rails_root/public/images/service_icons/60/yelp.png +0 -0
  469. data/test/rails_root/public/images/service_icons/60/youtube.png +0 -0
  470. data/test/rails_root/public/images/service_icons/60/zooomr.png +0 -0
  471. data/test/rails_root/public/images/service_icons/60/zotero.png +0 -0
  472. data/test/rails_root/public/images/service_icons/facebook_friend_links.jpg +0 -0
  473. data/test/rails_root/public/images/service_icons/facebook_my_links.jpg +0 -0
  474. data/test/rails_root/public/images/service_icons/source/Aquaticus_Social_Icon_template_by_jwloh.psd +0 -0
  475. data/test/rails_root/public/images/service_icons/source/Google.psd +0 -0
  476. data/test/rails_root/public/images/service_icons/source/Quake 9 Design.webloc +0 -0
  477. data/test/rails_root/public/images/service_icons/source/ReadMe.rtf +52 -0
  478. data/test/rails_root/public/images/service_icons/source/amazon.png +0 -0
  479. data/test/rails_root/public/images/service_icons/source/aquaticus.social.png +0 -0
  480. data/test/rails_root/public/images/service_icons/source/ask.png +0 -0
  481. data/test/rails_root/public/images/service_icons/source/ask.psd +0 -0
  482. data/test/rails_root/public/images/service_icons/source/bibsonomy.png +0 -0
  483. data/test/rails_root/public/images/service_icons/source/bibsonomy.psd +0 -0
  484. data/test/rails_root/public/images/service_icons/source/bing.png +0 -0
  485. data/test/rails_root/public/images/service_icons/source/bing.psd +0 -0
  486. data/test/rails_root/public/images/service_icons/source/blogger.png +0 -0
  487. data/test/rails_root/public/images/service_icons/source/bloglines.png +0 -0
  488. data/test/rails_root/public/images/service_icons/source/bloglines.psd +0 -0
  489. data/test/rails_root/public/images/service_icons/source/citeulike.png +0 -0
  490. data/test/rails_root/public/images/service_icons/source/clipmarks.png +0 -0
  491. data/test/rails_root/public/images/service_icons/source/connotea.png +0 -0
  492. data/test/rails_root/public/images/service_icons/source/connotea.psd +0 -0
  493. data/test/rails_root/public/images/service_icons/source/dailymotion.png +0 -0
  494. data/test/rails_root/public/images/service_icons/source/delicious.png +0 -0
  495. data/test/rails_root/public/images/service_icons/source/digg.png +0 -0
  496. data/test/rails_root/public/images/service_icons/source/diigo.png +0 -0
  497. data/test/rails_root/public/images/service_icons/source/facebook.png +0 -0
  498. data/test/rails_root/public/images/service_icons/source/feed.png +0 -0
  499. data/test/rails_root/public/images/service_icons/source/fireeagle.psd +0 -0
  500. data/test/rails_root/public/images/service_icons/source/flickr.png +0 -0
  501. data/test/rails_root/public/images/service_icons/source/fotolog.png +0 -0
  502. data/test/rails_root/public/images/service_icons/source/friendfeed.png +0 -0
  503. data/test/rails_root/public/images/service_icons/source/friendster.png +0 -0
  504. data/test/rails_root/public/images/service_icons/source/furl.png +0 -0
  505. data/test/rails_root/public/images/service_icons/source/goodreads.png +0 -0
  506. data/test/rails_root/public/images/service_icons/source/google.png +0 -0
  507. data/test/rails_root/public/images/service_icons/source/googleblog.png +0 -0
  508. data/test/rails_root/public/images/service_icons/source/googlenews.png +0 -0
  509. data/test/rails_root/public/images/service_icons/source/icerocket.png +0 -0
  510. data/test/rails_root/public/images/service_icons/source/icerocket.psd +0 -0
  511. data/test/rails_root/public/images/service_icons/source/identica.png +0 -0
  512. data/test/rails_root/public/images/service_icons/source/joost.png +0 -0
  513. data/test/rails_root/public/images/service_icons/source/lastfm.png +0 -0
  514. data/test/rails_root/public/images/service_icons/source/librarything.png +0 -0
  515. data/test/rails_root/public/images/service_icons/source/linkedin.png +0 -0
  516. data/test/rails_root/public/images/service_icons/source/livejournal.png +0 -0
  517. data/test/rails_root/public/images/service_icons/source/magnolia.png +0 -0
  518. data/test/rails_root/public/images/service_icons/source/mendeley.png +0 -0
  519. data/test/rails_root/public/images/service_icons/source/metacafe.png +0 -0
  520. data/test/rails_root/public/images/service_icons/source/metacafe.psd +0 -0
  521. data/test/rails_root/public/images/service_icons/source/mixx.png +0 -0
  522. data/test/rails_root/public/images/service_icons/source/myspace.png +0 -0
  523. data/test/rails_root/public/images/service_icons/source/netflix.png +0 -0
  524. data/test/rails_root/public/images/service_icons/source/netvibes.png +0 -0
  525. data/test/rails_root/public/images/service_icons/source/newsvine.png +0 -0
  526. data/test/rails_root/public/images/service_icons/source/oai.png +0 -0
  527. data/test/rails_root/public/images/service_icons/source/odeo.png +0 -0
  528. data/test/rails_root/public/images/service_icons/source/opml.png +0 -0
  529. data/test/rails_root/public/images/service_icons/source/pandora.png +0 -0
  530. data/test/rails_root/public/images/service_icons/source/photobucket.png +0 -0
  531. data/test/rails_root/public/images/service_icons/source/picasa.png +0 -0
  532. data/test/rails_root/public/images/service_icons/source/polyvore.png +0 -0
  533. data/test/rails_root/public/images/service_icons/source/pownce.png +0 -0
  534. data/test/rails_root/public/images/service_icons/source/reddit.png +0 -0
  535. data/test/rails_root/public/images/service_icons/source/simpy.png +0 -0
  536. data/test/rails_root/public/images/service_icons/source/smugmug.png +0 -0
  537. data/test/rails_root/public/images/service_icons/source/stumbleupon.png +0 -0
  538. data/test/rails_root/public/images/service_icons/source/tag.png +0 -0
  539. data/test/rails_root/public/images/service_icons/source/technorati.png +0 -0
  540. data/test/rails_root/public/images/service_icons/source/template.png +0 -0
  541. data/test/rails_root/public/images/service_icons/source/tumblr.png +0 -0
  542. data/test/rails_root/public/images/service_icons/source/twine.png +0 -0
  543. data/test/rails_root/public/images/service_icons/source/twine.psd +0 -0
  544. data/test/rails_root/public/images/service_icons/source/twitter.png +0 -0
  545. data/test/rails_root/public/images/service_icons/source/vimeo.png +0 -0
  546. data/test/rails_root/public/images/service_icons/source/webshots.png +0 -0
  547. data/test/rails_root/public/images/service_icons/source/wordpress.png +0 -0
  548. data/test/rails_root/public/images/service_icons/source/xanga.png +0 -0
  549. data/test/rails_root/public/images/service_icons/source/yahoo.png +0 -0
  550. data/test/rails_root/public/images/service_icons/source/yelp.png +0 -0
  551. data/test/rails_root/public/images/service_icons/source/youtube.png +0 -0
  552. data/test/rails_root/public/images/service_icons/source/zooomr.png +0 -0
  553. data/test/rails_root/public/images/service_icons/source/zotero.png +0 -0
  554. data/test/rails_root/public/images/spinner.gif +0 -0
  555. data/test/rails_root/public/images/sprites.png +0 -0
  556. data/test/rails_root/public/javascripts/application.js +2 -0
  557. data/test/rails_root/public/javascripts/builder.js +136 -0
  558. data/test/rails_root/public/javascripts/controls.js +963 -0
  559. data/test/rails_root/public/javascripts/dragdrop.js +972 -0
  560. data/test/rails_root/public/javascripts/effects.js +1120 -0
  561. data/test/rails_root/public/javascripts/fancyzoom.min.js +1 -0
  562. data/test/rails_root/public/javascripts/jquery/colorpicker.js +450 -0
  563. data/test/rails_root/public/javascripts/jquery/jquery-ui.js +273 -0
  564. data/test/rails_root/public/javascripts/jquery/jquery.autocomplete.js.readme +6 -0
  565. data/test/rails_root/public/javascripts/jquery/jquery.autocomplete.min.js +15 -0
  566. data/test/rails_root/public/javascripts/jquery/jquery.autocomplete.pack.js +767 -0
  567. data/test/rails_root/public/javascripts/jquery/jquery.easing.js +1 -0
  568. data/test/rails_root/public/javascripts/jquery/jquery.fancybox.js +16 -0
  569. data/test/rails_root/public/javascripts/jquery/jquery.form.js +660 -0
  570. data/test/rails_root/public/javascripts/jquery/jquery.jgrowl.js +9 -0
  571. data/test/rails_root/public/javascripts/jquery/jquery.js +19 -0
  572. data/test/rails_root/public/javascripts/jquery/jquery.metadata.min.js +13 -0
  573. data/test/rails_root/public/javascripts/jquery/jquery.queryString.js +33 -0
  574. data/test/rails_root/public/javascripts/jquery/jquery.swapimage.js +66 -0
  575. data/test/rails_root/public/javascripts/jquery/jquery.swapimage.min.js +11 -0
  576. data/test/rails_root/public/javascripts/jquery/jquery.tips.js +75 -0
  577. data/test/rails_root/public/javascripts/jquery/jrails.js +1 -0
  578. data/test/rails_root/public/javascripts/muck-countries.js +50 -0
  579. data/test/rails_root/public/javascripts/muck-users.js +24 -0
  580. data/test/rails_root/public/javascripts/muck.js +91 -0
  581. data/test/rails_root/public/javascripts/muck_activities.js +100 -0
  582. data/test/rails_root/public/javascripts/muck_time/en.js +53 -0
  583. data/test/rails_root/public/javascripts/prototype.js +4225 -0
  584. data/test/rails_root/public/javascripts/scriptaculous.js +58 -0
  585. data/test/rails_root/public/javascripts/slider.js +277 -0
  586. data/test/rails_root/public/javascripts/sound.js +60 -0
  587. data/test/rails_root/public/javascripts/tree.js +107 -0
  588. data/test/rails_root/public/robots.txt +1 -0
  589. data/test/rails_root/public/stylesheets/admin.css +40 -0
  590. data/test/rails_root/public/stylesheets/blueprint/ie.css +26 -0
  591. data/test/rails_root/public/stylesheets/blueprint/liquid_screen.css +203 -0
  592. data/test/rails_root/public/stylesheets/blueprint/plugins/buttons/icons/cross.png +0 -0
  593. data/test/rails_root/public/stylesheets/blueprint/plugins/buttons/icons/key.png +0 -0
  594. data/test/rails_root/public/stylesheets/blueprint/plugins/buttons/icons/tick.png +0 -0
  595. data/test/rails_root/public/stylesheets/blueprint/plugins/buttons/readme.txt +32 -0
  596. data/test/rails_root/public/stylesheets/blueprint/plugins/buttons/screen.css +97 -0
  597. data/test/rails_root/public/stylesheets/blueprint/plugins/fancy-type/readme.txt +14 -0
  598. data/test/rails_root/public/stylesheets/blueprint/plugins/fancy-type/screen.css +71 -0
  599. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/icons/doc.png +0 -0
  600. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/icons/email.png +0 -0
  601. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/icons/external.png +0 -0
  602. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/icons/feed.png +0 -0
  603. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/icons/im.png +0 -0
  604. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/icons/pdf.png +0 -0
  605. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/icons/visited.png +0 -0
  606. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/icons/xls.png +0 -0
  607. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/readme.txt +18 -0
  608. data/test/rails_root/public/stylesheets/blueprint/plugins/link-icons/screen.css +40 -0
  609. data/test/rails_root/public/stylesheets/blueprint/plugins/liquid/liquid.css +134 -0
  610. data/test/rails_root/public/stylesheets/blueprint/plugins/liquid/src/liquid.css +197 -0
  611. data/test/rails_root/public/stylesheets/blueprint/plugins/rtl/readme.txt +10 -0
  612. data/test/rails_root/public/stylesheets/blueprint/plugins/rtl/screen.css +109 -0
  613. data/test/rails_root/public/stylesheets/blueprint/print.css +30 -0
  614. data/test/rails_root/public/stylesheets/blueprint/screen.css +251 -0
  615. data/test/rails_root/public/stylesheets/blueprint/sprite.css +1 -0
  616. data/test/rails_root/public/stylesheets/blueprint/src/forms.css +49 -0
  617. data/test/rails_root/public/stylesheets/blueprint/src/grid.css +213 -0
  618. data/test/rails_root/public/stylesheets/blueprint/src/grid.png +0 -0
  619. data/test/rails_root/public/stylesheets/blueprint/src/ie.css +59 -0
  620. data/test/rails_root/public/stylesheets/blueprint/src/print.css +85 -0
  621. data/test/rails_root/public/stylesheets/blueprint/src/reset.css +38 -0
  622. data/test/rails_root/public/stylesheets/blueprint/src/typography.css +105 -0
  623. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-bg_diagonals-small_0_aaaaaa_40x40.png +0 -0
  624. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-bg_diagonals-thick_15_444444_40x40.png +0 -0
  625. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-bg_glass_100_f0f0f0_1x400.png +0 -0
  626. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-bg_glass_50_99c2ff_1x400.png +0 -0
  627. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-bg_glass_55_fbf5d0_1x400.png +0 -0
  628. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-bg_glass_80_e6e6e6_1x400.png +0 -0
  629. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  630. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-bg_highlight-hard_100_f9f9f9_1x100.png +0 -0
  631. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-bg_highlight-soft_100_e7eef3_1x100.png +0 -0
  632. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-icons_222222_256x240.png +0 -0
  633. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-icons_2694e8_256x240.png +0 -0
  634. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-icons_2e83ff_256x240.png +0 -0
  635. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-icons_72a7cf_256x240.png +0 -0
  636. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-icons_888888_256x240.png +0 -0
  637. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-icons_cd0a0a_256x240.png +0 -0
  638. data/test/rails_root/public/stylesheets/jquery/cupertino/images/ui-icons_ffffff_256x240.png +0 -0
  639. data/test/rails_root/public/stylesheets/jquery/cupertino/jquery-ui-1.7.1.custom.css +404 -0
  640. data/test/rails_root/public/stylesheets/jquery/cupertino/jquery-ui-1.7.2.custom.css +160 -0
  641. data/test/rails_root/public/stylesheets/jquery/jquery.autocomplete.css +15 -0
  642. data/test/rails_root/public/stylesheets/jquery/jquery.fancybox.css +38 -0
  643. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  644. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-bg_flat_55_fbec88_40x100.png +0 -0
  645. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-bg_glass_75_d0e5f5_1x400.png +0 -0
  646. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-bg_glass_85_dfeffc_1x400.png +0 -0
  647. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  648. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-bg_gloss-wave_55_5c9ccc_500x100.png +0 -0
  649. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-bg_inset-hard_100_f5f8f9_1x100.png +0 -0
  650. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-bg_inset-hard_100_fcfdfd_1x100.png +0 -0
  651. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-icons_217bc0_256x240.png +0 -0
  652. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-icons_2e83ff_256x240.png +0 -0
  653. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-icons_469bdd_256x240.png +0 -0
  654. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-icons_6da8d5_256x240.png +0 -0
  655. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-icons_cd0a0a_256x240.png +0 -0
  656. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-icons_d8e7f3_256x240.png +0 -0
  657. data/test/rails_root/public/stylesheets/jquery/redmond/images/ui-icons_f9bd01_256x240.png +0 -0
  658. data/test/rails_root/public/stylesheets/jquery/redmond/jquery-ui-1.7.1.custom.css +404 -0
  659. data/test/rails_root/public/stylesheets/jquery/redmond/jquery-ui-1.7.2.custom.css +160 -0
  660. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  661. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  662. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  663. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  664. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  665. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  666. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  667. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  668. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-icons_222222_256x240.png +0 -0
  669. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  670. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-icons_454545_256x240.png +0 -0
  671. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-icons_888888_256x240.png +0 -0
  672. data/test/rails_root/public/stylesheets/jquery/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  673. data/test/rails_root/public/stylesheets/jquery/smoothness/jquery-ui-1.7.1.custom.css +404 -0
  674. data/test/rails_root/public/stylesheets/jquery/smoothness/jquery-ui-1.7.2.custom.css +160 -0
  675. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  676. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  677. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-bg_flat_10_000000_40x100.png +0 -0
  678. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  679. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  680. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  681. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  682. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  683. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  684. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-icons_222222_256x240.png +0 -0
  685. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-icons_228ef1_256x240.png +0 -0
  686. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-icons_ef8c08_256x240.png +0 -0
  687. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-icons_ffd27a_256x240.png +0 -0
  688. data/test/rails_root/public/stylesheets/jquery/ui-lightness/images/ui-icons_ffffff_256x240.png +0 -0
  689. data/test/rails_root/public/stylesheets/jquery/ui-lightness/jquery-ui-1.7.1.custom.css +404 -0
  690. data/test/rails_root/public/stylesheets/jquery/ui-lightness/jquery-ui-1.7.2.custom.css +160 -0
  691. data/test/rails_root/public/stylesheets/reset.css +0 -0
  692. data/test/rails_root/public/stylesheets/styles.css +94 -0
  693. data/test/rails_root/public/stylesheets/themes/blue/styles.css +1 -0
  694. data/test/rails_root/public/stylesheets/themes/red/styles.css +1 -0
  695. data/test/rails_root/remote/functional/remote_orders_controller_test.rb +140 -0
  696. data/test/rails_root/remote/remote_helper.rb +38 -0
  697. data/test/rails_root/remote/unit/remote_order_test.rb +80 -0
  698. data/test/rails_root/remote/unit/remote_order_transaction_test.rb +214 -0
  699. data/test/rails_root/script/about +3 -0
  700. data/test/rails_root/script/breakpointer +3 -0
  701. data/test/rails_root/script/console +3 -0
  702. data/test/rails_root/script/create_project.rb +52 -0
  703. data/test/rails_root/script/cucumber +7 -0
  704. data/test/rails_root/script/dbconsole +3 -0
  705. data/test/rails_root/script/destroy +3 -0
  706. data/test/rails_root/script/generate +3 -0
  707. data/test/rails_root/script/performance/benchmarker +3 -0
  708. data/test/rails_root/script/performance/profiler +3 -0
  709. data/test/rails_root/script/performance/request +3 -0
  710. data/test/rails_root/script/plugin +3 -0
  711. data/test/rails_root/script/process/inspector +3 -0
  712. data/test/rails_root/script/process/reaper +3 -0
  713. data/test/rails_root/script/process/spawner +3 -0
  714. data/test/rails_root/script/runner +3 -0
  715. data/test/rails_root/script/server +3 -0
  716. data/test/rails_root/test/functional/admin/billing_informations_controller_test.rb +77 -0
  717. data/test/rails_root/test/functional/admin/coupons_controller_test.rb +131 -0
  718. data/test/rails_root/test/functional/admin/subscription_plans_controller_test.rb +92 -0
  719. data/test/rails_root/test/functional/billings_information_controller_test.rb +76 -0
  720. data/test/rails_root/test/functional/carts_controller_test.rb +39 -0
  721. data/test/rails_root/test/functional/orders_controller_test.rb +103 -0
  722. data/test/rails_root/test/functional/subscription_controller_test.rb +153 -0
  723. data/test/rails_root/test/test_helper.rb +59 -0
  724. data/test/rails_root/test/unit/order_test.rb +96 -0
  725. data/test/rails_root/test/unit/order_transaction_test.rb +55 -0
  726. data/test/rails_root/test/unit/subscription_test.rb +11 -0
  727. data/test/rails_root/test/unit/user_test.rb +23 -0
  728. data/test/rails_root/vendor/plugins/geokit-rails/CHANGELOG.rdoc +46 -0
  729. data/test/rails_root/vendor/plugins/geokit-rails/MIT-LICENSE +20 -0
  730. data/test/rails_root/vendor/plugins/geokit-rails/README.markdown +561 -0
  731. data/test/rails_root/vendor/plugins/geokit-rails/Rakefile +18 -0
  732. data/test/rails_root/vendor/plugins/geokit-rails/about.yml +9 -0
  733. data/test/rails_root/vendor/plugins/geokit-rails/assets/api_keys_template +61 -0
  734. data/test/rails_root/vendor/plugins/geokit-rails/init.rb +2 -0
  735. data/test/rails_root/vendor/plugins/geokit-rails/install.rb +14 -0
  736. data/test/rails_root/vendor/plugins/geokit-rails/lib/geokit-rails/acts_as_mappable.rb +456 -0
  737. data/test/rails_root/vendor/plugins/geokit-rails/lib/geokit-rails/adapters/abstract.rb +31 -0
  738. data/test/rails_root/vendor/plugins/geokit-rails/lib/geokit-rails/adapters/mysql.rb +22 -0
  739. data/test/rails_root/vendor/plugins/geokit-rails/lib/geokit-rails/adapters/postgresql.rb +22 -0
  740. data/test/rails_root/vendor/plugins/geokit-rails/lib/geokit-rails/adapters/sqlserver.rb +43 -0
  741. data/test/rails_root/vendor/plugins/geokit-rails/lib/geokit-rails/defaults.rb +22 -0
  742. data/test/rails_root/vendor/plugins/geokit-rails/lib/geokit-rails/geocoder_control.rb +16 -0
  743. data/test/rails_root/vendor/plugins/geokit-rails/lib/geokit-rails/ip_geocode_lookup.rb +46 -0
  744. data/test/rails_root/vendor/plugins/geokit-rails/lib/geokit-rails.rb +26 -0
  745. data/test/rails_root/vendor/plugins/geokit-rails/test/acts_as_mappable_test.rb +474 -0
  746. data/test/rails_root/vendor/plugins/geokit-rails/test/boot.rb +25 -0
  747. data/test/rails_root/vendor/plugins/geokit-rails/test/database.yml +20 -0
  748. data/test/rails_root/vendor/plugins/geokit-rails/test/fixtures/companies.yml +7 -0
  749. data/test/rails_root/vendor/plugins/geokit-rails/test/fixtures/custom_locations.yml +54 -0
  750. data/test/rails_root/vendor/plugins/geokit-rails/test/fixtures/locations.yml +54 -0
  751. data/test/rails_root/vendor/plugins/geokit-rails/test/fixtures/mock_addresses.yml +17 -0
  752. data/test/rails_root/vendor/plugins/geokit-rails/test/fixtures/mock_families.yml +2 -0
  753. data/test/rails_root/vendor/plugins/geokit-rails/test/fixtures/mock_houses.yml +9 -0
  754. data/test/rails_root/vendor/plugins/geokit-rails/test/fixtures/mock_organizations.yml +5 -0
  755. data/test/rails_root/vendor/plugins/geokit-rails/test/fixtures/mock_people.yml +5 -0
  756. data/test/rails_root/vendor/plugins/geokit-rails/test/fixtures/stores.yml +0 -0
  757. data/test/rails_root/vendor/plugins/geokit-rails/test/ip_geocode_lookup_test.rb +77 -0
  758. data/test/rails_root/vendor/plugins/geokit-rails/test/models/company.rb +3 -0
  759. data/test/rails_root/vendor/plugins/geokit-rails/test/models/custom_location.rb +12 -0
  760. data/test/rails_root/vendor/plugins/geokit-rails/test/models/location.rb +4 -0
  761. data/test/rails_root/vendor/plugins/geokit-rails/test/models/mock_address.rb +4 -0
  762. data/test/rails_root/vendor/plugins/geokit-rails/test/models/mock_family.rb +3 -0
  763. data/test/rails_root/vendor/plugins/geokit-rails/test/models/mock_house.rb +3 -0
  764. data/test/rails_root/vendor/plugins/geokit-rails/test/models/mock_organization.rb +4 -0
  765. data/test/rails_root/vendor/plugins/geokit-rails/test/models/mock_person.rb +4 -0
  766. data/test/rails_root/vendor/plugins/geokit-rails/test/models/store.rb +3 -0
  767. data/test/rails_root/vendor/plugins/geokit-rails/test/schema.rb +60 -0
  768. data/test/rails_root/vendor/plugins/geokit-rails/test/tasks.rake +31 -0
  769. data/test/rails_root/vendor/plugins/geokit-rails/test/test_helper.rb +23 -0
  770. data/test/rails_root/vendor/plugins/ssl_requirement/README +43 -0
  771. data/test/rails_root/vendor/plugins/ssl_requirement/lib/ssl_requirement.rb +62 -0
  772. data/test/rails_root/vendor/plugins/ssl_requirement/test/ssl_requirement_test.rb +132 -0
  773. metadata +984 -0
@@ -0,0 +1,289 @@
1
+ module ActiveRecord
2
+ module Acts #:nodoc:
3
+ module MuckSubscription #:nodoc:
4
+ def self.included(base)
5
+ base.extend(ClassMethods)
6
+ end
7
+
8
+ module ClassMethods
9
+
10
+ def acts_as_muck_subscription(options = {})
11
+
12
+ include AASM
13
+ include MuckCommerce::OrderMethods
14
+
15
+ belongs_to :user
16
+ belongs_to :subscription_plan
17
+
18
+ has_many :order_coupons
19
+ has_many :coupons, :through => :subscription_coupons
20
+ has_many :order_transactions, :as => :transactionable, :dependent => :destroy
21
+
22
+ delegate :trial_period, :to => :subscription_plan
23
+
24
+ validates_presence_of :amount, :user
25
+
26
+ # look for subscriptions that expire one week out
27
+ named_scope :expiring_trials, lambda { |*args| {:include => [:user],
28
+ :conditions => ["subscriptions.state = 'trial' AND subscriptions.next_renewal_at BETWEEN ? AND ?",
29
+ (args.first || 7.days.from_now).beginning_of_day,
30
+ (args.first || 7.days.from_now).end_of_day ]} }
31
+
32
+ # subscriptions due today (or another day as specified)
33
+ named_scope :due_today, lambda { |*args| {:include => [:user],
34
+ :conditions => ["(subscriptions.state = 'active' || subscriptions.state = 'trial') AND subscriptions.next_renewal_at BETWEEN ? AND ?",
35
+ (args.first || Time.now).beginning_of_day,
36
+ (args.first || Time.now).end_of_day ]} }
37
+
38
+ # all past due subscriptions
39
+ named_scope :past_due, lambda { |*args| {:include => [:user],
40
+ :conditions => ["(subscriptions.state = 'active' || subscriptions.state = 'trial' || subscriptions.state = 'suspended') AND subscriptions.next_renewal_at < ?",
41
+ Time.now.end_of_day ]} }
42
+
43
+ named_scope :newest, :order => 'created_at DESC'
44
+
45
+ named_scope :default, :conditions => 'subscriptions.default = 1'
46
+
47
+ aasm_initial_state :trial
48
+
49
+ aasm_state :trial
50
+ aasm_state :active, :enter => :activate_subscription
51
+ aasm_state :cancelled, :enter => :cancel_subscription
52
+ aasm_state :suspended, :enter => :suspend_subscription
53
+
54
+ aasm_event :cancel do
55
+ transitions :from => :trial, :to => :cancelled
56
+ transitions :from => :active, :to => :cancelled
57
+ end
58
+
59
+ aasm_event :activate do
60
+ transitions :from => :trial, :to => :active
61
+ transitions :from => :suspended, :to => :active
62
+ transitions :from => :cancelled, :to => :active
63
+ end
64
+
65
+ aasm_event :suspend do
66
+ transitions :from => :trial, :to => :suspended
67
+ transitions :from => :active, :to => :suspended
68
+ end
69
+
70
+ include ActiveRecord::Acts::MuckSubscription::InstanceMethods
71
+ extend ActiveRecord::Acts::MuckSubscription::SingletonMethods
72
+ end
73
+
74
+ end
75
+
76
+
77
+ # class methods
78
+ module SingletonMethods
79
+
80
+ def authorize_subscription(user, options = {})
81
+ amount = 100 # run a $1 authorization on their credit card
82
+ User.transaction do
83
+ begin
84
+ authorization = OrderTransaction.authorize(amount, user.billing_information, options)
85
+ raise MuckCommerce::Exceptions::PaymentGatewayError, t('muck.commerce.billing_information_update_error_friendly', :error => authorization.message) if !authorization.success?
86
+ store_information_response = OrderTransaction.cim_create_update(user.billing_information)
87
+ rescue => ex
88
+ #puts pp user.billing_information.credit_card.errors
89
+ #puts ex
90
+ success = false
91
+ raise ex
92
+ end
93
+ [success, authorization, store_information_response]
94
+ end
95
+ end
96
+
97
+ def subscribe(user, subscription_plan_id, discount_code = '')
98
+ raise MuckCommerce::Exceptions::SubscriptionError, t('muck.commerce.already_subscribed') if already_subscribed?(user, subscription_plan_id)
99
+ subscription_plan = SubscriptionPlan.find(subscription_plan_id)
100
+ coupon, coupon_amount, coupon_override = Coupon.calculate_total_discount(subscription_plan.amount, discount_code)
101
+ success, authorization, store_information_response = Subscription.authorize_subscription(current_user, params) if !coupon_override
102
+
103
+ sub = nil
104
+ if success
105
+ sub = Subscription.new
106
+ sub.number = sub.order_number
107
+ sub.user = user
108
+ sub.coupon = coupon if coupon
109
+ sub.subscription_plan = subscription_plan
110
+ sub.next_renewal_at = DateTime.now.advance(:days => subscription_plan.trial_period.days)
111
+ sub.renewal_period = subscription_plan.renewal_period
112
+ if coupon_override
113
+ sub.amount = 0
114
+ else
115
+ sub.amount = subscription_plan.amount - coupon_amount
116
+ end
117
+ sub.save!
118
+ sub
119
+ end
120
+
121
+ [sub, authorization, store_information_response]
122
+ end
123
+
124
+ # Setup a custom subscription. This is done in the event that every subscription for every user is different.
125
+ # These subscriptions are not associated with a subscription plan because each one is custom.
126
+ # It is assumed that the first bill will not go out for the amount of time specified by renewal_period.
127
+ # This is done so that the first bill can be handled by order.checkout so that there is an order associated with
128
+ # the user.
129
+ # user: User to setup subscription for.
130
+ # amount: Amount of the subscription. Specified in cents.
131
+ # subscription_values: Optional values for the subscription.
132
+ # renewal_period: Amount of time between charges. If no value is provided 1 month will be assumed.
133
+ # discount_codes: An array containing potential discount codes or coupons. These will be checked against the
134
+ # coupons table and associated with the subscription if they are valid.
135
+ # run_authorization: Determines whether or not to run an authorization on the user's billing information to see
136
+ # if it is valid.
137
+ def subscribe_custom(user, amount, subscription_values = {}, renewal_period = nil, discount_codes = [], run_authorization = false)
138
+ coupons, coupon_amount, coupon_override = Coupon.calculate_total_discount(amount, discount_codes)
139
+ if !coupon_override && run_authorization
140
+ success, authorization, store_information_response = Subscription.authorize_subscription(current_user, params)
141
+ else
142
+ success = true
143
+ end
144
+
145
+ sub = nil
146
+ if success
147
+ sub = Subscription.new(subscription_values)
148
+ sub.number = sub.order_number
149
+ sub.user = user
150
+ sub.coupons << coupons unless coupons.empty?
151
+
152
+ if renewal_period
153
+ sub.next_renewal_at = DateTime.now.advance(:days => renewal_period)
154
+ sub.renewal_period = renewal_period
155
+ else
156
+ sub.next_renewal_at = DateTime.now.advance(:months => 1)
157
+ end
158
+
159
+ if coupon_override
160
+ sub.amount = 0
161
+ else
162
+ sub.amount = amount - coupon_amount
163
+ end
164
+ sub.save!
165
+ sub
166
+ end
167
+
168
+ [sub, authorization, store_information_response]
169
+ end
170
+
171
+ # Determines if a user is already subscribed to a given plan
172
+ def already_subscribed?(user, subscription_plan_id)
173
+ user.subscriptions.any? { |subscription| subscription.subscription_plan_id == subscription_plan_id }
174
+ end
175
+
176
+ def process_past_due_subscriptions
177
+ results = past_due.map {|subscription| subscription.charge}
178
+ results_log_message("PAST DUE SUBSCRIPTIONS:", results)
179
+ end
180
+
181
+ private
182
+ def results_log_message(message, results)
183
+ failure_count = results.select {|result| result == false}.length
184
+ succeeded_count = results.select {|result| result == true}.length
185
+ "#{message}\tProcessed: #{results.size}\tFailed: #{failure_count}\tSucceeded: #{succeeded_count}"
186
+ end
187
+
188
+ private
189
+ def timestamp_attribute(attribute_name, time = Time.now)
190
+ self.update_attribute(attribute_name, time)
191
+ end
192
+
193
+ end
194
+
195
+
196
+ module InstanceMethods
197
+
198
+ def suspend_subscription
199
+ timestamp_attribute(:suspended_at)
200
+ self.user.remove_from_role('subscriber')
201
+ MessageMailer.deliver_cc_declined(self.user)
202
+ end
203
+
204
+ def activate_subscription
205
+ self.update_attributes(:activated_at => Time.now, :suspended_at => nil, :cancelled_at => nil)
206
+ user.roles << Role.find_by_name('subscriber') unless user.subscriber?
207
+ end
208
+
209
+ def cancel_subscription
210
+ timestamp_attribute(:cancelled_at)
211
+ self.user.remove_from_role('subscriber')
212
+ end
213
+
214
+ def past_due?
215
+ self.next_renewal_at < DateTime.now.beginning_of_day
216
+ end
217
+
218
+ def reset_billing_date
219
+ if self.renewal_period
220
+ update_attributes(:next_renewal_at => self.next_renewal_at.advance(:days => self.renewal_period), :failed_billing_attempts => 0)
221
+ else
222
+ update_attributes(:next_renewal_at => DateTime.now.advance(:months => 1), :failed_billing_attempts => 0)
223
+ end
224
+ end
225
+
226
+ def reactivate_if_needed!
227
+ return true if self.active? && !past_due?
228
+ if OrderTransaction.cim_validate_user(self.user.billing_information).success?
229
+ self.update_attributes(:failed_billing_attempts => 0)
230
+ self.activate!
231
+ true
232
+ else
233
+ false
234
+ end
235
+ end
236
+
237
+ def charge
238
+ return false if self.cancelled? || self.suspended?
239
+
240
+ return true if self.user.non_billable?
241
+
242
+ if self.user.billing_information.blank?
243
+ success = false
244
+ elsif self.amount == 0
245
+ success = true
246
+ else
247
+ @purchase = OrderTransaction.cim_purchase(self.amount_in_dollars, self.user.billing_information)
248
+ success = @purchase.success?
249
+ self.order_transactions.push(@purchase) if @purchase
250
+ end
251
+
252
+ if success
253
+ self.reset_billing_date
254
+ self.activate! if self.trial?
255
+ true
256
+ else
257
+ self.update_attribute(:failed_billing_attempts, self.failed_billing_attempts + 1)
258
+ if self.failed_billing_attempts > GlobalConfig.max_billing_attempt_failures
259
+ self.suspend!
260
+ end
261
+ false
262
+ end
263
+ end
264
+
265
+ def enroll_user_in_program_courses
266
+ self.subscription_plan.programs.each do |program|
267
+ program.enroll_user(self.user)
268
+ end
269
+ end
270
+
271
+ def coupon_code
272
+ coupon.nil? ? "" : coupon.code
273
+ end
274
+
275
+ def needs_payment_info?
276
+ self.user.billing_information.blank?
277
+ end
278
+
279
+ def amount_price
280
+ self.amount/100.0
281
+ end
282
+
283
+ end
284
+
285
+ end
286
+
287
+ end
288
+
289
+ end
@@ -0,0 +1,34 @@
1
+ module ActiveRecord
2
+ module Acts #:nodoc:
3
+ module MuckSubscriptionPlan #:nodoc:
4
+ def self.included(base)
5
+ base.extend(ClassMethods)
6
+ end
7
+
8
+ module ClassMethods
9
+
10
+ def acts_as_muck_subscription_plan(options = {})
11
+
12
+ validates_uniqueness_of :name
13
+ validates_presence_of :name, :amount, :renewal_period, :trial_period
14
+ named_scope :by_name, :order => 'name ASC'
15
+
16
+ include ActiveRecord::Acts::MuckSubscriptionPlan::InstanceMethods
17
+ extend ActiveRecord::Acts::MuckSubscriptionPlan::SingletonMethods
18
+ end
19
+
20
+ end
21
+
22
+ # class methods
23
+ module SingletonMethods
24
+ end
25
+
26
+ # All the methods available to a record that has had <tt>acts_as_muck_subscription_plan</tt> specified.
27
+ module InstanceMethods
28
+ end
29
+
30
+ end
31
+
32
+ end
33
+
34
+ end
@@ -0,0 +1,54 @@
1
+ module MuckCommerce
2
+ module CartMethods
3
+
4
+ protected
5
+
6
+ def recover_cart
7
+ @cart = get_cart(@user)
8
+
9
+ # TODO this is a security preference. In theory one user could get into another user's cart
10
+ # if @cart && @cart.user
11
+ # allowed_access?(:owner => current_user, :object_user_id => @cart.user_id, :permit_roles => ['administrator'])
12
+ # end
13
+ end
14
+
15
+ def get_cart(user)
16
+ if user && user.cart
17
+ convert_existing_to_user_cart(user)
18
+ cookies[:cart_token] = user.cart.token
19
+ return user.cart
20
+ end
21
+
22
+ user = nil if user == false
23
+
24
+ if cookies[:cart_token]
25
+ cart = Cart.find_by_token(cookies[:cart_token])
26
+ else
27
+ cart = Cart.create(:cartable => user)
28
+ cookies[:cart_token] = cart.token
29
+ end
30
+ cart
31
+ end
32
+
33
+ def convert_existing_to_user_cart(user)
34
+ cart_too = Cart.find_by_token(cookies[:cart_token]) if cookies[:cart_token]
35
+ if cart_too
36
+ cart_too.items.each do |item|
37
+ item.cart = user.cart
38
+ item.save
39
+ end
40
+ end
41
+ end
42
+
43
+ def permission_denied
44
+ respond_to do |format|
45
+ format.html do
46
+ flash[:notice] = 'Please login to view your cart'
47
+ redirect_to login_path
48
+ end
49
+ end
50
+ end
51
+
52
+ end
53
+
54
+ end
@@ -0,0 +1,94 @@
1
+ module MuckCommerce
2
+ class Configure
3
+
4
+ def self.enable_live_test_gateway(gateway = nil, cim_gateway = nil, login = nil, password = nil, signature = nil)
5
+ gateway(true, gateway, cim_gateway, login, password, signature)
6
+ GlobalConfig.credit_card_types = [[ "Visa", "visa" ], [ "MasterCard", "master" ], [ "Discover", "discover" ], [ "American Express", "american_express" ]]
7
+ end
8
+
9
+ def self.disable_live_test_gateway
10
+ gateway
11
+ end
12
+
13
+ def self.cim_enabled?
14
+ @cim_enabled
15
+ end
16
+
17
+ # Configures the gateway for payment transactions.
18
+ #
19
+ # Notes:
20
+ # For most uses the default options are fine and the gateway can be configured by simply calling:
21
+ # MuckCommerce::Configure.gateway as shown below.
22
+ #
23
+ # To configure the gateway for your application add the following to environment.rb
24
+ # config.after_initialize do
25
+ # MuckCommerce::Configure.gateway
26
+ # end
27
+ #
28
+ # The development environment will also require the addition of the same configuration.
29
+ # This is required so that the gateway is properly setup for each request.
30
+ # Without it the gateway will be nil after the first request.
31
+ # Add the following to development.rb
32
+ # config.to_prepare do
33
+ # MuckCommerce::Configure.gateway
34
+ # end
35
+ #
36
+ # Parameters:
37
+ # enable_live_test_gateway: Normally tests are run against the local bogus gateway. However, tests
38
+ # can use the live test gateway by setting this value to true. The tests
39
+ # found in test/rails_root/remote make use of this option.
40
+ # gateway: Override the gateway specified in global_config.yml.
41
+ # cim_gateway: Override the cim_gateway specified in global_config.yml.
42
+ # login: Override the login specified in global_config.yml.
43
+ # password: Override the password specified in global_config.yml.
44
+ # signature: Override the signature specified in global_config.yml.
45
+ # production_test: If set to true then the system will use the test gateway even in production.
46
+ # Useful if you want to test the production site before going live
47
+ #
48
+ def self.gateway(enable_live_test_gateway = false, gateway = nil, cim_gateway = nil, login = nil, password = nil, signature = nil, production_test = false)
49
+
50
+ production_test ||= GlobalConfig.commerce_run_production_as_test
51
+ if !production_test && Rails.env.production?
52
+ ActiveMerchant::Billing::Base.mode = :production
53
+ else
54
+ ActiveMerchant::Billing::Base.mode = :test
55
+ end
56
+
57
+ if !enable_live_test_gateway && Rails.env.test?
58
+ OrderTransaction.gateway = ActiveMerchant::Billing::BogusGateway.new
59
+ OrderTransaction.cim_gateway = ActiveMerchant::Billing::BogusGateway.new
60
+ OrderTransaction.paypal_express_gateway = ActiveMerchant::Billing::BogusGateway.new
61
+ GlobalConfig.credit_card_types = [[ "Visa", "bogus" ], [ "MasterCard", "bogus" ], [ "Discover", "bogus" ], [ "American Express", "bogus" ]]
62
+ @cim_enabled = false
63
+ else
64
+ # These settings connect your system with the paypal express gateway. This will enable checkout via paypal.
65
+ if GlobalConfig.enable_paypal_express
66
+ paypal_options = {
67
+ :login => login || GlobalConfig.paypal_login,
68
+ :password => password || GlobalConfig.paypal_password,
69
+ :signature => signature || GlobalConfig.paypal_signature
70
+ }
71
+ OrderTransaction.paypal_express_gateway = ActiveMerchant::Billing::PaypalExpressGateway.new(paypal_options)
72
+ end
73
+
74
+ # These are the options (usually only a login and password) required to connect with your payment gateway.
75
+ gateway_options = {
76
+ :login => login || GlobalConfig.gateway_login,
77
+ :password => password || GlobalConfig.gateway_password,
78
+ }
79
+ # Paypal requires a signature. If you are using paypal as your processing gateway be sure to include this signature.
80
+ gateway_options.merge!(:signature => signature || GlobalConfig.gateway_signature) if signature || GlobalConfig.gateway_signature
81
+
82
+ # This is the gateway that will be used to process ecommerce related transactions
83
+ OrderTransaction.gateway = ActiveMerchant::Billing::Base.gateway(gateway || GlobalConfig.gateway.to_sym).new(gateway_options)
84
+
85
+ # CIM (Authorize.net) or Vault (Braintree) systems are used to securely store sensitive customer information at the gateway
86
+ OrderTransaction.cim_gateway = ActiveMerchant::Billing::Base.gateway(cim_gateway || GlobalConfig.cim_gateway.to_sym).new(gateway_options) if cim_gateway || GlobalConfig.cim_gateway
87
+
88
+ @cim_enabled = !OrderTransaction.cim_gateway.blank?
89
+ end
90
+
91
+ end
92
+
93
+ end
94
+ end
@@ -0,0 +1,36 @@
1
+ module MuckCommerce
2
+ module CurrencyMethods
3
+
4
+ # Assumes a field named amount
5
+ def amount_dollars= val
6
+ self.amount = dollars_to_cents(val)
7
+ end
8
+
9
+ # Assumes a field named amount
10
+ def amount_dollars
11
+ cents_to_dollars(self.amount)
12
+ end
13
+
14
+ # Assumes a field named amount
15
+ # Get the order amount as a formatted currency instead of as cents.
16
+ def amount_price
17
+ format_currency(self.amount)
18
+ end
19
+
20
+ protected
21
+
22
+ def format_currency(val)
23
+ format("%.2f", cents_to_dollars(val))
24
+ end
25
+
26
+ def cents_to_dollars(val)
27
+ val * 0.01
28
+ end
29
+
30
+ def dollars_to_cents(val)
31
+ val * 100
32
+ end
33
+
34
+ end
35
+
36
+ end
@@ -0,0 +1,17 @@
1
+ module MuckCommerce
2
+ module DiscountMethods
3
+
4
+ def calculate_discounts(amount, coupon_codes)
5
+ coupons = []
6
+ coupon_amount = 0
7
+ coupon_override = false
8
+ if GlobalConfig.enable_coupons && coupon_codes
9
+ coupons, coupon_amount, coupon_override = Coupon.calculate_total_discount(amount, coupon_codes)
10
+ end
11
+ [coupons, coupon_amount, coupon_override]
12
+ end
13
+
14
+ end
15
+
16
+ end
17
+
@@ -0,0 +1,8 @@
1
+ module MuckCommerce
2
+ module Exceptions
3
+ class InvalidValue < StandardError; end
4
+ class PaymentGatewayError < StandardError; end
5
+ class CouponError < StandardError; end
6
+ class SubscriptionError < StandardError; end
7
+ end
8
+ end
@@ -0,0 +1,8 @@
1
+ class ActionController::Routing::RouteSet
2
+ def load_routes_with_muck_commerce!
3
+ muck_commerce_routes = File.join(File.dirname(__FILE__), *%w[.. .. config muck_commerce_routes.rb])
4
+ add_configuration_file(muck_commerce_routes) unless configuration_files.include? muck_commerce_routes
5
+ load_routes_without_muck_commerce!
6
+ end
7
+ alias_method_chain :load_routes!, :muck_commerce
8
+ end
@@ -0,0 +1,22 @@
1
+ module MuckCommerceCustomFormBuilder
2
+
3
+ # creates a select control with payment options.
4
+ def payment_method_select(method, options = {}, html_options = {})
5
+ self.select(method, GlobalConfig.payment_methods, options.merge(:wrapper_id => 'payment-options-container'), html_options.merge(:id => 'payment-options'))
6
+ end
7
+
8
+ def credit_card_type_select(method, options = {}, html_options = {})
9
+ self.select(method, GlobalConfig.credit_card_types, options.merge(:prompt => "Select a credit card", :wrapper_id => 'credit-card-types-container'), html_options.merge(:id => 'credit-card-types'))
10
+ end
11
+
12
+ def achholder_select(method, options = {}, html_options = {})
13
+ self.select(method, GlobalConfig.achholder_types, options.merge(:prompt => "Select ACH Holder", :wrapper_id => 'achholder-types-container'), html_options.merge(:id => 'achholder-types'))
14
+ end
15
+
16
+ def achtype_select(method, options = {}, html_options = {})
17
+ self.select(method, GlobalConfig.achtypes, options.merge(:prompt => "Select ACH Type", :wrapper_id => 'achtypes-container'), html_options.merge(:id => 'achtypes'))
18
+ end
19
+
20
+ end
21
+
22
+ MuckCustomFormBuilder.send :include, MuckCommerceCustomFormBuilder
@@ -0,0 +1,19 @@
1
+ module MuckCommerce
2
+ module OrderMethods
3
+
4
+ def order_number
5
+ return self.number if !self.number.nil?
6
+ record = true
7
+ while record
8
+ random = Array.new(10){rand(10)}.join
9
+ record = Order.find(:first, :conditions => ["number = ?", random])
10
+ end
11
+ self.number = random
12
+ end
13
+
14
+ def dollar_amount
15
+ self.amount * 0.01
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,28 @@
1
+ # This module is meant to be mixed into a controller that needs to support paypal express transactions
2
+ module MuckCommerce
3
+ module PaypalMethods
4
+
5
+ def express
6
+ response = OrderTransaction.paypal_express_gateway.setup_authorization(@cart.total,
7
+ :ip => request.remote_ip,
8
+ :return_url => build_paypal_express_return_url,
9
+ :cancel_return_url => build_paypal_express_cancel_url
10
+ )
11
+ redirect_to OrderTransaction.paypal_express_gateway.redirect_url_for(response.token)
12
+ end
13
+
14
+ protected
15
+ def build_paypal_express_return_url
16
+ new_order_url
17
+ end
18
+
19
+ def build_paypal_express_cancel_url
20
+ cart_url(@cart)
21
+ end
22
+
23
+ def paypal_express?
24
+ !params[:token].blank?
25
+ end
26
+
27
+ end
28
+ end
@@ -0,0 +1,41 @@
1
+ require 'rake'
2
+ require 'rake/tasklib'
3
+ require 'fileutils'
4
+
5
+ module MuckCommerce
6
+ class Tasks < ::Rake::TaskLib
7
+ def initialize
8
+ define
9
+ end
10
+
11
+ private
12
+ def define
13
+
14
+ namespace :muck do
15
+
16
+ namespace :sync do
17
+
18
+ # namespace :db do
19
+ #
20
+ # desc "Populates the database with default values"
21
+ # task :populate => :environment do
22
+ #
23
+ # end
24
+ #
25
+ # end
26
+
27
+ desc "Sync files from muck commerce."
28
+ task :commerce do
29
+ path = File.join(File.dirname(__FILE__), *%w[.. ..])
30
+ system "rsync -ruv #{path}/db ."
31
+ #system "rsync -ruv #{path}/public ."
32
+ end
33
+
34
+ end
35
+
36
+ end
37
+
38
+ end
39
+ end
40
+ end
41
+ MuckCommerce::Tasks.new