gemgento 2.8.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 (429) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +6 -0
  3. data/.rspec +2 -0
  4. data/Gemfile +8 -0
  5. data/README.md +9 -0
  6. data/Rakefile +21 -0
  7. data/app/adapters/gemgento/magento/address_adapter.rb +37 -0
  8. data/app/adapters/gemgento/magento/customer_adapter.rb +24 -0
  9. data/app/adapters/gemgento/magento/line_item_adapter.rb +41 -0
  10. data/app/adapters/gemgento/magento/order_adapter.rb +97 -0
  11. data/app/adapters/gemgento/magento/order_status_adapter.rb +24 -0
  12. data/app/adapters/gemgento/magento/payment_adapter.rb +38 -0
  13. data/app/adapters/gemgento/magento/product_adapater.rb +24 -0
  14. data/app/adapters/gemgento/magento/quote_adapter.rb +17 -0
  15. data/app/adapters/gemgento/magento/shipment_adapter.rb +74 -0
  16. data/app/adapters/gemgento/magento/shipment_item_adapter.rb +39 -0
  17. data/app/adapters/gemgento/magento/shipment_track_adapter.rb +31 -0
  18. data/app/adapters/gemgento/magento_adapter.rb +17 -0
  19. data/app/assets/fonts/FuturaStd-Bold.otf +0 -0
  20. data/app/assets/fonts/FuturaStd-Book.otf +0 -0
  21. data/app/assets/fonts/FuturaStd-Light.otf +0 -0
  22. data/app/assets/fonts/FuturaStd-Medium.otf +0 -0
  23. data/app/assets/fonts/Verlag-Black.otf +0 -0
  24. data/app/assets/fonts/Verlag-BlackItalic.otf +0 -0
  25. data/app/assets/fonts/Verlag-Bold.otf +0 -0
  26. data/app/assets/fonts/Verlag-BoldItalic.otf +0 -0
  27. data/app/assets/fonts/Verlag-Book.otf +0 -0
  28. data/app/assets/fonts/Verlag-BookItalic-2.otf +0 -0
  29. data/app/assets/fonts/Verlag-BookItalic-3.otf +0 -0
  30. data/app/assets/fonts/Verlag-BookItalic.otf +0 -0
  31. data/app/assets/fonts/Verlag-Light.otf +0 -0
  32. data/app/assets/fonts/Verlag-LightItalic.otf +0 -0
  33. data/app/assets/fonts/Verlag-XLight.otf +0 -0
  34. data/app/assets/fonts/Verlag-XLightItalic.otf +0 -0
  35. data/app/assets/images/about_store.jpg +0 -0
  36. data/app/assets/images/gemgento-icon-bolt.png +0 -0
  37. data/app/assets/javascripts/gemgento/active_admin.js.coffee +42 -0
  38. data/app/assets/javascripts/gemgento/checkout/address.coffee +23 -0
  39. data/app/assets/javascripts/gemgento/gemgento.js +1 -0
  40. data/app/assets/javascripts/gemgento/global.js.coffee +31 -0
  41. data/app/assets/stylesheets/gemgento/active_admin.css.scss +549 -0
  42. data/app/assets/stylesheets/gemgento/default-views/_address.scss +11 -0
  43. data/app/assets/stylesheets/gemgento/default-views/_category.scss +54 -0
  44. data/app/assets/stylesheets/gemgento/default-views/_checkout.scss +28 -0
  45. data/app/assets/stylesheets/gemgento/default-views/_footer.scss +13 -0
  46. data/app/assets/stylesheets/gemgento/default-views/_form.scss +127 -0
  47. data/app/assets/stylesheets/gemgento/default-views/_header.scss +32 -0
  48. data/app/assets/stylesheets/gemgento/default-views/_layout.css.scss +157 -0
  49. data/app/assets/stylesheets/gemgento/default-views/_pages.css.scss +83 -0
  50. data/app/assets/stylesheets/gemgento/default-views/_product.scss +57 -0
  51. data/app/assets/stylesheets/gemgento/default-views/_shopping_bag.scss +87 -0
  52. data/app/assets/stylesheets/gemgento/default-views/_subheader.css.scss +30 -0
  53. data/app/assets/stylesheets/gemgento/default-views/application.css.scss +1 -0
  54. data/app/controllers/concerns/gemgento/api/v1/base.rb +15 -0
  55. data/app/controllers/concerns/gemgento/api/v1/product_filters.rb +33 -0
  56. data/app/controllers/gemgento/addresses_controller.rb +14 -0
  57. data/app/controllers/gemgento/api/v1/categories_controller.rb +13 -0
  58. data/app/controllers/gemgento/api/v1/products_controller.rb +23 -0
  59. data/app/controllers/gemgento/api/v1/search_controller.rb +14 -0
  60. data/app/controllers/gemgento/application_controller.rb +5 -0
  61. data/app/controllers/gemgento/cart_controller.rb +99 -0
  62. data/app/controllers/gemgento/categories_controller.rb +37 -0
  63. data/app/controllers/gemgento/checkout/address_controller.rb +48 -0
  64. data/app/controllers/gemgento/checkout/confirm_controller.rb +72 -0
  65. data/app/controllers/gemgento/checkout/coupons_controller.rb +42 -0
  66. data/app/controllers/gemgento/checkout/gift_card_controller.rb +39 -0
  67. data/app/controllers/gemgento/checkout/gift_controller.rb +32 -0
  68. data/app/controllers/gemgento/checkout/login_controller.rb +123 -0
  69. data/app/controllers/gemgento/checkout/payment_controller.rb +70 -0
  70. data/app/controllers/gemgento/checkout/paypal_controller.rb +23 -0
  71. data/app/controllers/gemgento/checkout/shipping_controller.rb +46 -0
  72. data/app/controllers/gemgento/checkout/shipping_payment_controller.rb +58 -0
  73. data/app/controllers/gemgento/checkout/thank_you_controller.rb +45 -0
  74. data/app/controllers/gemgento/checkout_controller.rb +120 -0
  75. data/app/controllers/gemgento/countries_controller.rb +17 -0
  76. data/app/controllers/gemgento/errors_controller.rb +7 -0
  77. data/app/controllers/gemgento/footer_items_controller.rb +16 -0
  78. data/app/controllers/gemgento/home_controller.rb +7 -0
  79. data/app/controllers/gemgento/magento/addresses_controller.rb +61 -0
  80. data/app/controllers/gemgento/magento/base_controller.rb +18 -0
  81. data/app/controllers/gemgento/magento/categories_controller.rb +103 -0
  82. data/app/controllers/gemgento/magento/email/sales/credit_memos_controller.rb +21 -0
  83. data/app/controllers/gemgento/magento/email/sales/invoices_controller.rb +21 -0
  84. data/app/controllers/gemgento/magento/email/sales/orders_controller.rb +20 -0
  85. data/app/controllers/gemgento/magento/email/sales/shipments_controller.rb +25 -0
  86. data/app/controllers/gemgento/magento/emails_controller.rb +11 -0
  87. data/app/controllers/gemgento/magento/inventory_controller.rb +30 -0
  88. data/app/controllers/gemgento/magento/orders_controller.rb +12 -0
  89. data/app/controllers/gemgento/magento/price_rules_controller.rb +22 -0
  90. data/app/controllers/gemgento/magento/product_attribute_sets_controller.rb +37 -0
  91. data/app/controllers/gemgento/magento/product_attributes_controller.rb +70 -0
  92. data/app/controllers/gemgento/magento/products_controller.rb +240 -0
  93. data/app/controllers/gemgento/magento/recurring_profiles_controller.rb +42 -0
  94. data/app/controllers/gemgento/magento/stores_controller.rb +21 -0
  95. data/app/controllers/gemgento/magento/user_groups_controller.rb +23 -0
  96. data/app/controllers/gemgento/magento/users_controller.rb +63 -0
  97. data/app/controllers/gemgento/order_export_controller.rb +21 -0
  98. data/app/controllers/gemgento/orders_controller.rb +12 -0
  99. data/app/controllers/gemgento/products_controller.rb +12 -0
  100. data/app/controllers/gemgento/regions_controller.rb +18 -0
  101. data/app/controllers/gemgento/search_controller.rb +16 -0
  102. data/app/controllers/gemgento/shipments_controller.rb +5 -0
  103. data/app/controllers/gemgento/stock_notifications_controller.rb +22 -0
  104. data/app/controllers/gemgento/subscribers_controller.rb +35 -0
  105. data/app/controllers/gemgento/sync_controller.rb +50 -0
  106. data/app/controllers/gemgento/user/addresses_controller.rb +79 -0
  107. data/app/controllers/gemgento/user/base_controller.rb +14 -0
  108. data/app/controllers/gemgento/user/home_controller.rb +9 -0
  109. data/app/controllers/gemgento/user/orders_controller.rb +17 -0
  110. data/app/controllers/gemgento/user/passwords_controller.rb +18 -0
  111. data/app/controllers/gemgento/user/recurring_profiles_controller.rb +31 -0
  112. data/app/controllers/gemgento/user/registration_session_controller.rb +103 -0
  113. data/app/controllers/gemgento/user/registrations_controller.rb +28 -0
  114. data/app/controllers/gemgento/user/saved_credit_cards_controller.rb +56 -0
  115. data/app/controllers/gemgento/user/sessions_controller.rb +50 -0
  116. data/app/controllers/gemgento/user/wishlist_items_controller.rb +55 -0
  117. data/app/controllers/gemgento/users_controller.rb +36 -0
  118. data/app/helpers/gemgento/application_helper.rb +125 -0
  119. data/app/helpers/gemgento/categories_helper.rb +39 -0
  120. data/app/helpers/gemgento/checkout/payment_helper.rb +5 -0
  121. data/app/helpers/gemgento/products_helper.rb +23 -0
  122. data/app/jobs/gemgento/import_job.rb +12 -0
  123. data/app/mailers/gemgento/sales_mailer.rb +80 -0
  124. data/app/models/admin_user.rb +7 -0
  125. data/app/models/concerns/gemgento/product_touches.rb +26 -0
  126. data/app/models/gemgento.rb +5 -0
  127. data/app/models/gemgento/adapter/sellect/customer.rb +34 -0
  128. data/app/models/gemgento/adapter/sellect/order.rb +378 -0
  129. data/app/models/gemgento/adapter/sellect/product.rb +250 -0
  130. data/app/models/gemgento/adapter/sellect_adapter.rb +16 -0
  131. data/app/models/gemgento/adapter/shopify/address.rb +40 -0
  132. data/app/models/gemgento/adapter/shopify/category.rb +51 -0
  133. data/app/models/gemgento/adapter/shopify/customer.rb +66 -0
  134. data/app/models/gemgento/adapter/shopify/order.rb +334 -0
  135. data/app/models/gemgento/adapter/shopify/product.rb +377 -0
  136. data/app/models/gemgento/adapter/shopify/product_category_position.rb +58 -0
  137. data/app/models/gemgento/adapter/shopify_adapter.rb +63 -0
  138. data/app/models/gemgento/address.rb +206 -0
  139. data/app/models/gemgento/api_job.rb +68 -0
  140. data/app/models/gemgento/asset.rb +185 -0
  141. data/app/models/gemgento/asset_file.rb +57 -0
  142. data/app/models/gemgento/asset_type.rb +8 -0
  143. data/app/models/gemgento/bundle.rb +5 -0
  144. data/app/models/gemgento/bundle/item.rb +17 -0
  145. data/app/models/gemgento/bundle/option.rb +20 -0
  146. data/app/models/gemgento/category.rb +235 -0
  147. data/app/models/gemgento/country.rb +21 -0
  148. data/app/models/gemgento/gift_message.rb +8 -0
  149. data/app/models/gemgento/image_import.rb +141 -0
  150. data/app/models/gemgento/import.rb +125 -0
  151. data/app/models/gemgento/inventory.rb +60 -0
  152. data/app/models/gemgento/inventory_import.rb +51 -0
  153. data/app/models/gemgento/line_item.rb +142 -0
  154. data/app/models/gemgento/line_item_option.rb +10 -0
  155. data/app/models/gemgento/magento_db.rb +35 -0
  156. data/app/models/gemgento/magento_response.rb +10 -0
  157. data/app/models/gemgento/order.rb +56 -0
  158. data/app/models/gemgento/order_status.rb +7 -0
  159. data/app/models/gemgento/payment.rb +50 -0
  160. data/app/models/gemgento/price_rule.rb +258 -0
  161. data/app/models/gemgento/price_tier.rb +36 -0
  162. data/app/models/gemgento/product.rb +607 -0
  163. data/app/models/gemgento/product_attribute.rb +48 -0
  164. data/app/models/gemgento/product_attribute_option.rb +39 -0
  165. data/app/models/gemgento/product_attribute_set.rb +22 -0
  166. data/app/models/gemgento/product_attribute_value.rb +26 -0
  167. data/app/models/gemgento/product_category.rb +34 -0
  168. data/app/models/gemgento/product_import.rb +359 -0
  169. data/app/models/gemgento/quote.rb +586 -0
  170. data/app/models/gemgento/recurring_profile.rb +28 -0
  171. data/app/models/gemgento/region.rb +14 -0
  172. data/app/models/gemgento/relation.rb +10 -0
  173. data/app/models/gemgento/relation_type.rb +7 -0
  174. data/app/models/gemgento/saved_credit_card.rb +45 -0
  175. data/app/models/gemgento/search.rb +14 -0
  176. data/app/models/gemgento/session.rb +49 -0
  177. data/app/models/gemgento/shipment.rb +38 -0
  178. data/app/models/gemgento/shipment_comment.rb +19 -0
  179. data/app/models/gemgento/shipment_item.rb +11 -0
  180. data/app/models/gemgento/shipment_track.rb +21 -0
  181. data/app/models/gemgento/stock_notification.rb +17 -0
  182. data/app/models/gemgento/store.rb +31 -0
  183. data/app/models/gemgento/store_tag.rb +8 -0
  184. data/app/models/gemgento/subscriber.rb +30 -0
  185. data/app/models/gemgento/swatch.rb +9 -0
  186. data/app/models/gemgento/sync.rb +134 -0
  187. data/app/models/gemgento/tag.rb +64 -0
  188. data/app/models/gemgento/user.rb +161 -0
  189. data/app/models/gemgento/user_group.rb +13 -0
  190. data/app/models/gemgento/wishlist_item.rb +11 -0
  191. data/app/services/gemgento/magento_api.rb +173 -0
  192. data/app/services/gemgento/price.rb +67 -0
  193. data/app/validators/gemgento/credit_card_validator.rb +50 -0
  194. data/app/validators/gemgento/image_import_validator.rb +100 -0
  195. data/app/validators/gemgento/inventory_import_validator.rb +73 -0
  196. data/app/validators/gemgento/inventory_validator.rb +14 -0
  197. data/app/validators/gemgento/product_import_validator.rb +163 -0
  198. data/app/views/admin/product_positions/_index.html.haml +14 -0
  199. data/app/views/devise/registrations/edit.haml +37 -0
  200. data/app/views/gemgento/addresses/_address.json.jbuilder +6 -0
  201. data/app/views/gemgento/addresses/region_options.html.haml +1 -0
  202. data/app/views/gemgento/api/v1/categories/_category.json.jbuilder +52 -0
  203. data/app/views/gemgento/api/v1/categories/index.json.jbuilder +8 -0
  204. data/app/views/gemgento/api/v1/categories/show.json.jbuilder +7 -0
  205. data/app/views/gemgento/api/v1/products/_attributes.json.jbuilder +9 -0
  206. data/app/views/gemgento/api/v1/products/_product.json.jbuilder +18 -0
  207. data/app/views/gemgento/api/v1/products/_relationships.json.jbuilder +48 -0
  208. data/app/views/gemgento/api/v1/products/index.json.jbuilder +8 -0
  209. data/app/views/gemgento/api/v1/products/show.json.jbuilder +7 -0
  210. data/app/views/gemgento/api/v1/search/index.json.jbuilder +8 -0
  211. data/app/views/gemgento/api/v1/search/show.json.jbuilder +8 -0
  212. data/app/views/gemgento/assets/_asset.json.jbuilder +13 -0
  213. data/app/views/gemgento/cart/show.html.haml +67 -0
  214. data/app/views/gemgento/categories/_category.json.jbuilder +9 -0
  215. data/app/views/gemgento/categories/_product_tile.html.haml +16 -0
  216. data/app/views/gemgento/categories/index.html.haml +10 -0
  217. data/app/views/gemgento/categories/index.json.jbuilder +1 -0
  218. data/app/views/gemgento/categories/show.html.haml +16 -0
  219. data/app/views/gemgento/categories/show.json.jbuilder +1 -0
  220. data/app/views/gemgento/checkout/_checkout_header.html.haml +17 -0
  221. data/app/views/gemgento/checkout/address/error.js.erb +1 -0
  222. data/app/views/gemgento/checkout/address/show.html.haml +88 -0
  223. data/app/views/gemgento/checkout/address/success.js.erb +1 -0
  224. data/app/views/gemgento/checkout/confirm/error.js.erb +0 -0
  225. data/app/views/gemgento/checkout/confirm/show.html.haml +60 -0
  226. data/app/views/gemgento/checkout/confirm/success.js.erb +1 -0
  227. data/app/views/gemgento/checkout/login/login_fail.js.erb +1 -0
  228. data/app/views/gemgento/checkout/login/login_guest_fail.js.erb +1 -0
  229. data/app/views/gemgento/checkout/login/login_guest_success.js.erb +1 -0
  230. data/app/views/gemgento/checkout/login/login_success.js.erb +1 -0
  231. data/app/views/gemgento/checkout/login/registration_fail.js.erb +1 -0
  232. data/app/views/gemgento/checkout/login/registration_success.js.erb +1 -0
  233. data/app/views/gemgento/checkout/login/show.html.haml +50 -0
  234. data/app/views/gemgento/checkout/payment/error.js.erb +1 -0
  235. data/app/views/gemgento/checkout/payment/show.html.haml +56 -0
  236. data/app/views/gemgento/checkout/payment/success.js.erb +1 -0
  237. data/app/views/gemgento/checkout/shipping/error.js.erb +0 -0
  238. data/app/views/gemgento/checkout/shipping/show.html.haml +26 -0
  239. data/app/views/gemgento/checkout/shipping/success.js.erb +1 -0
  240. data/app/views/gemgento/checkout/shipping_payment/show.haml +52 -0
  241. data/app/views/gemgento/checkout/thank_you/show.html.haml +6 -0
  242. data/app/views/gemgento/countries/_country.json.jbuilder +4 -0
  243. data/app/views/gemgento/countries/index.json.jbuilder +3 -0
  244. data/app/views/gemgento/countries/show.json.jbuilder +1 -0
  245. data/app/views/gemgento/home/index.html.haml +1 -0
  246. data/app/views/gemgento/order/add_item.js.erb +0 -0
  247. data/app/views/gemgento/order/no_inventory.js.erb +1 -0
  248. data/app/views/gemgento/order/remove_item.js.erb +0 -0
  249. data/app/views/gemgento/order/update_item.js.erb +0 -0
  250. data/app/views/gemgento/order_export/index.html.haml +2 -0
  251. data/app/views/gemgento/order_items/_order_item.json.jbuilder +7 -0
  252. data/app/views/gemgento/orders/_order.json.jbuilder +29 -0
  253. data/app/views/gemgento/products/_product.json.jbuilder +40 -0
  254. data/app/views/gemgento/products/index.html.haml +19 -0
  255. data/app/views/gemgento/products/show.html.haml +67 -0
  256. data/app/views/gemgento/products/show.json.jbuilder +1 -0
  257. data/app/views/gemgento/sales_mailer/credit_memo_email.html.haml +1 -0
  258. data/app/views/gemgento/sales_mailer/invoice_email.html.haml +1 -0
  259. data/app/views/gemgento/sales_mailer/order_email.html.haml +1 -0
  260. data/app/views/gemgento/sales_mailer/shipment_email.html.haml +1 -0
  261. data/app/views/gemgento/search/index.html.haml +8 -0
  262. data/app/views/gemgento/shared/_asset.json.jbuilder +35 -0
  263. data/app/views/gemgento/shared/_asset_file.json.jbuilder +19 -0
  264. data/app/views/gemgento/shared/_asset_type.json.jbuilder +13 -0
  265. data/app/views/gemgento/shared/_error_messages.haml +7 -0
  266. data/app/views/gemgento/shared/_flash_messages.haml +4 -0
  267. data/app/views/gemgento/shared/_footer.haml +7 -0
  268. data/app/views/gemgento/shared/_header.haml +23 -0
  269. data/app/views/gemgento/shared/_mini_bag.haml +36 -0
  270. data/app/views/gemgento/shared/_product_image.haml +8 -0
  271. data/app/views/gemgento/shipments/_shipment.json.jbuilder +12 -0
  272. data/app/views/gemgento/subscribers/create.js.erb +2 -0
  273. data/app/views/gemgento/subscribers/errors.js.erb +1 -0
  274. data/app/views/gemgento/user/_user.json.jbuilder +2 -0
  275. data/app/views/gemgento/user/addresses/_form.haml +39 -0
  276. data/app/views/gemgento/user/addresses/errors.js.erb +1 -0
  277. data/app/views/gemgento/user/addresses/index.haml +33 -0
  278. data/app/views/gemgento/user/addresses/new.haml +11 -0
  279. data/app/views/gemgento/user/addresses/success.js.erb +1 -0
  280. data/app/views/gemgento/user/confirmations/new.haml +9 -0
  281. data/app/views/gemgento/user/home/index.haml +8 -0
  282. data/app/views/gemgento/user/mailer/confirmation_instructions.html.erb +5 -0
  283. data/app/views/gemgento/user/mailer/reset_password_instructions.html.erb +8 -0
  284. data/app/views/gemgento/user/mailer/unlock_instructions.html.erb +7 -0
  285. data/app/views/gemgento/user/orders/index.html.haml +29 -0
  286. data/app/views/gemgento/user/orders/show.html.haml +87 -0
  287. data/app/views/gemgento/user/passwords/edit.html.erb +18 -0
  288. data/app/views/gemgento/user/passwords/new.html.haml +21 -0
  289. data/app/views/gemgento/user/registration_session/new.haml +67 -0
  290. data/app/views/gemgento/user/registrations/new.html.haml +28 -0
  291. data/app/views/gemgento/user/saved_credit_cards/_form.haml +69 -0
  292. data/app/views/gemgento/user/saved_credit_cards/index.haml +25 -0
  293. data/app/views/gemgento/user/saved_credit_cards/new.haml +13 -0
  294. data/app/views/gemgento/user/sessions/new.html.haml +29 -0
  295. data/app/views/gemgento/user/shared/_links.erb +25 -0
  296. data/app/views/gemgento/user/shared/_user_header.haml +8 -0
  297. data/app/views/gemgento/user/wishlist_items/index.html.haml +20 -0
  298. data/app/views/kaminari/_first_page.html.haml +9 -0
  299. data/app/views/kaminari/_gap.html.haml +8 -0
  300. data/app/views/kaminari/_last_page.html.haml +9 -0
  301. data/app/views/kaminari/_next_page.html.haml +9 -0
  302. data/app/views/kaminari/_page.html.haml +10 -0
  303. data/app/views/kaminari/_paginator.html.haml +18 -0
  304. data/app/views/kaminari/_prev_page.html.haml +9 -0
  305. data/app/views/layouts/_footer.html.haml +5 -0
  306. data/app/views/layouts/_header.html.haml +39 -0
  307. data/app/views/layouts/gemgento.html.haml +22 -0
  308. data/app/workers/gemgento/apply_price_rule.rb +24 -0
  309. data/app/workers/gemgento/cart/add_item_worker.rb +23 -0
  310. data/app/workers/gemgento/cart/update_item_worker.rb +18 -0
  311. data/bin/rails +12 -0
  312. data/config/gemgento_config.yml +12 -0
  313. data/config/initializers/active_admin.rb +14 -0
  314. data/config/initializers/active_touch.rb +3 -0
  315. data/config/initializers/assets.rb +1 -0
  316. data/config/initializers/boolean_typecasting.rb +37 -0
  317. data/config/initializers/devise.rb +49 -0
  318. data/config/initializers/gemgento_config.rb +67 -0
  319. data/config/initializers/mime_types.rb +4 -0
  320. data/config/initializers/state_machine.rb +7 -0
  321. data/config/locales/en.yml +24 -0
  322. data/config/routes.rb +138 -0
  323. data/db/migrate/20151201231300_add_validation_indexes_to_gemgento_products.rb +22 -0
  324. data/db/migrate/20160122174450_gemgento2.rb +969 -0
  325. data/db/migrate/20160217142910_create_gemgento_imports.rb +15 -0
  326. data/db/migrate/20160219235858_add_timestamps_to_gemgento_asset_files.rb +6 -0
  327. data/gemgento.gemspec +44 -0
  328. data/lib/devise/models/validatable.rb +76 -0
  329. data/lib/gemgento.rb +24 -0
  330. data/lib/gemgento/admin/admin_user.rb +29 -0
  331. data/lib/gemgento/admin/api_jobs.rb +30 -0
  332. data/lib/gemgento/admin/image_import.rb +87 -0
  333. data/lib/gemgento/admin/inventory_import.rb +81 -0
  334. data/lib/gemgento/admin/product_import.rb +138 -0
  335. data/lib/gemgento/admin/product_positions.rb +49 -0
  336. data/lib/gemgento/admin/stores.rb +33 -0
  337. data/lib/gemgento/admin/subscribers.rb +31 -0
  338. data/lib/gemgento/admin/syncs.rb +26 -0
  339. data/lib/gemgento/api/soap/authnetcim/payment.rb +127 -0
  340. data/lib/gemgento/api/soap/catalog/category.rb +237 -0
  341. data/lib/gemgento/api/soap/catalog/product.rb +481 -0
  342. data/lib/gemgento/api/soap/catalog/product_attribute.rb +147 -0
  343. data/lib/gemgento/api/soap/catalog/product_attribute_media.rb +202 -0
  344. data/lib/gemgento/api/soap/catalog/product_attribute_set.rb +80 -0
  345. data/lib/gemgento/api/soap/catalog/product_tag.rb +146 -0
  346. data/lib/gemgento/api/soap/catalog/product_tier_price.rb +21 -0
  347. data/lib/gemgento/api/soap/catalog/search.rb +27 -0
  348. data/lib/gemgento/api/soap/catalog_inventory/stock_item.rb +87 -0
  349. data/lib/gemgento/api/soap/catalog_rule/rule.rb +54 -0
  350. data/lib/gemgento/api/soap/checkout/cart.rb +85 -0
  351. data/lib/gemgento/api/soap/checkout/coupon.rb +37 -0
  352. data/lib/gemgento/api/soap/checkout/customer.rb +87 -0
  353. data/lib/gemgento/api/soap/checkout/payment.rb +59 -0
  354. data/lib/gemgento/api/soap/checkout/product.rb +138 -0
  355. data/lib/gemgento/api/soap/checkout/shipping.rb +37 -0
  356. data/lib/gemgento/api/soap/customer/address.rb +143 -0
  357. data/lib/gemgento/api/soap/customer/customer.rb +200 -0
  358. data/lib/gemgento/api/soap/directory/country.rb +49 -0
  359. data/lib/gemgento/api/soap/directory/region.rb +50 -0
  360. data/lib/gemgento/api/soap/enterprise_gift_message/gift_message.rb +26 -0
  361. data/lib/gemgento/api/soap/gift_card.rb +35 -0
  362. data/lib/gemgento/api/soap/globalcollect/saved_cc.rb +58 -0
  363. data/lib/gemgento/api/soap/miscellaneous/store.rb +47 -0
  364. data/lib/gemgento/api/soap/sales/order.rb +249 -0
  365. data/lib/gemgento/api/soap/sales/order_shipment.rb +122 -0
  366. data/lib/gemgento/api/soap/sales/recurring_profile.rb +88 -0
  367. data/lib/gemgento/api/soap/stock_notification.rb +27 -0
  368. data/lib/gemgento/engine.rb +61 -0
  369. data/lib/gemgento/version.rb +3 -0
  370. data/lib/generators/gemgento/assets_generator.rb +11 -0
  371. data/lib/generators/gemgento/install_generator.rb +34 -0
  372. data/lib/generators/gemgento/templates/active_admin.css.scss +1 -0
  373. data/lib/generators/gemgento/templates/active_admin.js.coffee +1 -0
  374. data/lib/generators/gemgento/templates/active_admin.rb +3 -0
  375. data/lib/generators/gemgento/views_generator.rb +10 -0
  376. data/spec/dummy/README.rdoc +28 -0
  377. data/spec/dummy/Rakefile +6 -0
  378. data/spec/dummy/app/assets/images/.keep +0 -0
  379. data/spec/dummy/app/assets/javascripts/application.js +13 -0
  380. data/spec/dummy/app/assets/stylesheets/application.css +15 -0
  381. data/spec/dummy/app/controllers/application_controller.rb +5 -0
  382. data/spec/dummy/app/controllers/concerns/.keep +0 -0
  383. data/spec/dummy/app/helpers/application_helper.rb +2 -0
  384. data/spec/dummy/app/mailers/.keep +0 -0
  385. data/spec/dummy/app/models/.keep +0 -0
  386. data/spec/dummy/app/models/concerns/.keep +0 -0
  387. data/spec/dummy/app/views/layouts/application.html.erb +14 -0
  388. data/spec/dummy/bin/bundle +3 -0
  389. data/spec/dummy/bin/rails +4 -0
  390. data/spec/dummy/bin/rake +4 -0
  391. data/spec/dummy/bin/setup +29 -0
  392. data/spec/dummy/config.ru +4 -0
  393. data/spec/dummy/config/application.rb +32 -0
  394. data/spec/dummy/config/boot.rb +5 -0
  395. data/spec/dummy/config/database.yml +20 -0
  396. data/spec/dummy/config/environment.rb +5 -0
  397. data/spec/dummy/config/environments/development.rb +41 -0
  398. data/spec/dummy/config/environments/production.rb +79 -0
  399. data/spec/dummy/config/environments/test.rb +42 -0
  400. data/spec/dummy/config/gemgento_config.yml +22 -0
  401. data/spec/dummy/config/initializers/assets.rb +11 -0
  402. data/spec/dummy/config/initializers/backtrace_silencers.rb +7 -0
  403. data/spec/dummy/config/initializers/cookies_serializer.rb +3 -0
  404. data/spec/dummy/config/initializers/filter_parameter_logging.rb +4 -0
  405. data/spec/dummy/config/initializers/inflections.rb +16 -0
  406. data/spec/dummy/config/initializers/mime_types.rb +4 -0
  407. data/spec/dummy/config/initializers/session_store.rb +3 -0
  408. data/spec/dummy/config/initializers/wrap_parameters.rb +14 -0
  409. data/spec/dummy/config/locales/en.yml +23 -0
  410. data/spec/dummy/config/routes.rb +4 -0
  411. data/spec/dummy/config/secrets.yml +22 -0
  412. data/spec/dummy/lib/assets/.keep +0 -0
  413. data/spec/dummy/public/404.html +67 -0
  414. data/spec/dummy/public/422.html +67 -0
  415. data/spec/dummy/public/500.html +66 -0
  416. data/spec/dummy/public/favicon.ico +0 -0
  417. data/spec/factories/gemgento/price_tiers.rb +8 -0
  418. data/spec/factories/gemgento/product_attribute_sets.rb +22 -0
  419. data/spec/factories/gemgento/product_attributes.rb +5 -0
  420. data/spec/factories/gemgento/products.rb +14 -0
  421. data/spec/factories/gemgento/stores.rb +12 -0
  422. data/spec/factories/gemgento/user_groups.rb +6 -0
  423. data/spec/factories/gemgento/users.rb +13 -0
  424. data/spec/factories/gemgento_imports.rb +12 -0
  425. data/spec/model/gemgento/price_tier_spec.rb +45 -0
  426. data/spec/rails_helper.rb +55 -0
  427. data/spec/services/gemgento/price_spec.rb +152 -0
  428. data/spec/spec_helper.rb +87 -0
  429. metadata +919 -0
@@ -0,0 +1,50 @@
1
+ module Gemgento
2
+ class CreditCardValidator < ActiveModel::Validator
3
+ def validate(record)
4
+ @record = record
5
+ card_number
6
+ expiration_date
7
+ security_code
8
+ end
9
+
10
+ # Validate credit card number with a Luhn test.
11
+ # Based on http://rosettacode.org/wiki/Luhn_test_of_credit_card_numbers#Ruby
12
+ def card_number
13
+ s1 = s2 = 0
14
+ cc_number = @record.cc_number.gsub(/\D/, '') # remove all white space
15
+
16
+ cc_number.to_s.reverse.chars.each_slice(2) do |odd, even|
17
+ s1 += odd.to_i
18
+
19
+ double = even.to_i * 2
20
+ double -= 9 if double >= 10
21
+ s2 += double
22
+ end
23
+
24
+ if (s1 + s2) % 10 != 0
25
+ @record.errors[:cc_number] << 'is invalid'
26
+ end
27
+ end
28
+
29
+ def expiration_date
30
+ year = @record.cc_exp_year.to_i
31
+ month = @record.cc_exp_month.to_i
32
+
33
+ if year < Time.now.year
34
+ @record.errors[:cc_exp_month] = 'cannot be in the past'
35
+ elsif (year == Time.now.year && month < Time.now.month)
36
+ @record.errors[:cc_exp_month] = 'cannot be in the past'
37
+ end
38
+ end
39
+
40
+ def security_code
41
+ if (@record.cc_cid.length < 3 || @record.cc_cid.length > 4) || # between 3 and 4 digits
42
+ @record.cc_cid.gsub(/\D/, '') != @record.cc_cid || # numbers only
43
+ !(1..9999).include?(@record.cc_cid.to_i)
44
+
45
+ @record.errors[:cc_cid] << 'is invalid'
46
+ end
47
+ end
48
+
49
+ end
50
+ end
@@ -0,0 +1,100 @@
1
+ module Gemgento
2
+ class ImageImportValidator < ActiveModel::Validator
3
+
4
+ def validate(record)
5
+ @record = record
6
+
7
+ begin
8
+ @record.spreadsheet
9
+ rescue Exception => e
10
+ Rails.logger.error e.message
11
+ @record.errors[:file] = 'Invalid Spreadsheet'
12
+ return
13
+ end
14
+
15
+ @record.set_total_rows
16
+ validate_sku
17
+ validate_images
18
+ validate_image_types
19
+ end
20
+
21
+ def validate_sku
22
+ errors = []
23
+
24
+ @record.content_index_range.each do |index|
25
+ row = @record.spreadsheet.row(index)
26
+ sku = row[@record.header_row.index('sku').to_i].to_s.strip
27
+ next if sku.blank?
28
+
29
+ if Gemgento::Product.unscoped.not_deleted.find_by(sku: sku).nil?
30
+ errors << sku
31
+ end
32
+ end
33
+
34
+ unless errors.empty?
35
+ error = '<b>The following SKU(s) could not be found:</b><br /><ul><li>'
36
+ error += errors.join('</li><li>')
37
+ error += '</li></ul>'
38
+
39
+ @record.errors[:file] = "<div>#{error}</div>"
40
+ end
41
+ end
42
+
43
+ def validate_images
44
+ errors = []
45
+
46
+ @record.content_index_range.each do |index|
47
+ row = @record.spreadsheet.row(index)
48
+ file_name_base = row[@record.header_row.index('image').to_i].to_s.strip
49
+ images_found = false
50
+
51
+ @record.image_labels.each do |label|
52
+
53
+ @record.image_file_extensions.each do |extension|
54
+ file_name = @record.image_path + file_name_base + '_' + label + extension
55
+ next unless File.exist?(file_name)
56
+
57
+ images_found = true
58
+ break
59
+ end
60
+
61
+ break if images_found
62
+ end
63
+
64
+ unless images_found
65
+ errors << file_name_base unless errors.include? file_name_base
66
+ end
67
+ end
68
+
69
+ unless errors.empty?
70
+ error = '<b>The following image(s) could not be found:</b><br /><ul><li>'
71
+ error += errors.join('</li><li>')
72
+ error += '</li></ul>'
73
+
74
+ @record.errors[:file] << "<div>#{error}</div>"
75
+ end
76
+ end
77
+
78
+ def validate_image_types
79
+ errors = []
80
+
81
+ @record.image_types.each do |types|
82
+ next if types.empty?
83
+
84
+ types.each do |type|
85
+ asset_type = Gemgento::AssetType.find_by(code: type)
86
+ errors << type if asset_type.nil?
87
+ end
88
+ end
89
+
90
+ unless errors.empty?
91
+ error = '<b>The following image type(s) could not be found:</b><br /><ul><li>'
92
+ error += errors.join('</li><li>')
93
+ error += '</li></ul>'
94
+
95
+ @record.errors[:image_types_raw] << "<div>#{error}</div>"
96
+ end
97
+ end
98
+
99
+ end
100
+ end
@@ -0,0 +1,73 @@
1
+ module Gemgento
2
+ class InventoryImportValidator < ActiveModel::Validator
3
+
4
+ def validate(record)
5
+ @record = record
6
+
7
+ begin
8
+ @record.spreadsheet
9
+ rescue Exception => e
10
+ Rails.logger.error e.message
11
+ @record.errors[:file] = 'Invalid Spreadsheet'
12
+ return
13
+ end
14
+
15
+ validate_required_attributes
16
+ validate_sku
17
+ validate_attributes
18
+ end
19
+
20
+ def validate_required_attributes
21
+ errors = []
22
+ %w[sku quantity manage_stock is_in_stock].each do |attribute|
23
+ errors << attribute unless @record.header_row.include? attribute
24
+ end
25
+
26
+ unless errors.empty?
27
+ error = '<b>The following required attributes could not be found:</b><br /><ul><li>'
28
+ error += errors.join('</li><li>')
29
+ error += '</li></ul>'
30
+
31
+ @record.errors[:file]= "<div>#{error}</div>"
32
+ end
33
+ end
34
+
35
+ def validate_sku
36
+ errors = []
37
+
38
+ @record.content_index_range.each do |index|
39
+ row = @record.spreadsheet.row(index)
40
+ sku = row[@record.header_row.index('sku').to_i].to_s.strip
41
+ next if sku.blank?
42
+
43
+ errors << sku unless product = Gemgento::Product.not_deleted.find_by(sku: sku)
44
+ end
45
+
46
+ unless errors.empty?
47
+ error = '<b>The following SKU(s) could not be found:</b><br /><ul><li>'
48
+ error += errors.join('</li><li>')
49
+ error += '</li></ul>'
50
+
51
+ @record.errors[:file]= "<div>#{error}</div>"
52
+ end
53
+ end
54
+
55
+ def validate_attributes
56
+ errors = []
57
+
58
+ @record.header_row.each do |attribute|
59
+ next if attribute == 'sku'
60
+ errors << attribute unless Gemgento::Inventory.column_names.include? attribute
61
+ end
62
+
63
+ unless errors.empty?
64
+ error = '<b>The following inventory attributes could not be found:</b><br /><ul><li>'
65
+ error += errors.join('</li><li>')
66
+ error += '</li></ul>'
67
+
68
+ @record.errors[:file]= "<div>#{error}</div>"
69
+ end
70
+ end
71
+
72
+ end
73
+ end
@@ -0,0 +1,14 @@
1
+ module Gemgento
2
+ class InventoryValidator < ActiveModel::Validator
3
+
4
+ # Validate LineItem Product inventory levels.
5
+ #
6
+ # @param line_item [Gemgento::LineItem]
7
+ def validate(line_item)
8
+ unless line_item.product.in_stock?(line_item.qty_ordered, line_item.itemizable.store)
9
+ line_item.errors.add(:base, 'Requested quantity is not available')
10
+ end
11
+ end
12
+
13
+ end
14
+ end
@@ -0,0 +1,163 @@
1
+ module Gemgento
2
+ class ProductImportValidator < ActiveModel::Validator
3
+
4
+ def validate(record)
5
+ @record = record
6
+
7
+ begin
8
+ @record.spreadsheet
9
+ rescue Exception => e
10
+ Rails.logger.error e.message
11
+ @record.errors[:file] = 'Invalid Spreadsheet'
12
+ return
13
+ end
14
+
15
+ @record.set_total_rows
16
+
17
+ validate_unique_skus
18
+ validate_required_attribute_codes
19
+ validate_valid_attribute_codes
20
+ validate_categories
21
+ validate_images
22
+ end
23
+
24
+ def validate_unique_skus
25
+ errors = []
26
+ skus = []
27
+
28
+ @record.content_index_range.each do |index|
29
+ row = @record.spreadsheet.row(index)
30
+ sku = row[@record.header_row.index('sku').to_i].to_s.strip
31
+
32
+ next if sku.blank? # skip blank skus
33
+
34
+ if skus.include? sku
35
+ errors << sku
36
+ else
37
+ skus << sku
38
+ end
39
+ end
40
+
41
+ unless errors.empty?
42
+ error = '<b>The following SKU(s) are not unique:</b><br /><ul><li>'
43
+ error += errors.join('</li><li>')
44
+ error += '</li></ul>'
45
+
46
+ @record.errors[:file] = "<div>#{error}</div>"
47
+ end
48
+ end
49
+
50
+ def validate_required_attribute_codes
51
+ errors = []
52
+ required_attributes = %w[magento_type sku status weight]
53
+ (required_attributes << @record.configurable_attributes.pluck(:code)).flatten!
54
+ required_attributes << 'image' if @record.include_images?
55
+
56
+ required_attributes.each do |attribute_code|
57
+ if attribute_code != '' && !attribute_code.nil? && !@record.header_row.include?(attribute_code)
58
+ errors << attribute_code
59
+ end
60
+ end
61
+
62
+ unless errors.empty?
63
+ error = '<b>The following required attribute code(s) were not found:</b><br /><ul><li>'
64
+ error += errors.join('</li><li>')
65
+ error += '</li></ul>'
66
+
67
+ @record.errors[:file] = "<div>#{error}</div>"
68
+ end
69
+ end
70
+
71
+ def validate_valid_attribute_codes
72
+ errors = []
73
+ default_attributes = %w[magento_type sku status image visibility category]
74
+
75
+ @record.header_row.each do |attribute_code|
76
+ next if default_attributes.include? attribute_code
77
+
78
+ unless @record.product_attribute_set.product_attributes.exists?(code: attribute_code)
79
+ errors << attribute_code
80
+ end
81
+ end
82
+
83
+ unless errors.empty?
84
+ error = '<b>The following attribute code(s) are unknown:</b><br /><ul><li>'
85
+ error += errors.join('</li><li>')
86
+ error += '</li></ul>'
87
+
88
+ @record.errors[:file] = "<div>#{error}</div>"
89
+ end
90
+ end
91
+
92
+ def validate_categories
93
+ errors = []
94
+
95
+ @record.content_index_range.each do |index|
96
+ row = @record.spreadsheet.row(index)
97
+ categories = row[@record.header_row.index('category').to_i].to_s.strip.split('&')
98
+
99
+ categories.each do |category_string|
100
+ category_string.strip!
101
+ subcategories = category_string.split('>')
102
+ parent = @record.root_category
103
+
104
+ subcategories.each do |category_url_key|
105
+ category_url_key.strip!
106
+ category = Gemgento::Category.find_by(url_key: category_url_key, parent_id: parent.id)
107
+
108
+ if category.nil?
109
+ errors << category_url_key unless errors.include? category_url_key
110
+ else
111
+ parent = category
112
+ end
113
+ end
114
+ end
115
+ end
116
+
117
+ unless errors.empty? || errors[0] == ""
118
+ error = '<b>The following category url key(s) could not be found:</b><br /><ul><li>'
119
+ error += errors.join('</li><li>')
120
+ error += '</li></ul>'
121
+
122
+ @record.errors[:file] << "<div>#{error}</div>"
123
+ end
124
+ end
125
+
126
+ def validate_images
127
+ return unless @record.include_images?
128
+ errors = []
129
+
130
+ @record.content_index_range.each do |index|
131
+ row = @record.spreadsheet.row(index)
132
+ file_name_base = row[@record.header_row.index('image').to_i].to_s.strip
133
+ images_found = false
134
+
135
+ @record.image_labels.each do |label|
136
+
137
+ @record.image_file_extensions.each do |extension|
138
+ file_name = @record.image_path + file_name_base + '_' + label + extension
139
+ next unless File.exist?(file_name)
140
+
141
+ images_found = true
142
+ break
143
+ end
144
+
145
+ break if images_found
146
+ end
147
+
148
+ unless images_found
149
+ errors << file_name_base unless errors.include? file_name_base
150
+ end
151
+ end
152
+
153
+ unless errors.empty? || errors[0] == ""
154
+ error = '<b>The following image(s) could not be found:</b><br /><ul><li>'
155
+ error += errors.join('</li><li>')
156
+ error += '</li></ul>'
157
+
158
+ @record.errors[:file] << "<div>#{error}</div>"
159
+ end
160
+ end
161
+
162
+ end
163
+ end
@@ -0,0 +1,14 @@
1
+ = form_tag admin_product_positions_update_path, id: 'product-positions-form' do
2
+ = select_tag 'store_id', options_for_select(Gemgento::Store.all.collect { |s| [ s.name, s.id ] }.unshift(['All Stores', nil]), params[:store_id]), id: 'store-select'
3
+ = select_tag 'category_id', options_for_select(Gemgento::Category.active.map { |c| [c.tree_path, c.id] }.sort), id: 'category-select'
4
+ = hidden_field_tag 'products', ''
5
+
6
+ #feed-blocks-wrapper-admin
7
+ %ul#feed-blocks-admin
8
+ - @products.each_with_index do |p|
9
+ - image = Gemgento::Asset.find_by_code(p, 'image') # try to get the base image
10
+ - image = p.assets.first if image.nil? # grab whatever the first image is if we don't have a base
11
+ - unless image.nil?
12
+ = content_tag_for :li, p, data: { 'product-id' => p.id } do
13
+ .feed-block-admin.ui-state-default
14
+ = image_tag p.assets.first.image.url(:small)
@@ -0,0 +1,37 @@
1
+ %section.container
2
+ .row
3
+ .col-sm-12
4
+ = render 'gemgento/user/shared/user_header'
5
+
6
+ %section.container
7
+ .col-sm-6.col-sm-offset-3
8
+ = form_for(resource, as: resource_name, url: registration_path(resource_name), html: { method: :put }) do |f|
9
+
10
+ %legend Password
11
+
12
+ .form-group
13
+ = f.label :email
14
+ = f.email_field :email, autofocus: true, class: "form-control"
15
+
16
+ .form-group
17
+ -if devise_mapping.confirmable? && resource.pending_reconfirmation?
18
+ Currently waiting confirmation for: #{resource.unconfirmed_email}
19
+
20
+ .form-group
21
+ = f.label :password, "New password"
22
+ = f.password_field :password, autocomplete: "off", class: "form-control", placeholder: "********"
23
+
24
+ .form-group
25
+ = f.label :password_confirmation , "New password Confirmation"
26
+ = f.password_field :password_confirmation, autocomplete: "off", class: "form-control", placeholder: "********"
27
+
28
+ .form-group
29
+ = f.label :current_password , "Current Password"
30
+ = f.password_field :current_password, autocomplete: "off", class: "form-control", placeholder: "********"
31
+
32
+ .form-group
33
+ = f.submit "Update", class: "btn"
34
+
35
+ .form-group
36
+ %legend Cancel my account
37
+ = button_to "Cancel my account", registration_path(resource_name), data: { confirm: "Are you sure?" }, method: :delete, class: "btn"