forgeos_commerce 1.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 (433) hide show
  1. data/COPYING +339 -0
  2. data/COPYING.LESSER +165 -0
  3. data/Gemfile +2 -0
  4. data/LICENSE +2 -0
  5. data/MIT-LICENSE +20 -0
  6. data/README.textile +27 -0
  7. data/app/assets/images/forgeos/admin/favicon.gif +0 -0
  8. data/app/assets/images/forgeos/jstree/themes/association_product/bubble-quantity-products.png +0 -0
  9. data/app/assets/images/forgeos/jstree/themes/association_product/check-checked.png +0 -0
  10. data/app/assets/images/forgeos/jstree/themes/association_product/check-unchecked.png +0 -0
  11. data/app/assets/images/forgeos/jstree/themes/association_product/context.gif +0 -0
  12. data/app/assets/images/forgeos/jstree/themes/association_product/create.png +0 -0
  13. data/app/assets/images/forgeos/jstree/themes/association_product/dark-blue-minus.png +0 -0
  14. data/app/assets/images/forgeos/jstree/themes/association_product/dark-blue-plus.png +0 -0
  15. data/app/assets/images/forgeos/jstree/themes/association_product/dot.gif +0 -0
  16. data/app/assets/images/forgeos/jstree/themes/association_product/f.png +0 -0
  17. data/app/assets/images/forgeos/jstree/themes/association_product/fminus.gif +0 -0
  18. data/app/assets/images/forgeos/jstree/themes/association_product/fminus_rtl.gif +0 -0
  19. data/app/assets/images/forgeos/jstree/themes/association_product/folder.png +0 -0
  20. data/app/assets/images/forgeos/jstree/themes/association_product/fplus.gif +0 -0
  21. data/app/assets/images/forgeos/jstree/themes/association_product/fplus_rtl.gif +0 -0
  22. data/app/assets/images/forgeos/jstree/themes/association_product/lastli.gif +0 -0
  23. data/app/assets/images/forgeos/jstree/themes/association_product/lastli_rtl.gif +0 -0
  24. data/app/assets/images/forgeos/jstree/themes/association_product/li.gif +0 -0
  25. data/app/assets/images/forgeos/jstree/themes/association_product/remove.png +0 -0
  26. data/app/assets/images/forgeos/jstree/themes/association_product/rename.png +0 -0
  27. data/app/assets/images/forgeos/jstree/themes/association_product/throbber.gif +0 -0
  28. data/app/assets/images/forgeos/jstree/themes/product-types/bubble-quantity-products.png +0 -0
  29. data/app/assets/images/forgeos/jstree/themes/product-types/check-checked.png +0 -0
  30. data/app/assets/images/forgeos/jstree/themes/product-types/check-unchecked.png +0 -0
  31. data/app/assets/images/forgeos/jstree/themes/product-types/context.gif +0 -0
  32. data/app/assets/images/forgeos/jstree/themes/product-types/create.png +0 -0
  33. data/app/assets/images/forgeos/jstree/themes/product-types/dark-blue-minus.png +0 -0
  34. data/app/assets/images/forgeos/jstree/themes/product-types/dark-blue-plus.png +0 -0
  35. data/app/assets/images/forgeos/jstree/themes/product-types/dot.gif +0 -0
  36. data/app/assets/images/forgeos/jstree/themes/product-types/drag-drop.png +0 -0
  37. data/app/assets/images/forgeos/jstree/themes/product-types/f.png +0 -0
  38. data/app/assets/images/forgeos/jstree/themes/product-types/fminus.gif +0 -0
  39. data/app/assets/images/forgeos/jstree/themes/product-types/fminus_rtl.gif +0 -0
  40. data/app/assets/images/forgeos/jstree/themes/product-types/folder.png +0 -0
  41. data/app/assets/images/forgeos/jstree/themes/product-types/fplus.gif +0 -0
  42. data/app/assets/images/forgeos/jstree/themes/product-types/fplus_rtl.gif +0 -0
  43. data/app/assets/images/forgeos/jstree/themes/product-types/grey-drag-drop.png +0 -0
  44. data/app/assets/images/forgeos/jstree/themes/product-types/lastli.gif +0 -0
  45. data/app/assets/images/forgeos/jstree/themes/product-types/lastli_rtl.gif +0 -0
  46. data/app/assets/images/forgeos/jstree/themes/product-types/li.gif +0 -0
  47. data/app/assets/images/forgeos/jstree/themes/product-types/remove.png +0 -0
  48. data/app/assets/images/forgeos/jstree/themes/product-types/rename.png +0 -0
  49. data/app/assets/images/forgeos/jstree/themes/product-types/throbber.gif +0 -0
  50. data/app/assets/images/forgeos/jstree/themes/product_category/brown-minus.png +0 -0
  51. data/app/assets/images/forgeos/jstree/themes/product_category/brown-plus.png +0 -0
  52. data/app/assets/images/forgeos/jstree/themes/product_category/bubble-quantity-products.png +0 -0
  53. data/app/assets/images/forgeos/jstree/themes/product_category/context.gif +0 -0
  54. data/app/assets/images/forgeos/jstree/themes/product_category/create.png +0 -0
  55. data/app/assets/images/forgeos/jstree/themes/product_category/dot.gif +0 -0
  56. data/app/assets/images/forgeos/jstree/themes/product_category/f.png +0 -0
  57. data/app/assets/images/forgeos/jstree/themes/product_category/fminus.gif +0 -0
  58. data/app/assets/images/forgeos/jstree/themes/product_category/fminus_rtl.gif +0 -0
  59. data/app/assets/images/forgeos/jstree/themes/product_category/fplus.gif +0 -0
  60. data/app/assets/images/forgeos/jstree/themes/product_category/fplus_rtl.gif +0 -0
  61. data/app/assets/images/forgeos/jstree/themes/product_category/lastli.gif +0 -0
  62. data/app/assets/images/forgeos/jstree/themes/product_category/lastli_rtl.gif +0 -0
  63. data/app/assets/images/forgeos/jstree/themes/product_category/li.gif +0 -0
  64. data/app/assets/images/forgeos/jstree/themes/product_category/remove.png +0 -0
  65. data/app/assets/images/forgeos/jstree/themes/product_category/rename.png +0 -0
  66. data/app/assets/images/forgeos/jstree/themes/product_category/throbber.gif +0 -0
  67. data/app/assets/images/forgeos/jstree/themes/zone-tree/bubble-quantity-products.png +0 -0
  68. data/app/assets/images/forgeos/jstree/themes/zone-tree/check-checked.png +0 -0
  69. data/app/assets/images/forgeos/jstree/themes/zone-tree/check-unchecked.png +0 -0
  70. data/app/assets/images/forgeos/jstree/themes/zone-tree/context.gif +0 -0
  71. data/app/assets/images/forgeos/jstree/themes/zone-tree/create.png +0 -0
  72. data/app/assets/images/forgeos/jstree/themes/zone-tree/dark-blue-minus.png +0 -0
  73. data/app/assets/images/forgeos/jstree/themes/zone-tree/dark-blue-plus.png +0 -0
  74. data/app/assets/images/forgeos/jstree/themes/zone-tree/dot.gif +0 -0
  75. data/app/assets/images/forgeos/jstree/themes/zone-tree/f.png +0 -0
  76. data/app/assets/images/forgeos/jstree/themes/zone-tree/fminus.gif +0 -0
  77. data/app/assets/images/forgeos/jstree/themes/zone-tree/fminus_rtl.gif +0 -0
  78. data/app/assets/images/forgeos/jstree/themes/zone-tree/folder.png +0 -0
  79. data/app/assets/images/forgeos/jstree/themes/zone-tree/fplus.gif +0 -0
  80. data/app/assets/images/forgeos/jstree/themes/zone-tree/fplus_rtl.gif +0 -0
  81. data/app/assets/images/forgeos/jstree/themes/zone-tree/lastli.gif +0 -0
  82. data/app/assets/images/forgeos/jstree/themes/zone-tree/lastli_rtl.gif +0 -0
  83. data/app/assets/images/forgeos/jstree/themes/zone-tree/li.gif +0 -0
  84. data/app/assets/images/forgeos/jstree/themes/zone-tree/remove.png +0 -0
  85. data/app/assets/images/forgeos/jstree/themes/zone-tree/rename.png +0 -0
  86. data/app/assets/images/forgeos/jstree/themes/zone-tree/throbber.gif +0 -0
  87. data/app/assets/javascripts/forgeos/admin/functions.js +3 -0
  88. data/app/assets/javascripts/forgeos/admin/functions/forgeos_commerce/all.js +1 -0
  89. data/app/assets/javascripts/forgeos/admin/functions/forgeos_commerce/attributes.js +18 -0
  90. data/app/assets/javascripts/forgeos/admin/functions/forgeos_commerce/cross-sellings.js +18 -0
  91. data/app/assets/javascripts/forgeos/admin/functions/forgeos_commerce/orders.js +88 -0
  92. data/app/assets/javascripts/forgeos/admin/functions/forgeos_commerce/products.js +46 -0
  93. data/app/assets/javascripts/forgeos/admin/functions/forgeos_commerce/rules.js +98 -0
  94. data/app/assets/javascripts/forgeos/admin/functions/forgeos_commerce/transporters.js +60 -0
  95. data/app/assets/javascripts/forgeos/admin/functions/forgeos_commerce/trees.js +35 -0
  96. data/app/assets/javascripts/forgeos/admin/functions/forgeos_commerce/uploads.js +10 -0
  97. data/app/assets/javascripts/forgeos/admin/inits.js +3 -0
  98. data/app/assets/javascripts/forgeos/admin/inits/forgeos_commerce/all.js +1 -0
  99. data/app/assets/javascripts/forgeos/admin/inits/forgeos_commerce/clicks.js +25 -0
  100. data/app/assets/javascripts/forgeos/admin/inits/forgeos_commerce/cross-sellings.js +69 -0
  101. data/app/assets/javascripts/forgeos/admin/inits/forgeos_commerce/customer.js +64 -0
  102. data/app/assets/javascripts/forgeos/admin/inits/forgeos_commerce/orders.js +83 -0
  103. data/app/assets/javascripts/forgeos/admin/inits/forgeos_commerce/overlays.js +45 -0
  104. data/app/assets/javascripts/forgeos/admin/inits/forgeos_commerce/products.js +103 -0
  105. data/app/assets/javascripts/forgeos/admin/inits/forgeos_commerce/settings.js +15 -0
  106. data/app/assets/javascripts/forgeos/admin/inits/forgeos_commerce/special-offers.js +23 -0
  107. data/app/assets/javascripts/forgeos/admin/inits/forgeos_commerce/trees.js +71 -0
  108. data/app/assets/stylesheets/forgeos/admin/base.css.sass +3 -0
  109. data/app/assets/stylesheets/forgeos/admin/forgeos_commerce/_all.css.sass +9 -0
  110. data/app/assets/stylesheets/forgeos/admin/forgeos_commerce/_attributes.css.sass +59 -0
  111. data/app/assets/stylesheets/forgeos/admin/forgeos_commerce/_customer.css.sass +84 -0
  112. data/app/assets/stylesheets/forgeos/admin/forgeos_commerce/_delivery.css.sass +81 -0
  113. data/app/assets/stylesheets/forgeos/admin/forgeos_commerce/_dropdowns.css.sass +171 -0
  114. data/app/assets/stylesheets/forgeos/admin/forgeos_commerce/_order.css.sass +208 -0
  115. data/app/assets/stylesheets/forgeos/admin/forgeos_commerce/_payment.css.sass +34 -0
  116. data/app/assets/stylesheets/forgeos/admin/forgeos_commerce/_products.css.sass +341 -0
  117. data/app/assets/stylesheets/forgeos/admin/forgeos_commerce/_special_offers.css.sass +198 -0
  118. data/app/assets/stylesheets/forgeos/admin/forgeos_commerce/_transporters.css.sass +5 -0
  119. data/app/assets/stylesheets/forgeos/jstree/themes/association_product/style.css.sass +50 -0
  120. data/app/assets/stylesheets/forgeos/jstree/themes/product-types/style.css.sass +129 -0
  121. data/app/assets/stylesheets/forgeos/jstree/themes/product_category/style.css.sass +109 -0
  122. data/app/assets/stylesheets/forgeos/jstree/themes/zone-tree/style.css.sass +103 -0
  123. data/app/controllers/addresses_controller.rb +51 -0
  124. data/app/controllers/admin/attributes_controller.rb +161 -0
  125. data/app/controllers/admin/base_controller.rb +5 -0
  126. data/app/controllers/admin/brands_controller.rb +119 -0
  127. data/app/controllers/admin/forms_controller.rb +66 -0
  128. data/app/controllers/admin/geo_zones_controller.rb +74 -0
  129. data/app/controllers/admin/import_controller.rb +50 -0
  130. data/app/controllers/admin/orders_controller.rb +248 -0
  131. data/app/controllers/admin/product_types_controller.rb +122 -0
  132. data/app/controllers/admin/products_controller.rb +204 -0
  133. data/app/controllers/admin/special_offers_controller.rb +236 -0
  134. data/app/controllers/admin/statistics_controller.rb +64 -0
  135. data/app/controllers/admin/transporter_rules_controller.rb +307 -0
  136. data/app/controllers/admin/users_controller.rb +100 -0
  137. data/app/controllers/admin/vouchers_controller.rb +207 -0
  138. data/app/controllers/application_controller.rb +75 -0
  139. data/app/controllers/order_controller.rb +229 -0
  140. data/app/helpers/admin/payment_fields_helper.rb +31 -0
  141. data/app/helpers/application_helper.rb +7 -0
  142. data/app/helpers/cart_helper.rb +40 -0
  143. data/app/helpers/category_helper.rb +36 -0
  144. data/app/helpers/product_helper.rb +118 -0
  145. data/app/helpers/routes_helper.rb +60 -0
  146. data/app/helpers/wishlist_helper.rb +142 -0
  147. data/app/models/address_delivery.rb +2 -0
  148. data/app/models/address_invoice.rb +2 -0
  149. data/app/models/attribute.rb +38 -0
  150. data/app/models/attribute_category.rb +3 -0
  151. data/app/models/attribute_value.rb +10 -0
  152. data/app/models/brand.rb +22 -0
  153. data/app/models/brand_category.rb +3 -0
  154. data/app/models/cart.rb +190 -0
  155. data/app/models/cart_item.rb +21 -0
  156. data/app/models/checkbox_attribute.rb +2 -0
  157. data/app/models/country.rb +4 -0
  158. data/app/models/cross_sellings_product.rb +4 -0
  159. data/app/models/currencies_exchanges_rate.rb +2 -0
  160. data/app/models/currency.rb +13 -0
  161. data/app/models/date_attribute.rb +2 -0
  162. data/app/models/dynamic_attribute.rb +6 -0
  163. data/app/models/dynamic_attribute_value.rb +5 -0
  164. data/app/models/form.rb +7 -0
  165. data/app/models/form_attribute.rb +3 -0
  166. data/app/models/geo_zone.rb +6 -0
  167. data/app/models/longtext_attribute.rb +2 -0
  168. data/app/models/number_attribute.rb +2 -0
  169. data/app/models/order.rb +483 -0
  170. data/app/models/order_detail.rb +129 -0
  171. data/app/models/order_shipping.rb +25 -0
  172. data/app/models/pack.rb +9 -0
  173. data/app/models/picklist_attribute.rb +2 -0
  174. data/app/models/product.rb +294 -0
  175. data/app/models/product_attribute.rb +4 -0
  176. data/app/models/product_category.rb +9 -0
  177. data/app/models/product_link.rb +9 -0
  178. data/app/models/product_price_variation.rb +3 -0
  179. data/app/models/product_sold_counter.rb +2 -0
  180. data/app/models/product_sweeper.rb +30 -0
  181. data/app/models/product_type.rb +27 -0
  182. data/app/models/product_type_category.rb +3 -0
  183. data/app/models/product_viewed_counter.rb +2 -0
  184. data/app/models/products_wishlist.rb +25 -0
  185. data/app/models/radio_attribute.rb +2 -0
  186. data/app/models/radiobutton_attribute.rb +2 -0
  187. data/app/models/setting.rb +46 -0
  188. data/app/models/size.rb +5 -0
  189. data/app/models/special_offer_category.rb +3 -0
  190. data/app/models/special_offer_rule.rb +21 -0
  191. data/app/models/text_attribute.rb +2 -0
  192. data/app/models/text_field_attribute.rb +2 -0
  193. data/app/models/transporter_category.rb +3 -0
  194. data/app/models/transporter_rule.rb +3 -0
  195. data/app/models/url_attribute.rb +2 -0
  196. data/app/models/user.rb +45 -0
  197. data/app/models/user_address.rb +6 -0
  198. data/app/models/voucher_category.rb +3 -0
  199. data/app/models/voucher_rule.rb +3 -0
  200. data/app/models/wishlist.rb +134 -0
  201. data/app/views/admin/addresses/_form.html.haml +42 -0
  202. data/app/views/admin/attributes/_categories.html.haml +7 -0
  203. data/app/views/admin/attributes/_choice.html.haml +24 -0
  204. data/app/views/admin/attributes/_date.html.haml +5 -0
  205. data/app/views/admin/attributes/_form.html.haml +36 -0
  206. data/app/views/admin/attributes/_longtext.html.haml +5 -0
  207. data/app/views/admin/attributes/_number.html.haml +5 -0
  208. data/app/views/admin/attributes/_tabs.html.haml +6 -0
  209. data/app/views/admin/attributes/_text.html.haml +5 -0
  210. data/app/views/admin/attributes/_url.html.haml +5 -0
  211. data/app/views/admin/attributes/destroy.js.erb +1 -0
  212. data/app/views/admin/attributes/edit.html.haml +2 -0
  213. data/app/views/admin/attributes/index.html.haml +33 -0
  214. data/app/views/admin/attributes/index.json.erb +24 -0
  215. data/app/views/admin/attributes/new.html.haml +2 -0
  216. data/app/views/admin/attributes/show.html.haml +51 -0
  217. data/app/views/admin/brands/_form.html.haml +29 -0
  218. data/app/views/admin/brands/_tabs.html.haml +6 -0
  219. data/app/views/admin/brands/destroy.js.erb +1 -0
  220. data/app/views/admin/brands/edit.html.haml +2 -0
  221. data/app/views/admin/brands/index.html.haml +15 -0
  222. data/app/views/admin/brands/index.json.erb +23 -0
  223. data/app/views/admin/brands/new.html.haml +2 -0
  224. data/app/views/admin/dashboard/index.html.haml +230 -0
  225. data/app/views/admin/forms/_form.html.haml +38 -0
  226. data/app/views/admin/forms/_tabs.html.haml +6 -0
  227. data/app/views/admin/forms/destroy.js.erb +1 -0
  228. data/app/views/admin/forms/edit.html.haml +2 -0
  229. data/app/views/admin/forms/index.html.haml +11 -0
  230. data/app/views/admin/forms/index.json.erb +20 -0
  231. data/app/views/admin/forms/new.html.haml +2 -0
  232. data/app/views/admin/geo_zones/_form.html.haml +20 -0
  233. data/app/views/admin/geo_zones/_list.html.haml +9 -0
  234. data/app/views/admin/geo_zones/edit.html.haml +3 -0
  235. data/app/views/admin/geo_zones/index.html.haml +49 -0
  236. data/app/views/admin/geo_zones/new.html.haml +3 -0
  237. data/app/views/admin/geo_zones/show.html.haml +4 -0
  238. data/app/views/admin/import/create_product.html.haml +2 -0
  239. data/app/views/admin/menus/_types_popups.html.haml +22 -0
  240. data/app/views/admin/orders/_address_form.html.haml +29 -0
  241. data/app/views/admin/orders/_form.html.haml +198 -0
  242. data/app/views/admin/orders/_list.html.haml +29 -0
  243. data/app/views/admin/orders/_products_popup.html.haml +15 -0
  244. data/app/views/admin/orders/create.html.haml +1 -0
  245. data/app/views/admin/orders/destroy.js.erb +1 -0
  246. data/app/views/admin/orders/edit.html.haml +1 -0
  247. data/app/views/admin/orders/index.html.haml +24 -0
  248. data/app/views/admin/orders/index.json.erb +48 -0
  249. data/app/views/admin/orders/show.html.haml +130 -0
  250. data/app/views/admin/product_types/_form.html.haml +46 -0
  251. data/app/views/admin/product_types/_list.html.haml +6 -0
  252. data/app/views/admin/product_types/_options_categories.html.haml +19 -0
  253. data/app/views/admin/product_types/_tabs.html.haml +6 -0
  254. data/app/views/admin/product_types/destroy.js.erb +1 -0
  255. data/app/views/admin/product_types/edit.html.haml +3 -0
  256. data/app/views/admin/product_types/index.html.haml +14 -0
  257. data/app/views/admin/product_types/index.json.erb +24 -0
  258. data/app/views/admin/product_types/new.html.haml +3 -0
  259. data/app/views/admin/product_types/show.html.haml +23 -0
  260. data/app/views/admin/products/_attributes.html.haml +37 -0
  261. data/app/views/admin/products/_cross_popup.html.haml +56 -0
  262. data/app/views/admin/products/_cross_sell_tr.html.haml +13 -0
  263. data/app/views/admin/products/_cross_sells.html.haml +1 -0
  264. data/app/views/admin/products/_form.html.haml +26 -0
  265. data/app/views/admin/products/_general.html.haml +153 -0
  266. data/app/views/admin/products/_list.html.haml +18 -0
  267. data/app/views/admin/products/_prices.html.haml +17 -0
  268. data/app/views/admin/products/_products_popup.html.haml +41 -0
  269. data/app/views/admin/products/_seo.html.haml +75 -0
  270. data/app/views/admin/products/_shippings.html.haml +0 -0
  271. data/app/views/admin/products/_sizes.html.haml +23 -0
  272. data/app/views/admin/products/_tabs.html.haml +2 -0
  273. data/app/views/admin/products/activate.js.erb +1 -0
  274. data/app/views/admin/products/destroy.js.erb +1 -0
  275. data/app/views/admin/products/edit.html.haml +1 -0
  276. data/app/views/admin/products/index.html.haml +20 -0
  277. data/app/views/admin/products/index.json.erb +65 -0
  278. data/app/views/admin/products/new.html.haml +1 -0
  279. data/app/views/admin/products/show.html.haml +158 -0
  280. data/app/views/admin/settings/_colissimo.html.haml +7 -0
  281. data/app/views/admin/settings/_godfather.html.haml +11 -0
  282. data/app/views/admin/settings/_google_shopping.html.haml +5 -0
  283. data/app/views/admin/settings/_payment.html.haml +63 -0
  284. data/app/views/admin/settings/_tabs.html.haml +5 -0
  285. data/app/views/admin/settings/edit.html.haml +33 -0
  286. data/app/views/admin/special_offers/_form.html.haml +88 -0
  287. data/app/views/admin/special_offers/_patterns.html.haml +151 -0
  288. data/app/views/admin/special_offers/_tabs.html.haml +5 -0
  289. data/app/views/admin/special_offers/_top_links.html.haml +6 -0
  290. data/app/views/admin/special_offers/activate.js.erb +1 -0
  291. data/app/views/admin/special_offers/destroy.js.erb +1 -0
  292. data/app/views/admin/special_offers/edit.html.haml +4 -0
  293. data/app/views/admin/special_offers/index.html.haml +15 -0
  294. data/app/views/admin/special_offers/index.json.erb +28 -0
  295. data/app/views/admin/special_offers/new.html.haml +2 -0
  296. data/app/views/admin/special_offers/show.html.haml +28 -0
  297. data/app/views/admin/special_offers/special_offer.html.haml +166 -0
  298. data/app/views/admin/statistics/index.html.haml +158 -0
  299. data/app/views/admin/transporter_rules/_delivery_rules.html.haml +83 -0
  300. data/app/views/admin/transporter_rules/_form.html.haml +90 -0
  301. data/app/views/admin/transporter_rules/_left_sidebar.html.haml +9 -0
  302. data/app/views/admin/transporter_rules/_sidebar.html.haml +10 -0
  303. data/app/views/admin/transporter_rules/_tabs.html.haml +8 -0
  304. data/app/views/admin/transporter_rules/activate.js.erb +1 -0
  305. data/app/views/admin/transporter_rules/destroy.js.erb +1 -0
  306. data/app/views/admin/transporter_rules/edit.html.haml +1 -0
  307. data/app/views/admin/transporter_rules/index.html.haml +13 -0
  308. data/app/views/admin/transporter_rules/index.json.erb +30 -0
  309. data/app/views/admin/transporter_rules/new.html.haml +1 -0
  310. data/app/views/admin/transporter_rules/show.html.haml +30 -0
  311. data/app/views/admin/users/_fields_for_addresses_deliveries.html.haml +38 -0
  312. data/app/views/admin/users/_fields_for_addresses_invoices.html.haml +34 -0
  313. data/app/views/admin/users/_form.html.haml +88 -0
  314. data/app/views/admin/users/edit.json.erb +35 -0
  315. data/app/views/admin/users/index.html.haml +12 -0
  316. data/app/views/admin/users/index.json.erb +32 -0
  317. data/app/views/admin/users/index2.html.haml +33 -0
  318. data/app/views/admin/users/show.html.haml +72 -0
  319. data/app/views/admin/vouchers/_form.html.haml +92 -0
  320. data/app/views/admin/vouchers/_tabs.html.haml +3 -0
  321. data/app/views/admin/vouchers/activate.js.erb +1 -0
  322. data/app/views/admin/vouchers/destroy.js.erb +1 -0
  323. data/app/views/admin/vouchers/index.html.haml +15 -0
  324. data/app/views/admin/vouchers/index.json.erb +28 -0
  325. data/app/views/admin/vouchers/new.html.haml +2 -0
  326. data/config/locales/activerecord/en.yml +6 -0
  327. data/config/locales/activerecord/fr.yml +18 -0
  328. data/config/locales/admin/address/en.yml +3 -0
  329. data/config/locales/admin/address/fr.yml +3 -0
  330. data/config/locales/admin/attribute/en.yml +76 -0
  331. data/config/locales/admin/attribute/fr.yml +75 -0
  332. data/config/locales/admin/brands/en.yml +24 -0
  333. data/config/locales/admin/brands/fr.yml +27 -0
  334. data/config/locales/admin/dashboard/en.yml +6 -0
  335. data/config/locales/admin/dashboard/fr.yml +6 -0
  336. data/config/locales/admin/order/en.yml +54 -0
  337. data/config/locales/admin/order/fr.yml +54 -0
  338. data/config/locales/admin/product/en.yml +105 -0
  339. data/config/locales/admin/product/fr.yml +106 -0
  340. data/config/locales/admin/settings/en.yml +90 -0
  341. data/config/locales/admin/settings/fr.yml +87 -0
  342. data/config/locales/admin/special_offer/en.yml +59 -0
  343. data/config/locales/admin/special_offer/fr.yml +60 -0
  344. data/config/locales/admin/transporter/en.yml +36 -0
  345. data/config/locales/admin/transporter/fr.yml +36 -0
  346. data/config/locales/admin/voucher/en.yml +3 -0
  347. data/config/locales/admin/voucher/fr.yml +3 -0
  348. data/config/locales/admin/wishlist/en.yml +89 -0
  349. data/config/locales/admin/wishlist/fr.yml +89 -0
  350. data/config/locales/common/en.yml +424 -0
  351. data/config/locales/common/fr.yml +422 -0
  352. data/config/routes.rb +109 -0
  353. data/config/search.example.yml +8 -0
  354. data/db/fixtures/currencies.yml +10 -0
  355. data/db/fixtures/currencies_exchanges_rates.yml +9 -0
  356. data/db/fixtures/page_translations.yml +11 -0
  357. data/db/fixtures/pages.yml +5 -0
  358. data/db/fixtures/people.yml +11 -0
  359. data/db/fixtures/product_type_translations.yml +11 -0
  360. data/db/fixtures/product_types.yml +2 -0
  361. data/db/migrate/20091009134433_create_attribute_values.rb +15 -0
  362. data/db/migrate/20091009134440_create_attribute_values_products.rb +14 -0
  363. data/db/migrate/20091009134448_create_attributes.rb +17 -0
  364. data/db/migrate/20091009134455_create_attributes_product_types.rb +14 -0
  365. data/db/migrate/20091009134525_create_carts.rb +15 -0
  366. data/db/migrate/20091009134532_create_cart_items.rb +14 -0
  367. data/db/migrate/20091009134609_create_cross_sellings_products.rb +11 -0
  368. data/db/migrate/20091009134616_create_currencies.rb +15 -0
  369. data/db/migrate/20091009134624_create_currencies_exchanges_rates.rb +13 -0
  370. data/db/migrate/20091009134631_create_dynamic_attribute_values.rb +17 -0
  371. data/db/migrate/20091009134659_create_order_details.rb +24 -0
  372. data/db/migrate/20091009134706_create_order_shippings.rb +16 -0
  373. data/db/migrate/20091009134714_create_orders.rb +21 -0
  374. data/db/migrate/20091009134721_create_packs_products.rb +13 -0
  375. data/db/migrate/20091009134805_create_product_types.rb +11 -0
  376. data/db/migrate/20091009134813_create_products.rb +37 -0
  377. data/db/migrate/20091009134821_create_products_wishlists.rb +13 -0
  378. data/db/migrate/20091009134947_create_wishlists.rb +12 -0
  379. data/db/migrate/20100323143123_create_geo_zones_transporter_rules.rb +12 -0
  380. data/db/migrate/20100414090950_create_brands.rb +15 -0
  381. data/db/migrate/20100414091706_create_sizes.rb +15 -0
  382. data/db/migrate/20100928123009_add_patronage_to_people.rb +20 -0
  383. data/db/migrate/20101007074306_create_product_price_variations.rb +13 -0
  384. data/db/migrate/20110311111210_create_forms.rb +13 -0
  385. data/db/migrate/20110311112646_attributes_forms.rb +13 -0
  386. data/db/migrate/20110322165950_add_payment_methods_to_settings.rb +13 -0
  387. data/db/migrate/20110405084454_add_colissimo_methods_to_settings.rb +13 -0
  388. data/db/migrate/20110516075553_add_google_infos_to_settings.rb +11 -0
  389. data/db/migrate/20110831164213_add_order_fields_to_addresses.rb +9 -0
  390. data/lib/CMCIC_Config.rb +16 -0
  391. data/lib/CMCIC_Tpe.rb +227 -0
  392. data/lib/forgeos/commerce.rb +9 -0
  393. data/lib/forgeos/commerce/admin_menu.rb +28 -0
  394. data/lib/forgeos/commerce/engine.rb +11 -0
  395. data/lib/forgeos/commerce/float.rb +10 -0
  396. data/lib/forgeos/commerce/statistics.rb +62 -0
  397. data/lib/forgeos/commerce/version.rb +5 -0
  398. data/lib/forgeos_commerce.rb +1 -0
  399. data/lib/special_offer.rb +61 -0
  400. data/lib/tasks/install.rake +9 -0
  401. data/lib/transporter.rb +26 -0
  402. data/lib/voucher.rb +41 -0
  403. data/recipes/deploy.rb +15 -0
  404. data/test/dummy/Rakefile +7 -0
  405. data/test/dummy/app/assets/javascripts/application.js +9 -0
  406. data/test/dummy/app/assets/stylesheets/application.css +7 -0
  407. data/test/dummy/app/controllers/application_controller.rb +3 -0
  408. data/test/dummy/app/helpers/application_helper.rb +2 -0
  409. data/test/dummy/app/views/layouts/application.html.erb +14 -0
  410. data/test/dummy/config.ru +4 -0
  411. data/test/dummy/config/application.rb +42 -0
  412. data/test/dummy/config/boot.rb +10 -0
  413. data/test/dummy/config/database.yml +25 -0
  414. data/test/dummy/config/environment.rb +5 -0
  415. data/test/dummy/config/environments/development.rb +27 -0
  416. data/test/dummy/config/environments/production.rb +51 -0
  417. data/test/dummy/config/environments/test.rb +39 -0
  418. data/test/dummy/config/initializers/backtrace_silencers.rb +7 -0
  419. data/test/dummy/config/initializers/inflections.rb +10 -0
  420. data/test/dummy/config/initializers/mime_types.rb +5 -0
  421. data/test/dummy/config/initializers/secret_token.rb +7 -0
  422. data/test/dummy/config/initializers/session_store.rb +8 -0
  423. data/test/dummy/config/initializers/wrap_parameters.rb +14 -0
  424. data/test/dummy/config/locales/en.yml +5 -0
  425. data/test/dummy/config/routes.rb +58 -0
  426. data/test/dummy/public/404.html +26 -0
  427. data/test/dummy/public/422.html +26 -0
  428. data/test/dummy/public/500.html +26 -0
  429. data/test/dummy/public/favicon.ico +0 -0
  430. data/test/dummy/script/rails +6 -0
  431. data/test/forgeos_commerce_test.rb +7 -0
  432. data/test/test_helper.rb +10 -0
  433. metadata +539 -0
@@ -0,0 +1,75 @@
1
+ load File.join(Gem.loaded_specs['forgeos_core'].full_gem_path, 'app', 'controllers', 'application_controller.rb')
2
+
3
+ ApplicationController.class_eval do
4
+ helper_method :current_currency, :current_cart, :current_wishlist
5
+ # Change the currency
6
+ def change_currency(currency_id)
7
+ if currency = Currency.find_by_id(currency_id)
8
+ session[:currency_id] = currency.id
9
+ end
10
+ redirect_to(:back)
11
+ end
12
+
13
+ private
14
+
15
+ # Generate a cart and save this in session and instance <i>@cart</i>.
16
+ #
17
+ # If <i>session[:cart_id]</i> existing, this method instance just <i>@cart</i>
18
+ def current_cart
19
+ return @cart if @cart
20
+ @cart = Cart.find_by_id(session[:cart_id])
21
+
22
+ @cart = current_user.cart if logged_in? &&
23
+ !current_user.is_a?(Administrator) &&
24
+ current_user.cart &&
25
+ (@cart.nil? or (@cart and @cart.is_empty?))
26
+ # If current_cart is nil because a problem of session or db.
27
+ # This recursive call method, risk of stack error if this problem persist.
28
+ @cart = Cart.create unless @cart
29
+ # Associate cart with user if he's logged
30
+ @cart.update_attribute(:user_id, current_user.id) if logged_in?
31
+ session[:cart_id] = @cart.id
32
+ return @cart
33
+ end
34
+
35
+ def current_wishlist
36
+ return @wishlist if @wishlist
37
+ @wishlist = Wishlist.find_by_id(session[:wishlist_id])
38
+
39
+ @wishlist = current_user.wishlist if logged_in? &&
40
+ !current_user.is_a?(Administrator) &&
41
+ current_user.wishlist &&
42
+ (@wishlist.nil? or (@wishlist and @wishlist.is_empty?))
43
+
44
+ @wishlist = Wishlist.create unless @wishlist
45
+
46
+ @wishlist.update_attribute(:user_id, current_user.id) if logged_in?
47
+ session[:wishlist_id] = @wishlist.id
48
+ return @wishlist
49
+ end
50
+
51
+ # A short cut for redirect user to the homepage
52
+ def redirect_to_home
53
+ # TODO - controller/action generalize.
54
+ redirect_to(root_path(:locale => params[:locale]))
55
+ end
56
+
57
+ # Redirect to new session page if user isn't logged
58
+ def must_to_be_logged
59
+ unless logged_in?
60
+ flash[:warning] = "You must be connected"
61
+ redirect_to(forgeos_core.new_person_session_path(:locale => params[:locale]))
62
+ end
63
+ end
64
+
65
+ def current_currency
66
+ return @current_currency if @current_currency
67
+ #TODO move default current to Setting
68
+ if Currency.table_exists? and
69
+ @current_currency = (Currency.find_by_id(session[:currency_id], :select => '`id`, `default`, `html`, `code`') ||
70
+ Currency.find_by_code('EUR', :select => '`id`, `default`, `html`, `code`'))
71
+ session[:currency_id] = @current_currency.id
72
+ return @current_currency
73
+ end
74
+ end
75
+ end
@@ -0,0 +1,229 @@
1
+ require 'ruleby'
2
+ class OrderController < ApplicationController
3
+
4
+ include Ruleby
5
+
6
+ before_filter :can_create_order?, :only => :create
7
+ before_filter :special_offer, :only => [:new, :create, :update_transporter]
8
+ before_filter :voucher, :only =>[:new, :create, :update_transporter]
9
+ #before_filter :shipping_methods, :only => :new
10
+
11
+ # Save in session <i>address_invoice_id</i> and <i>address_delivery_id</i>.
12
+ # Returns false if miss an address or if <i>shipping_method</i> is not validate by user, returns true else
13
+ def valid_shipment(action=true)
14
+ current_cart.options[:address_invoice_id] = params[:address_invoice_id] if params[:address_invoice_id]
15
+ current_cart.options[:address_delivery_id] = params[:address_delivery_id] if params[:address_delivery_id]
16
+
17
+ # AddressInvoice and AddressDelivery is obligatory for valid an order
18
+ if !current_cart.address_invoice || !current_cart.address_delivery
19
+ flash[:warning] = I18n.t('address', :count=>2).capitalize
20
+ redirect_to(:action => 'new')
21
+ return false
22
+ end
23
+
24
+ current_cart.options[:transporter_rule_id] = params[:transporter_rule_id] if params[:transporter_rule_id]
25
+
26
+ unless current_cart.transporter or current_cart.free_shipping
27
+ flash[:warning] = I18n.t('shipping_method',:count=>1).capitalize
28
+ redirect_to(:action => 'new')
29
+ return false
30
+ end
31
+
32
+ current_cart.save
33
+ redirect_to(:action => 'payment') if action
34
+ return true
35
+ end
36
+
37
+ # Payment integration
38
+ def payment
39
+ # TODO - include ActiveMerchant
40
+ #valid_shipment(false)
41
+ end
42
+
43
+ # Subscribe or edit user's informations
44
+ # Link render with partials of user's views
45
+ # session[:return_to] is initialize with <i>{:controller => 'order', :action => 'new'}</i>
46
+ def informations
47
+ session[:return_to] = {:controller => 'order', :action => 'new'}
48
+ end
49
+
50
+ # Final step, this action is accessible only if <i>session[:order_confirmation]</i> is true
51
+ def confirmation
52
+ redirect_to(:action => 'payment') unless session[:order_confirmation]
53
+ session[:order_confirmation] = nil
54
+ end
55
+
56
+ def new
57
+ return redirect_to(:action => 'informations') unless current_user
58
+ end
59
+
60
+ def create
61
+ valid = valid_shipment(false)
62
+ return false unless valid
63
+ @order = Order.from_cart(current_cart)
64
+ flash[:notice] = I18n.t('thank_you').capitalize
65
+ session[:order_confirmation] = true
66
+ redirect_to(:action => 'payment')
67
+ end
68
+
69
+ def add_address
70
+ render(:update) do |page|
71
+ page.replace_html("order", :partial => 'form_address')
72
+ end
73
+ end
74
+
75
+ def update_total
76
+ #special_offer
77
+ transporter_price = 0
78
+ if current_cart.transporter
79
+ offer_delivery = false
80
+ transporter_price = current_cart.transporter.variables.to_f unless offer_delivery and current_cart.transporter.nil?
81
+ end
82
+
83
+ order_total = current_cart.total + transporter_price
84
+
85
+ render(:update) do |page|
86
+ #page.replace_html('order_total_price', "#{order_total} #{current_currency.html}")
87
+ page.replace_html('transporter_price', "#{current_cart.total + transporter_price} #{current_currency.html}")
88
+ page.visual_effect :highlight, 'transporter_price'
89
+ page.visual_effect :highlight, 'order_total_price'
90
+ end
91
+ end
92
+
93
+ def update_transporter
94
+ @transporter_rule = TransporterRule.find_by_id(params[:id])
95
+ current_cart.options[:transporter_rule_id] = @transporter_rule.id if @transporter_rule
96
+ shipping_methods
97
+ update_total
98
+ end
99
+
100
+ # form to addresses
101
+ def back_addresses
102
+ render(:update) do |page|
103
+ page.replace_html("order", :partial => 'new')
104
+ page.replace_html("order_address_#{@address.class.to_s}", display_address(@address)) if @address
105
+ end
106
+ end
107
+
108
+ # Change select_tag address
109
+ def change_address
110
+ @address = Address.find_by_id(params[:id])
111
+ render(:update) do |page|
112
+ page.replace_html("order_address_#{@address.class.to_s}", display_address(@address))
113
+ page.visual_effect :highlight, "order_address_#{@address.class.to_s}"
114
+ end
115
+ end
116
+
117
+ # Go to form address
118
+ def update_address
119
+ @address = Address.find_by_id(params[:id])
120
+ render(:update) do |page|
121
+ page.replace_html("order", :partial => 'form_address', :locals => { :address => @address })
122
+ end
123
+ end
124
+
125
+ # Make or update Address and back to addresses
126
+ def create_address
127
+ @address = Address.find_by_id(params[:id])
128
+ if @address
129
+ @address.update_attributes(params[:address])
130
+ else
131
+ if current_user.addresses.size == 0
132
+ [AddressDelivery, AddressInvoice].each do |type|
133
+ current_user.addresses << type.create(params[:address])
134
+ end
135
+ else
136
+ #type = (params[:address][:kind] == 'AddressDelivery') ? AddressDelivery : AddressInvoice
137
+ current_user.addresses << AddressDelivery.create(params[:address])
138
+ current_user.addresses << AddressInvoice.create(params[:address])
139
+ end
140
+ end
141
+ back_addresses
142
+ end
143
+
144
+ private
145
+ def can_create_order?
146
+ if current_cart.nil? || current_cart.cart_items.empty?
147
+ flash[:error] = I18n.t('your_cart_is_empty').capitalize
148
+ redirect_to_home
149
+ end
150
+ end
151
+
152
+ # for an interface user-friendly...
153
+ def must_to_be_logged
154
+ unless logged_in?
155
+ if flash.nil?
156
+ flash[:warning] = I18n.t('you_must_be_connected').capitalize
157
+ else
158
+ flash[:error] = flash[:error]
159
+ flash[:user] = flash[:user]
160
+ end
161
+ redirect_to(:action => 'informations')
162
+ end
163
+ end
164
+
165
+ # check special offer rules
166
+ def special_offer
167
+ begin
168
+ engine :special_offer_engine do |e|
169
+ rule_builder = SpecialOffer.new(e)
170
+ rule_builder.cart = current_cart
171
+ @free_product_ids = []
172
+ rule_builder.free_product_ids = @free_product_ids
173
+ rule_builder.rules
174
+ current_cart.cart_items.each do |cart_product|
175
+ e.assert cart_product.product
176
+ end
177
+ e.assert current_cart
178
+ e.match
179
+ end
180
+ current_cart.options[:free_product_ids] = @free_product_ids
181
+ current_cart.options[:free_shipping] = current_cart.free_shipping
182
+ current_cart.save
183
+ rescue Exception
184
+ end
185
+ end
186
+
187
+ # check voucher rules
188
+ def voucher
189
+ begin
190
+ engine :voucher_engine do |e|
191
+ rule_builder = Voucher.new(e)
192
+ rule_builder.cart = current_cart
193
+ rule_builder.code = current_cart.options[:voucher_code]
194
+ rule_builder.free_product_ids = @free_product_ids
195
+ rule_builder.rules
196
+ current_cart.cart_items.each do |cart_product|
197
+ e.assert cart_product.product
198
+ end
199
+ e.assert current_cart
200
+ e.match
201
+ end
202
+ current_cart.options[:free_product_ids] = @free_product_ids
203
+ current_cart.save
204
+ rescue Exception
205
+ end
206
+ end
207
+
208
+
209
+ protected
210
+
211
+ def shipping_methods
212
+ @transporter_ids = []
213
+ begin
214
+ engine :transporter_engine do |e|
215
+
216
+ rule_builder = Transporter.new(e)
217
+ rule_builder.transporter_ids = @transporter_ids
218
+ rule_builder.rules
219
+ current_cart.cart_items.each do |cart_product|
220
+ e.assert cart_product.product
221
+ end
222
+ e.assert current_cart
223
+ e.match
224
+ end
225
+ rescue Exception
226
+ end
227
+ end
228
+
229
+ end
@@ -0,0 +1,31 @@
1
+ module Admin::PaymentFieldsHelper
2
+ def payment_fields_with_env(form_builder, object, method, elements)
3
+ %w(development production).map do |env|
4
+ content_tag(:div,
5
+ content_tag(:h4, env.capitalize) +
6
+ elements.map { |element| payment_field_with_env(form_builder, object, method, env, element) }.join('').html_safe,
7
+ :class => 'grid_7')
8
+ end.join("\n").html_safe
9
+ end
10
+
11
+ def payment_field_with_env(form_builder, object, method, env, element)
12
+ field_name = serialized_field_name(method, env, element)
13
+ content_tag(:div, form_builder.label(field_name, t(element, :scope => [:payment, method])), :class => 'grid_3 omega') +
14
+ content_tag(:div, form_builder.text_field(field_name, :value => (object[method].nil? ? '' : object[method][env][element])), :class => 'grid_4 alpha') +
15
+ content_tag(:div, '', :class => 'clear')
16
+ end
17
+
18
+ def payment_field(form_builder, object, type, method, element, options = {})
19
+ field_name = serialized_field_name(method, element)
20
+ raw(
21
+ form_builder.label(field_name, t(element, :scope => [:helpers, :label, form_builder.object_name, method])) +
22
+ tag(:br) +
23
+ case type
24
+ when :check_box
25
+ form_builder.send(type, field_name, options.merge(:checked => (object[method] and object[method][element] == '1')))
26
+ else
27
+ form_builder.send(type, field_name, options.merge(:value => (object[method].nil? ? '' : object[method][element])))
28
+ end
29
+ )
30
+ end
31
+ end
@@ -0,0 +1,7 @@
1
+ load File.join(Gem.loaded_specs['forgeos_core'].full_gem_path, 'app', 'helpers', 'application_helper.rb')
2
+ module ApplicationHelper
3
+ def price_with_currency(price=0, precision=2)
4
+ price = (price * current_currency.to_exchanges_rate(Currency::default).rate) unless current_currency.default?
5
+ number_to_currency price, :precision => precision, :unit => current_currency.html
6
+ end
7
+ end
@@ -0,0 +1,40 @@
1
+ # Methods for display <i>Cart</i> (in totality, by product, ...).
2
+ module CartHelper
3
+ # Extension of <i>link_to(name, options = {}, html_options = nil)</i>
4
+ #
5
+ # ==== Parameters
6
+ # * <tt>:name</tt> - name
7
+ # * <tt>:url</tt> - url, <i>{:controller => 'cart', :action => 'empty'}</i> by default
8
+ # * <tt>options</tt> the html options
9
+ def link_to_cart_empty(mini=false,name=I18n.t('empty_cart').capitalize, url={:controller => 'cart', :action => 'empty'}, options={:confirm => I18n.t(:confirm_empty_cart)})
10
+ if mini
11
+ link_to_remote name, { :update => 'cart', :url => url }.merge(options)
12
+ else
13
+ link_to name, url, options
14
+ end
15
+ end
16
+
17
+ # Extension of <i>link_to(name, options = {}, html_options = nil)</i>
18
+ #
19
+ # ==== Parameters
20
+ # * <tt>:name</tt> - name, <i>"Cart"</i> by default
21
+ # * <tt>:url</tt> - url, <i>{:controller => 'cart'}</i> by default
22
+ # * <tt>options</tt> the html options
23
+ def link_to_cart(name=I18n.t('cart', :count => 1), url={:controller => 'cart'}, options=nil)
24
+ #unless cart.nil?
25
+ # name = "#{name} (#{cart.size} #{I18n.t('product', :count => cart.size)})"
26
+ #end
27
+ link_to name.capitalize, {:controller => 'cart'}, options
28
+ end
29
+
30
+ # Extension of <i>link_to(name, options = {}, html_options = nil)</i> with a <i>Product</i> object of first parameter
31
+ #
32
+ # ==== Parameters
33
+ # * <tt>:product</tt> - a <i>Product</i> object
34
+ # * <tt>:name</tt> - name, <i>
35
+ # * <tt>:url</tt> - url, <i>{:controller => 'cart', :action => 'add_product'}</i> by default
36
+ # * <tt>options</tt> the html options
37
+ def link_to_add_cart(product, name='add_to_cart', url={:controller => 'cart', :action => 'add_product'}, options=nil)
38
+ link_to I18n.t(name).capitalize, url.merge({:id => product.id}), options
39
+ end
40
+ end
@@ -0,0 +1,36 @@
1
+ # Methods for display <i>Category</i>
2
+ module CategoryHelper
3
+ # Display all tree struct <i>Category</i>
4
+ def display_categories(categories=Category::roots)
5
+ content = '<div class="categories">'
6
+ categories.each do |category|
7
+ content += display_category(category)
8
+ end
9
+ content += "</div>"
10
+ end
11
+
12
+ # Display one tree struct <i>Category</i>
13
+ def display_category(category)
14
+ current_category = Category.find_by_id(params[:id])
15
+
16
+ content = '<div class="category">'
17
+ (0..category.level).each do |i|
18
+ content += "&nbsp;"
19
+ end
20
+ unless category.children.empty?
21
+ content += link_to_function category.name, visual_effect('appear', "category_#{category.id}")
22
+ content += "<div id=\"category_#{category.id}\" " + ((current_category && current_category.parent.eql?(category)) ? '' : 'style="display: none;"') + '>'
23
+ category.children.each do |subcategory|
24
+ content += display_category(subcategory)
25
+ end
26
+ content += "</div>"
27
+ else
28
+ content += link_to_unless current_category && current_category.eql?(category), category.name, :controller => 'catalog', :action => 'category', :id => category
29
+ end
30
+ content += "</div>"
31
+ end
32
+
33
+ def link_to_category(category)
34
+
35
+ end
36
+ end
@@ -0,0 +1,118 @@
1
+ module ProductHelper
2
+
3
+ def display_catalog(products)
4
+ total = (products.is_a?(WillPaginate::Collection)) ? products.total_entries : products.size
5
+ content = pluralize total, "result"
6
+
7
+ products.in_groups_of(4).each do |products_|
8
+ products_.each do |product|
9
+ content += display_product(product) if product
10
+ end
11
+ content += '<div class="clear"></div>'
12
+ end
13
+
14
+ content += will_paginate(products).to_s if products.is_a?(WillPaginate::Collection)
15
+ return content
16
+ end
17
+
18
+ def display_all_products(products=Product.find_all_by_active_and_deleted(true,false), with_description=false)
19
+ content = ''
20
+ products.each do |product|
21
+ content << display_product(product, with_description)
22
+ end
23
+ content_tag :div, content, :class=>'products'
24
+ end
25
+
26
+ def display_product(product, with_description=false, options={})
27
+ #return I18n.t('no_product') unless product
28
+ if product
29
+ content = "<div id=\"product_#{product.id}\" class=\"product\">"
30
+ if product.attachments.find_all_by_type('Picture').first
31
+ content += "<div class='product_picture'>"
32
+ content += image_tag(product.attachments.find_all_by_type('Picture').first.public_filename(options[:thumbnail_type] || :thumb))
33
+ content += "</div>"
34
+ end
35
+ content += "<div class='product_name'>"
36
+ content += link_to_product product
37
+ content += "</div>"
38
+ content += "<div class='product_price'>"
39
+ content += product.price_to_s(true)
40
+ #content += product.price.to_s
41
+ content += "</div>"
42
+ content += "<div class='product_add_cart'>"
43
+ content += link_to_add_cart(product)
44
+ content += "</div>"
45
+ if with_description
46
+ content += "<div class='product_description'>"
47
+ content += product.description
48
+ content += "</div>"
49
+ end
50
+ content += "</div>"
51
+ content += draggable_element("product_#{product.id}", :helper => '"clone"')
52
+ end
53
+ end
54
+
55
+ def display_product_page(product)
56
+ content = '<div class="large">'
57
+ content += '<div id="product_'+product.id.to_s+'" class="product_show">'
58
+ content += '<div class="product_name">'
59
+ content += '<h1>'
60
+ content += "<div id='display_product_page_name_#{product.id}'>"
61
+ content += product.name
62
+ content += "</div>"
63
+ content += '</h1>'
64
+ content += '</div>'
65
+ content += '<br /><br />'
66
+ content += '<div class="product_description">'
67
+ content += product.description
68
+ content += '</div>'
69
+ content += '<div class="product_picture" id="display_product_pictures_'+product.id.to_s+'">'
70
+ product.pictures.each do |picture|
71
+ content += (picture == product.pictures.first ? image_tag(picture.public_filename('')) : image_tag(picture.public_filename(:small)))
72
+ end
73
+ #content += image_tag(product.attachments.find_all_by_type('Picture').first.public_filename(:normal)) unless product.attachments.find_all_by_type('Picture').empty?
74
+ content += '</div>'
75
+ content += '<div class="product_attributes_groups" id="product_attributes_groups_' + product.id.to_s + '">'
76
+ content += display_product_page_attributes(product)
77
+ content += '</div>'
78
+ content += '<div class="product_price">'
79
+ content += '<div class="product_price_label">'
80
+ content += 'price:&nbsp;'
81
+ content += '</div>'
82
+ content += '<div class="product_price_value" id="display_product_page_price_' + product.id.to_s + '">'
83
+ content += product.price_to_s(true)
84
+ content += '</div>'
85
+ content += '</div>'
86
+ content += '<div class="product_link_cart" id="display_product_link_cart_' + product.id.to_s + '">'
87
+ content += link_to_add_cart(product)
88
+ content += '</div>'
89
+ content += '</div>'
90
+ content += '</div>'
91
+
92
+ content += draggable_element("product_#{product.id}", :cursor => '"move"', :helper => "function(event) { return $('<div class=\"ui-widget-header\">#{escape_javascript(product.name)}</div>'); }" )
93
+ end
94
+
95
+ def display_product_page_attributes(product)
96
+ content = ""
97
+ return content unless product && product.product_type
98
+ product.product_type.product_attributes.each do |attribute|
99
+ content += "<div class='product_attribute_group_name'>"
100
+ content += attribute.name + "&nbsp;:&nbsp;"
101
+ content += "</div>"
102
+ content += '<div class="product_attributes">'
103
+ attribute.attribute_values.each do |attribute_value|
104
+ content += '<div class="product_attribute">'
105
+ content += attribute_value.name
106
+ content += "</div>"
107
+ end
108
+ content += '</div>'
109
+ content += "<div class='clear'></div>"
110
+ end
111
+ content
112
+ end
113
+
114
+ def link_to_product(product, name=nil, options=nil)
115
+ name = product.name if name.nil?
116
+ link_to name, [:seo,product], options
117
+ end
118
+ end