shoppy 0.9.0

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 (352) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.rdoc +3 -0
  4. data/Rakefile +34 -0
  5. data/app/.DS_Store +0 -0
  6. data/app/api/apihelpers/api_auth.rb +50 -0
  7. data/app/api/base.rb +7 -0
  8. data/app/api/v1/auth.rb +57 -0
  9. data/app/api/v1/test.rb +15 -0
  10. data/app/api/v1/users.rb +50 -0
  11. data/app/api/v1/v1_api.rb +15 -0
  12. data/app/api/vo/user_vo.rb +7 -0
  13. data/app/assets/fonts/.DS_Store +0 -0
  14. data/app/assets/fonts/glyphicons-halflings-regular.eot +0 -0
  15. data/app/assets/fonts/glyphicons-halflings-regular.svg +229 -0
  16. data/app/assets/fonts/glyphicons-halflings-regular.ttf +0 -0
  17. data/app/assets/fonts/glyphicons-halflings-regular.woff +0 -0
  18. data/app/assets/images/.DS_Store +0 -0
  19. data/app/assets/images/Sorting icons.psd +0 -0
  20. data/app/assets/images/back_disabled.png +0 -0
  21. data/app/assets/images/back_enabled.png +0 -0
  22. data/app/assets/images/back_enabled_hover.png +0 -0
  23. data/app/assets/images/favicon.ico +0 -0
  24. data/app/assets/images/forward_disabled.png +0 -0
  25. data/app/assets/images/forward_enabled.png +0 -0
  26. data/app/assets/images/forward_enabled_hover.png +0 -0
  27. data/app/assets/images/shoppy.svg +34 -0
  28. data/app/assets/images/sort_asc.png +0 -0
  29. data/app/assets/images/sort_asc_disabled.png +0 -0
  30. data/app/assets/images/sort_both.png +0 -0
  31. data/app/assets/images/sort_desc.png +0 -0
  32. data/app/assets/images/sort_desc_disabled.png +0 -0
  33. data/app/assets/images/spritemap.png +0 -0
  34. data/app/assets/images/spritemap@2x.png +0 -0
  35. data/app/assets/javascripts/.DS_Store +0 -0
  36. data/app/assets/javascripts/bootstrap.js +2114 -0
  37. data/app/assets/javascripts/bootstrap.min.js +6 -0
  38. data/app/assets/javascripts/jasny-bootstrap.min.js +6 -0
  39. data/app/assets/javascripts/jquery.dataTables.min.js +155 -0
  40. data/app/assets/javascripts/main.js +29 -0
  41. data/app/assets/javascripts/shoppy.js +31 -0
  42. data/app/assets/stylesheets/.DS_Store +0 -0
  43. data/app/assets/stylesheets/bootstrap.css +6203 -0
  44. data/app/assets/stylesheets/jasny-bootstrap.css +621 -0
  45. data/app/assets/stylesheets/jquery.dataTables.min.css +1 -0
  46. data/app/assets/stylesheets/jquery.dataTables_themeroller.css +330 -0
  47. data/app/assets/stylesheets/shoppy.css +23 -0
  48. data/app/assets/stylesheets/style.sass +79 -0
  49. data/app/controllers/.DS_Store +0 -0
  50. data/app/controllers/shoppy/accounts_controller.rb +102 -0
  51. data/app/controllers/shoppy/application_controller.rb +23 -0
  52. data/app/controllers/shoppy/brands_controller.rb +60 -0
  53. data/app/controllers/shoppy/cart_controller.rb +46 -0
  54. data/app/controllers/shoppy/categories_controller.rb +72 -0
  55. data/app/controllers/shoppy/concerns/.keep +0 -0
  56. data/app/controllers/shoppy/customer_addresses_controller.rb +90 -0
  57. data/app/controllers/shoppy/home_controller.rb +9 -0
  58. data/app/controllers/shoppy/inventories_controller.rb +62 -0
  59. data/app/controllers/shoppy/locations_controller.rb +80 -0
  60. data/app/controllers/shoppy/logs_controller.rb +9 -0
  61. data/app/controllers/shoppy/manufacturers_controller.rb +77 -0
  62. data/app/controllers/shoppy/options_controller.rb +63 -0
  63. data/app/controllers/shoppy/orders_controller.rb +130 -0
  64. data/app/controllers/shoppy/products_controller.rb +98 -0
  65. data/app/controllers/shoppy/reviews_controller.rb +70 -0
  66. data/app/controllers/shoppy/sessions_controller.rb +5 -0
  67. data/app/controllers/shoppy/settings_controller.rb +26 -0
  68. data/app/controllers/shoppy/shipments_controller.rb +125 -0
  69. data/app/controllers/shoppy/variants_controller.rb +104 -0
  70. data/app/helpers/shoppy/accounts_helper.rb +5 -0
  71. data/app/helpers/shoppy/application_helper.rb +19 -0
  72. data/app/helpers/shoppy/brands_helper.rb +4 -0
  73. data/app/helpers/shoppy/cart_helper.rb +66 -0
  74. data/app/helpers/shoppy/categories_helper.rb +4 -0
  75. data/app/helpers/shoppy/customer_addresses_helper.rb +4 -0
  76. data/app/helpers/shoppy/home_helper.rb +5 -0
  77. data/app/helpers/shoppy/inventories_helper.rb +53 -0
  78. data/app/helpers/shoppy/locations_helper.rb +4 -0
  79. data/app/helpers/shoppy/logs_helper.rb +4 -0
  80. data/app/helpers/shoppy/manufacturers_helper.rb +4 -0
  81. data/app/helpers/shoppy/options_helper.rb +43 -0
  82. data/app/helpers/shoppy/orders_helper.rb +61 -0
  83. data/app/helpers/shoppy/products_helper.rb +65 -0
  84. data/app/helpers/shoppy/reviews_helper.rb +4 -0
  85. data/app/helpers/shoppy/settings_helper.rb +5 -0
  86. data/app/helpers/shoppy/shipments_helper.rb +43 -0
  87. data/app/helpers/shoppy/variants_helper.rb +4 -0
  88. data/app/models/shoppy/.DS_Store +0 -0
  89. data/app/models/shoppy/admin.rb +5 -0
  90. data/app/models/shoppy/brand.rb +23 -0
  91. data/app/models/shoppy/cart_item.rb +13 -0
  92. data/app/models/shoppy/category.rb +50 -0
  93. data/app/models/shoppy/concerns/.DS_Store +0 -0
  94. data/app/models/shoppy/concerns/models/api_token_authenticatable.rb +36 -0
  95. data/app/models/shoppy/concerns/models/hashable.rb +60 -0
  96. data/app/models/shoppy/concerns/models/optionable.rb +60 -0
  97. data/app/models/shoppy/concerns/models/promotional.rb +36 -0
  98. data/app/models/shoppy/concerns/models/taggable.rb +44 -0
  99. data/app/models/shoppy/customer.rb +10 -0
  100. data/app/models/shoppy/customer_address.rb +44 -0
  101. data/app/models/shoppy/inventory.rb +18 -0
  102. data/app/models/shoppy/log.rb +8 -0
  103. data/app/models/shoppy/manufacturer.rb +35 -0
  104. data/app/models/shoppy/options_group.rb +57 -0
  105. data/app/models/shoppy/options_item.rb +18 -0
  106. data/app/models/shoppy/order.rb +15 -0
  107. data/app/models/shoppy/order_line.rb +16 -0
  108. data/app/models/shoppy/payment_method.rb +19 -0
  109. data/app/models/shoppy/product.rb +43 -0
  110. data/app/models/shoppy/review.rb +12 -0
  111. data/app/models/shoppy/setting.rb +11 -0
  112. data/app/models/shoppy/shipment.rb +11 -0
  113. data/app/models/shoppy/stock_location.rb +47 -0
  114. data/app/models/shoppy/user.rb +37 -0
  115. data/app/models/shoppy/variant.rb +48 -0
  116. data/app/views/.DS_Store +0 -0
  117. data/app/views/accounts/admins.html.erb +104 -0
  118. data/app/views/accounts/customers.html.erb +106 -0
  119. data/app/views/accounts/show.html.erb +50 -0
  120. data/app/views/brands/index.html.erb +85 -0
  121. data/app/views/brands/show.html.erb +31 -0
  122. data/app/views/cart/index.html.erb +52 -0
  123. data/app/views/categories/index.html.erb +84 -0
  124. data/app/views/categories/show.html.erb +29 -0
  125. data/app/views/customer_addresses/index.html.erb +112 -0
  126. data/app/views/customer_addresses/show.html.erb +50 -0
  127. data/app/views/devise/confirmations/new.html.erb +12 -0
  128. data/app/views/devise/mailer/confirmation_instructions.html.erb +5 -0
  129. data/app/views/devise/mailer/reset_password_instructions.html.erb +8 -0
  130. data/app/views/devise/mailer/unlock_instructions.html.erb +7 -0
  131. data/app/views/devise/passwords/edit.html.erb +16 -0
  132. data/app/views/devise/passwords/new.html.erb +12 -0
  133. data/app/views/devise/registrations/edit.html.erb +29 -0
  134. data/app/views/devise/registrations/new.html.erb +23 -0
  135. data/app/views/devise/sessions/new.html.erb +33 -0
  136. data/app/views/devise/shared/_links.erb +25 -0
  137. data/app/views/devise/unlocks/new.html.erb +12 -0
  138. data/app/views/home/index.html.erb +4 -0
  139. data/app/views/inventories/.DS_Store +0 -0
  140. data/app/views/inventories/index.html.erb +119 -0
  141. data/app/views/layouts/.DS_Store +0 -0
  142. data/app/views/layouts/shoppy.html.erb +27 -0
  143. data/app/views/locations/index.html.erb +120 -0
  144. data/app/views/locations/show.html.erb +58 -0
  145. data/app/views/logs/index.html.erb +49 -0
  146. data/app/views/manufacturers/index.html.erb +119 -0
  147. data/app/views/manufacturers/show.html.erb +62 -0
  148. data/app/views/options/index.html.erb +90 -0
  149. data/app/views/options/show.html.erb +32 -0
  150. data/app/views/orders/index.html.erb +174 -0
  151. data/app/views/orders/show.html.erb +74 -0
  152. data/app/views/products/index.html.erb +102 -0
  153. data/app/views/products/show.html.erb +112 -0
  154. data/app/views/reviews/index.html.erb +58 -0
  155. data/app/views/reviews/show.html.erb +46 -0
  156. data/app/views/settings/show.html.erb +50 -0
  157. data/app/views/shared/_custom_file_input.html.erb +12 -0
  158. data/app/views/shared/_flashes.html.erb +21 -0
  159. data/app/views/shared/_navigation.html.erb +66 -0
  160. data/app/views/shipments/index.html.erb +97 -0
  161. data/app/views/shipments/show.html.erb +84 -0
  162. data/app/views/variants/index.html.erb +119 -0
  163. data/app/views/variants/show.html.erb +114 -0
  164. data/bin/shoppy +183 -0
  165. data/config/routes.rb +124 -0
  166. data/db/.DS_Store +0 -0
  167. data/db/migrate/001__setup_hstore.rb +9 -0
  168. data/db/migrate/002__create_logs.rb +11 -0
  169. data/db/migrate/003__devise_create_users.rb +49 -0
  170. data/db/migrate/004__add_personal_info_to_user.rb +8 -0
  171. data/db/migrate/005__create_user_addresses.rb +16 -0
  172. data/db/migrate/006__create_categories.rb +11 -0
  173. data/db/migrate/007__create_brands.rb +10 -0
  174. data/db/migrate/008__create_manufacturers.rb +19 -0
  175. data/db/migrate/009__create_options_groups.rb +10 -0
  176. data/db/migrate/010__create_options_items.rb +10 -0
  177. data/db/migrate/011__create_products.rb +14 -0
  178. data/db/migrate/012__create_product_options_joint_table.rb +9 -0
  179. data/db/migrate/013__create_stock_locations.rb +18 -0
  180. data/db/migrate/014__create_variants.rb +12 -0
  181. data/db/migrate/015__add_promotional_to_variant.rb +8 -0
  182. data/db/migrate/016__create_inventories.rb +12 -0
  183. data/db/migrate/017__create_payment_methods.rb +9 -0
  184. data/db/migrate/018__create_cart_items.rb +12 -0
  185. data/db/migrate/019__create_orders.rb +11 -0
  186. data/db/migrate/020__create_order_lines.rb +14 -0
  187. data/db/migrate/021__add_type_to_user.rb +5 -0
  188. data/db/migrate/022__rename_user_address_to_customer_address.rb +5 -0
  189. data/db/migrate/023__create_shipments.rb +12 -0
  190. data/db/migrate/024__add_shipment_id_to_order_line.rb +5 -0
  191. data/db/migrate/025__change_user_gender_to_not_nullable.rb +5 -0
  192. data/db/migrate/026__add_category_id_to_product.rb +5 -0
  193. data/db/migrate/027__add_attachment_brand_image_to_brands.rb +11 -0
  194. data/db/migrate/028__add_delivery_date_to_shipment.rb +5 -0
  195. data/db/migrate/029__add_customer_info_to_order.rb +13 -0
  196. data/db/migrate/030__add_status_to_order.rb +5 -0
  197. data/db/migrate/031__add_default_address_to_user.rb +5 -0
  198. data/db/migrate/032__add_options_to_variant.rb +5 -0
  199. data/db/migrate/033__add_display_to_options_groups.rb +5 -0
  200. data/db/migrate/034__add_points_to_variant.rb +5 -0
  201. data/db/migrate/035__add_points_to_user.rb +5 -0
  202. data/db/migrate/036__define_ids.rb +25 -0
  203. data/db/migrate/037__create_seed_users.rb +13 -0
  204. data/db/migrate/038__add_name_to_customer_address.rb +5 -0
  205. data/db/migrate/039__create_reviews.rb +14 -0
  206. data/db/migrate/040__alter_table_customer_address.rb +5 -0
  207. data/db/migrate/041__create_settings.rb +23 -0
  208. data/lib/.DS_Store +0 -0
  209. data/lib/shoppy.rb +13 -0
  210. data/lib/shoppy/client.rb +53 -0
  211. data/lib/shoppy/engine.rb +4 -0
  212. data/lib/shoppy/version.rb +3 -0
  213. data/lib/tasks/shoppy_tasks.rake +4 -0
  214. data/lib/template/.gitignore +20 -0
  215. data/lib/template/Gemfile +46 -0
  216. data/lib/template/Gemfile.lock +218 -0
  217. data/lib/template/Rakefile +6 -0
  218. data/lib/template/app/assets/images/.keep +0 -0
  219. data/lib/template/app/assets/javascripts/application.js +13 -0
  220. data/lib/template/app/assets/stylesheets/application.css +15 -0
  221. data/lib/template/app/controllers/accounts_controller.rb +3 -0
  222. data/lib/template/app/controllers/application_controller.rb +3 -0
  223. data/lib/template/app/controllers/brands_controller.rb +3 -0
  224. data/lib/template/app/controllers/cart_controller.rb +3 -0
  225. data/lib/template/app/controllers/categories_controller.rb +3 -0
  226. data/lib/template/app/controllers/concerns/.keep +0 -0
  227. data/lib/template/app/controllers/customer_addresses_controller.rb +3 -0
  228. data/lib/template/app/controllers/home_controller.rb +3 -0
  229. data/lib/template/app/controllers/inventories_controller.rb +3 -0
  230. data/lib/template/app/controllers/locations_controller.rb +3 -0
  231. data/lib/template/app/controllers/logs_controller.rb +3 -0
  232. data/lib/template/app/controllers/manufacturers_controller.rb +3 -0
  233. data/lib/template/app/controllers/options_controller.rb +3 -0
  234. data/lib/template/app/controllers/orders_controller.rb +3 -0
  235. data/lib/template/app/controllers/products_controller.rb +3 -0
  236. data/lib/template/app/controllers/reviews_controller.rb +3 -0
  237. data/lib/template/app/controllers/sessions_controller.rb +3 -0
  238. data/lib/template/app/controllers/settings_controller.rb +3 -0
  239. data/lib/template/app/controllers/shipments_controller.rb +3 -0
  240. data/lib/template/app/controllers/variants_controller.rb +3 -0
  241. data/lib/template/app/helpers/.keep +0 -0
  242. data/lib/template/app/helpers/orders_helper.rb +4 -0
  243. data/lib/template/app/mailers/.keep +0 -0
  244. data/lib/template/app/models/.keep +0 -0
  245. data/lib/template/app/models/account.rb +4 -0
  246. data/lib/template/app/models/admin.rb +4 -0
  247. data/lib/template/app/models/brand.rb +3 -0
  248. data/lib/template/app/models/cart_item.rb +3 -0
  249. data/lib/template/app/models/category.rb +3 -0
  250. data/lib/template/app/models/concerns/.keep +0 -0
  251. data/lib/template/app/models/concerns/hashable.rb +4 -0
  252. data/lib/template/app/models/customer.rb +4 -0
  253. data/lib/template/app/models/customer_address.rb +3 -0
  254. data/lib/template/app/models/inventory.rb +3 -0
  255. data/lib/template/app/models/log.rb +3 -0
  256. data/lib/template/app/models/manufacturer.rb +3 -0
  257. data/lib/template/app/models/option_item.rb +3 -0
  258. data/lib/template/app/models/options_group.rb +3 -0
  259. data/lib/template/app/models/order.rb +3 -0
  260. data/lib/template/app/models/order_line.rb +3 -0
  261. data/lib/template/app/models/payment_method.rb +3 -0
  262. data/lib/template/app/models/product.rb +3 -0
  263. data/lib/template/app/models/review.rb +3 -0
  264. data/lib/template/app/models/setting.rb +3 -0
  265. data/lib/template/app/models/shipment.rb +3 -0
  266. data/lib/template/app/models/stock_location.rb +3 -0
  267. data/lib/template/app/models/variant.rb +3 -0
  268. data/lib/template/app/views/layouts/.keep +0 -0
  269. data/lib/template/bin/bundle +3 -0
  270. data/lib/template/bin/rails +8 -0
  271. data/lib/template/bin/rake +8 -0
  272. data/lib/template/bin/spring +18 -0
  273. data/lib/template/config.ru +4 -0
  274. data/lib/template/config/application.rb +23 -0
  275. data/lib/template/config/boot.rb +4 -0
  276. data/lib/template/config/database.yml +86 -0
  277. data/lib/template/config/environment.rb +5 -0
  278. data/lib/template/config/environments/development.rb +37 -0
  279. data/lib/template/config/environments/production.rb +78 -0
  280. data/lib/template/config/environments/test.rb +39 -0
  281. data/lib/template/config/initializers/assets.rb +8 -0
  282. data/lib/template/config/initializers/backtrace_silencers.rb +7 -0
  283. data/lib/template/config/initializers/cookies_serializer.rb +3 -0
  284. data/lib/template/config/initializers/devise.rb +256 -0
  285. data/lib/template/config/initializers/filter_parameter_logging.rb +4 -0
  286. data/lib/template/config/initializers/inflections.rb +16 -0
  287. data/lib/template/config/initializers/mime_types.rb +4 -0
  288. data/lib/template/config/initializers/session_store.rb +3 -0
  289. data/lib/template/config/initializers/wrap_parameters.rb +14 -0
  290. data/lib/template/config/locales/devise.en.yml +59 -0
  291. data/lib/template/config/locales/en.yml +23 -0
  292. data/lib/template/config/routes.rb +3 -0
  293. data/lib/template/config/secrets.yml +22 -0
  294. data/lib/template/db/migrate/.keep +0 -0
  295. data/lib/template/db/seeds.rb +7 -0
  296. data/lib/template/lib/assets/.keep +0 -0
  297. data/lib/template/lib/tasks/.keep +0 -0
  298. data/lib/template/log/.keep +0 -0
  299. data/lib/template/public/404.html +67 -0
  300. data/lib/template/public/422.html +67 -0
  301. data/lib/template/public/500.html +66 -0
  302. data/lib/template/public/favicon.ico +0 -0
  303. data/lib/template/public/robots.txt +5 -0
  304. data/lib/template/test/controllers/.keep +0 -0
  305. data/lib/template/test/fixtures/.keep +0 -0
  306. data/lib/template/test/helpers/.keep +0 -0
  307. data/lib/template/test/integration/.keep +0 -0
  308. data/lib/template/test/mailers/.keep +0 -0
  309. data/lib/template/test/models/.keep +0 -0
  310. data/lib/template/test/test_helper.rb +10 -0
  311. data/lib/template/vendor/assets/javascripts/.keep +0 -0
  312. data/lib/template/vendor/assets/stylesheets/.keep +0 -0
  313. data/test/dummy/README.rdoc +28 -0
  314. data/test/dummy/Rakefile +6 -0
  315. data/test/dummy/app/assets/javascripts/application.js +13 -0
  316. data/test/dummy/app/assets/stylesheets/application.css +15 -0
  317. data/test/dummy/app/controllers/application_controller.rb +5 -0
  318. data/test/dummy/app/helpers/application_helper.rb +2 -0
  319. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  320. data/test/dummy/bin/bundle +3 -0
  321. data/test/dummy/bin/rails +4 -0
  322. data/test/dummy/bin/rake +4 -0
  323. data/test/dummy/config.ru +4 -0
  324. data/test/dummy/config/application.rb +23 -0
  325. data/test/dummy/config/boot.rb +5 -0
  326. data/test/dummy/config/database.yml +25 -0
  327. data/test/dummy/config/environment.rb +5 -0
  328. data/test/dummy/config/environments/development.rb +37 -0
  329. data/test/dummy/config/environments/production.rb +78 -0
  330. data/test/dummy/config/environments/test.rb +39 -0
  331. data/test/dummy/config/initializers/assets.rb +8 -0
  332. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  333. data/test/dummy/config/initializers/cookies_serializer.rb +3 -0
  334. data/test/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  335. data/test/dummy/config/initializers/inflections.rb +16 -0
  336. data/test/dummy/config/initializers/mime_types.rb +4 -0
  337. data/test/dummy/config/initializers/session_store.rb +3 -0
  338. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  339. data/test/dummy/config/locales/en.yml +23 -0
  340. data/test/dummy/config/routes.rb +56 -0
  341. data/test/dummy/config/secrets.yml +22 -0
  342. data/test/dummy/public/404.html +67 -0
  343. data/test/dummy/public/422.html +67 -0
  344. data/test/dummy/public/500.html +66 -0
  345. data/test/dummy/public/favicon.ico +0 -0
  346. data/test/integration/navigation_test.rb +10 -0
  347. data/test/shoppy/Users/alybadawy/exp/shoppy/lib/template/Gemfile.lock +217 -0
  348. data/test/shoppy/Users/alybadawy/exp/shoppy/lib/template/README.rdoc +28 -0
  349. data/test/shoppy/Users/alybadawy/exp/shoppy/lib/template/config.ru +4 -0
  350. data/test/shoppy_test.rb +7 -0
  351. data/test/test_helper.rb +15 -0
  352. metadata +495 -0
@@ -0,0 +1,36 @@
1
+ module Shoppy::Concerns::Models::Promotional
2
+ extend ActiveSupport::Concern
3
+
4
+ # For every model that you want to make promotioanl,
5
+ # Add the following attributes to the model:
6
+ # float :reg_price, null: false
7
+ # float :promo_price, null: true
8
+ # date :promo_price_starts_on, null: true
9
+ # date :promo_price_ends_on, null: true
10
+
11
+
12
+
13
+ def promotional_price?
14
+ if self.promo_price && (self.promo_price > 0) && (self.promo_price_starts_on..self.promo_price_ends_on).cover?(Time.now) && (self.reg_price > self.promo_price)
15
+ return self.promo_price
16
+ else
17
+ return false
18
+ end
19
+ end
20
+
21
+ def price_info
22
+ p = {reg_price: self.reg_price, promo_price: self.promotional_price?}
23
+ return p
24
+ end
25
+
26
+ def price
27
+ self.promotional_price? || self.reg_price
28
+ end
29
+
30
+ def set_promotion!(price, begin_date, end_date)
31
+ self.promo_price = price
32
+ self.promo_price_starts_on = begin_date
33
+ self.promo_price_ends_on = end_date
34
+ self.save
35
+ end
36
+ end
@@ -0,0 +1,44 @@
1
+ module Shoppy::Concerns::Models::Taggable
2
+ extend ActiveSupport::Concern
3
+
4
+ def add_tags!(*args)
5
+ tags = args
6
+ tags.each do |tag|
7
+ if Tag.exists?(name: tag)
8
+ self.tags += [tag]
9
+ else
10
+ new_tag = Tag.create(name: tag)
11
+ self.tags += [new_tag]
12
+ end
13
+ end
14
+ self.save
15
+ end
16
+
17
+ def remove_tags!(*args)
18
+ tags = args
19
+ tags.each do |tag|
20
+ if self.tags.include?(Tag.find_by(name: tag))
21
+ self.tags -= [Tag.find_by(name: tag)]
22
+ end
23
+ end
24
+ self.save
25
+ end
26
+
27
+ module ClassMethods
28
+
29
+ def by_tag(tag)
30
+ tag.products
31
+ end
32
+
33
+ def by_tag_name(tagname)
34
+ tag = Tag.find_by(name: tagname)
35
+ if tag
36
+ self.by_tag(tag)
37
+ else
38
+ return nil
39
+ end
40
+ end
41
+
42
+ end
43
+
44
+ end
@@ -0,0 +1,10 @@
1
+ module Shoppy
2
+ class Customer < Account
3
+
4
+ ## Relations
5
+ has_many :customer_addresses, dependent: :destroy
6
+ has_many :cart_items, dependent: :destroy
7
+ has_many :orders, dependent: :nullify
8
+ has_many :reviews
9
+ end
10
+ end
@@ -0,0 +1,44 @@
1
+ module Shoppy
2
+ class CustomerAddress < ActiveRecord::Base
3
+ ## Relationships
4
+ belongs_to :customer
5
+
6
+ ## Filters
7
+ before_save :caps
8
+
9
+ ## Validators
10
+ validates :name, presence: true
11
+ validates :add_line1, presence: true
12
+ validates :city, presence: true
13
+ validates :state, presence: true
14
+ validates :country, presence: true
15
+
16
+ validates :name, length: { in: 2..50, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }, allow_blank: false
17
+ validates :add_line1, length: { in: 2..75, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }, allow_blank: false
18
+ validates :add_line2, length: { in: 2..75, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }, allow_blank: true
19
+ validates :city, length: { in: 2..25, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }, allow_blank: true
20
+ validates :state, length: { in: 2..25, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }, allow_blank: true
21
+ validates :country, length: { in: 2..25, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }, allow_blank: true
22
+ validates :zip, length: { in: 5..6, too_short: "must be at least 5 digits", too_long: "must be exactly 5 digits"}, allow_blank: true
23
+
24
+ validate :fail_same_name_for_customer
25
+
26
+
27
+ private
28
+ def fail_same_name_for_customer
29
+ if CustomerAddress.find_by(customer_id: self.customer_id, name: self.name.downcase.titleize)
30
+ errors.add(:name, "Customer has another addresses with the same name") unless self.name_was.downcase.titleize == self.name.downcase.titleize
31
+ end
32
+ end
33
+ def caps
34
+ self.name = self.name.downcase.titleize
35
+ self.add_line1 = self.add_line1.downcase.titleize
36
+ self.add_line2 = self.add_line2.downcase.titleize
37
+ self.city = self.city.downcase.titleize
38
+ self.state = self.state.upcase
39
+ self.country = self.country.upcase
40
+ end
41
+
42
+
43
+ end
44
+ end
@@ -0,0 +1,18 @@
1
+ module Shoppy
2
+ class Inventory < ActiveRecord::Base
3
+ ## Relationships
4
+ belongs_to :variant
5
+ belongs_to :stock_location
6
+
7
+ ## Validators
8
+ validates :quantity, presence: true
9
+ validates :quantity, numericality: { greater_than_or_equal_to: 0 }
10
+
11
+
12
+ def variant_details
13
+ "#{self.variant.name} - [Available: #{self.quantity}]"
14
+ end
15
+
16
+
17
+ end
18
+ end
@@ -0,0 +1,8 @@
1
+ module Shoppy
2
+ class Log < ActiveRecord::Base
3
+
4
+ def self.newEvent(area, event, by)
5
+ Log.create(area: area, event: event, by: by)
6
+ end
7
+ end
8
+ end
@@ -0,0 +1,35 @@
1
+ module Shoppy
2
+ class Manufacturer < ActiveRecord::Base
3
+ ## Relationships
4
+ has_many :products, dependent: :nullify
5
+
6
+ ## filters
7
+ before_save :caps
8
+
9
+
10
+ ## Validators
11
+ validates :name, presence: true
12
+ validates :name, uniqueness: true
13
+ validates :name, length: { in: 2..100, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }
14
+ validates :email, length: { in: 2..100, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }, allow_blank: true
15
+ validates :phone, length: { in: 2..20, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }, allow_blank: true
16
+ validates :website, length: { in: 2..100, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }, allow_blank: true
17
+ validates :add_line1, length: { in: 2..75, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }, allow_blank: true
18
+ validates :add_line2, length: { in: 2..75, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }, allow_blank: true
19
+ validates :city, length: { in: 2..25, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }, allow_blank: true
20
+ validates :state, length: { in: 2..25, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }, allow_blank: true
21
+ validates :country, length: { in: 2..25, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }, allow_blank: true
22
+ validates :zip, length: { is: 5, too_short: "must be exactly 5 digits", too_long: "must be exactly 5 digits"}, allow_blank: true
23
+
24
+ private
25
+ def caps
26
+ self.name = self.name.downcase.titleize
27
+ self.add_line1 = self.add_line1.downcase.titleize
28
+ self.add_line2 = self.add_line2.downcase.titleize
29
+ self.city = self.city.downcase.titleize
30
+ self.state = self.state.upcase
31
+ self.country = self.country.upcase
32
+ end
33
+
34
+ end
35
+ end
@@ -0,0 +1,57 @@
1
+ module Shoppy
2
+ class OptionsGroup < ActiveRecord::Base
3
+ ## Relationships
4
+ has_many :options_items, dependent: :destroy
5
+ has_and_belongs_to_many :products
6
+
7
+
8
+ ## Validators
9
+ validates :name, presence: true
10
+ validates :name, uniqueness: true
11
+ validates :display, presence: true
12
+ validates :name, length: { in: 2..50, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }
13
+
14
+
15
+ ## Filters
16
+ before_destroy :remove_from_variants
17
+ before_save :update_options_items
18
+ before_save :caps
19
+
20
+
21
+ ## temp. Attrinbutes
22
+ attr_accessor :items_string
23
+
24
+
25
+ def optionsItems
26
+ return OptionsHelper::items_to_string(self)
27
+ end
28
+
29
+ def optionsItems=(options_items)
30
+ @items_string = options_items
31
+ end
32
+
33
+
34
+ private
35
+ def remove_from_variants
36
+ self.products.each do |p|
37
+ p.variants.each do |v|
38
+ v.delete_hash(self.name)
39
+ v.save
40
+ end
41
+ end
42
+ end
43
+ def update_options_items
44
+ if optionsItems != ""
45
+ if self.new_record? == false
46
+ OptionsHelper::update_options_items(self)
47
+ end
48
+ else
49
+ errors.add(:optionsItems, "is blank!")
50
+ end
51
+ end
52
+ def caps
53
+ self.name = self.name.downcase.titleize
54
+ end
55
+
56
+ end
57
+ end
@@ -0,0 +1,18 @@
1
+ module Shoppy
2
+ class OptionsItem < ActiveRecord::Base
3
+ ## Relationships
4
+ belongs_to :options_group
5
+
6
+ ## Filters
7
+ before_save :caps
8
+ ## Validators
9
+ validates :name, presence: true
10
+ # validates :name, uniqueness: true
11
+ validates :name, length: { in: 2..50, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }
12
+
13
+ def caps
14
+ self.name = self.name.downcase.titleize
15
+ end
16
+
17
+ end
18
+ end
@@ -0,0 +1,15 @@
1
+ module Shoppy
2
+ class Order < ActiveRecord::Base
3
+ ## Relationships
4
+ has_many :order_lines, dependent: :destroy
5
+ has_many :shipments, dependent: :destroy
6
+ belongs_to :customer
7
+ belongs_to :payment_method
8
+
9
+
10
+ ## Validators
11
+ validates :total_price, presence: true
12
+ validates :total_price, :numericality => { :greater_than_or_equal_to => 0 }
13
+ validates :status, inclusion: {:in => ["Pending", "Approved", "Shipped", "Cancelled", "Delivered"], message: "Must be 'Pending', 'Processing', 'Shipped', 'Cancelled' or 'Delivered'"}
14
+ end
15
+ end
@@ -0,0 +1,16 @@
1
+ module Shoppy
2
+ class OrderLine < ActiveRecord::Base
3
+ ## Relationships
4
+ belongs_to :order
5
+ belongs_to :variant
6
+ belongs_to :shipment
7
+
8
+ ## Validators
9
+ validates :price_per_one, presence: true
10
+ validates :price_per_one, :numericality => { :greater_than_or_equal_to => 0 }
11
+ validates :quantity, presence: true
12
+ validates :quantity, :numericality => { :greater_than_or_equal_to => 0 }
13
+
14
+
15
+ end
16
+ end
@@ -0,0 +1,19 @@
1
+ module Shoppy
2
+ class PaymentMethod < ActiveRecord::Base
3
+ ## Relationships
4
+ has_many :orders, dependent: :nullify
5
+
6
+ ## Filters
7
+ before_save :caps
8
+
9
+ ## Validators
10
+ validates :name, presence: true
11
+ validates :name, length: { in: 2..50, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }
12
+ validates :name, uniqueness: true
13
+
14
+ def caps
15
+ self.name = self.name.downcase.titleize
16
+ end
17
+
18
+ end
19
+ end
@@ -0,0 +1,43 @@
1
+ module Shoppy
2
+ class Product < ActiveRecord::Base
3
+ ## Relationships
4
+ belongs_to :brand
5
+ belongs_to :manufacturer
6
+ belongs_to :category
7
+ has_many :variants, dependent: :destroy
8
+ has_many :reviews
9
+ has_and_belongs_to_many :options_groups
10
+
11
+ ## Concerns
12
+ include Shoppy::Concerns::Models::Hashable
13
+ # include Promotional
14
+ # include Taggable
15
+
16
+ ## Validators
17
+ validates :name, presence: true
18
+ validates :name, length: { in: 2..100, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }
19
+ validates :name, uniqueness: true
20
+
21
+
22
+ before_save :fail_no_belongs
23
+ before_save :caps
24
+
25
+
26
+ private
27
+ def fail_no_belongs
28
+ if self.category_id == nil
29
+ errors.add(:category, "is blank!")
30
+ end
31
+ if self.brand_id == nil
32
+ errors.add(:brand, "is blank!")
33
+ end
34
+ if self.manufacturer_id == nil
35
+ errors.add(:manufacturer, "is blank!")
36
+ end
37
+ end
38
+ def caps
39
+ self.name = self.name.downcase.titleize
40
+ end
41
+
42
+ end
43
+ end
@@ -0,0 +1,12 @@
1
+ module Shoppy
2
+ class Review < ActiveRecord::Base
3
+ ## Relationships
4
+ belongs_to :customer
5
+ belongs_to :product
6
+
7
+ ## Validators
8
+ validates_numericality_of :rate, only_integer: true, message: "can only be an integer"
9
+ validates_inclusion_of :rate, in: 0..5, message: "can only be between 0 and 5."
10
+
11
+ end
12
+ end
@@ -0,0 +1,11 @@
1
+ module Shoppy
2
+ class Setting < ActiveRecord::Base
3
+
4
+ before_create :only_one
5
+
6
+ private
7
+ def only_one
8
+ false if self.class.count >= 1
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,11 @@
1
+ module Shoppy
2
+ class Shipment < ActiveRecord::Base
3
+ ## Relationships
4
+ has_many :order_lines, dependent: :nullify
5
+ belongs_to :order
6
+ belongs_to :stock_location
7
+
8
+ ## Validation
9
+ validates :status, inclusion: {:in => ["Processing", "Shipped", "Cancelled", "Delivered"], message: "Must be 'Processing', 'Shipped', 'Cancelled' or 'Delivered'"}
10
+ end
11
+ end
@@ -0,0 +1,47 @@
1
+ module Shoppy
2
+ class StockLocation < ActiveRecord::Base
3
+ ## Relationships
4
+ has_many :inventories
5
+ has_many :variants, :through => :inventories
6
+ has_many :shipments
7
+
8
+ ## Filters
9
+ before_destroy :check_inventory
10
+ before_save :caps
11
+
12
+ ## Validators
13
+ validates :name, presence: true
14
+ validates :name, uniqueness: true
15
+ validates :name, length: { in: 2..100, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }
16
+ validates :email, length: { in: 2..100, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }, allow_blank: true
17
+ validates :phone, length: { in: 2..20, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }, allow_blank: true
18
+ validates :add_line1, length: { in: 2..75, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }, allow_blank: true
19
+ validates :add_line2, length: { in: 2..75, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }, allow_blank: true
20
+ validates :city, length: { in: 2..25, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }, allow_blank: true
21
+ validates :state, length: { in: 2..25, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }, allow_blank: true
22
+ validates :country, length: { in: 2..25, too_short: "must have at least %{count} letters", too_long: "must have at most %{count} letters" }, allow_blank: true
23
+ validates :zip, length: { is: 5, too_short: "must be exactly 5 digits", too_long: "must be exactly 5 digits"}, allow_blank: true
24
+
25
+
26
+
27
+ def check_inventory
28
+ i = Inventory.where(stock_location_id: self.id).count
29
+ if i > 0
30
+ return false
31
+ else
32
+ return true
33
+ end
34
+ end
35
+
36
+ private
37
+ def caps
38
+ self.name = self.name.downcase.titleize
39
+ self.add_line1 = self.add_line1.downcase.titleize
40
+ self.add_line2 = self.add_line2.downcase.titleize
41
+ self.city = self.city.downcase.titleize
42
+ self.state = self.state.upcase
43
+ self.country = self.country.upcase
44
+ end
45
+
46
+ end
47
+ end