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,48 @@
1
+ module Gemgento
2
+
3
+ # @author Gemgento LLC
4
+ class ProductAttribute < ActiveRecord::Base
5
+ has_and_belongs_to_many :product_attribute_sets, -> { uniq },
6
+ :join_table => 'gemgento_attribute_set_attributes'
7
+ has_and_belongs_to_many :configurable_products, -> { uniq },
8
+ join_table: 'gemgento_configurable_attributes',
9
+ class_name: 'Product'
10
+
11
+ has_many :product_attribute_values
12
+ has_many :product_attribute_options
13
+
14
+ after_save :sync_local_to_magento
15
+
16
+ default_scope -> { where(deleted_at: nil) }
17
+
18
+ def self.ignored
19
+ %w[sku gemgento_id]
20
+ end
21
+
22
+ def mark_deleted
23
+ self.deleted_at = Time.now
24
+ end
25
+
26
+ def mark_deleted!
27
+ mark_deleted
28
+ self.save
29
+ end
30
+
31
+ private
32
+
33
+ # Push local product attribute set changes to Magento
34
+ def sync_local_to_magento
35
+ if self.sync_needed
36
+ if !self.magento_id
37
+ API::SOAP::Catalog::ProductAttribute.create(self)
38
+ else
39
+ API::SOAP::Catalog::ProductAttribute.update(self)
40
+ end
41
+
42
+ self.sync_needed = false
43
+ self.save
44
+ end
45
+ end
46
+
47
+ end
48
+ end
@@ -0,0 +1,39 @@
1
+ module Gemgento
2
+
3
+ # @author Gemgento LLC
4
+ class ProductAttributeOption < ActiveRecord::Base
5
+ belongs_to :product_attribute
6
+ belongs_to :store
7
+
8
+ has_many :product_attribute_values,
9
+ Proc.new { |join_or_model|
10
+ if join_or_model.is_a? ProductAttributeOption
11
+ where(product_attribute_id: join_or_model.product_attribute_id)
12
+ else
13
+ where('gemgento_product_attribute_values.product_attribute_id = gemgento_product_attribute_options.product_attribute_id')
14
+ end
15
+ },
16
+ foreign_key: 'value',
17
+ primary_key: 'value'
18
+ has_many :products, through: :product_attribute_values
19
+
20
+ before_save :sync_local_to_magento, if: -> { sync_needed? }
21
+
22
+ default_scope -> { order(:order) }
23
+
24
+ # Push local attribute option changes to magento.
25
+ #
26
+ # @return [Void]
27
+ def sync_local_to_magento
28
+ response = API::SOAP::Catalog::ProductAttribute.add_option(self, self.product_attribute)
29
+
30
+ if response.success?
31
+ self.sync_needed = false
32
+ return true
33
+ else
34
+ errors.add(:base, response.body[:faultstring])
35
+ return false
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,22 @@
1
+ module Gemgento
2
+
3
+ # @author Gemgento LLC
4
+ class ProductAttributeSet < ActiveRecord::Base
5
+ has_and_belongs_to_many :product_attributes, -> { uniq },
6
+ :join_table => 'gemgento_attribute_set_attributes'
7
+ has_many :products, class_name: 'Gemgento::Product'
8
+ has_many :asset_types, class_name: 'Gemgento::AssetType'
9
+
10
+ default_scope -> { where(deleted_at: nil) }
11
+
12
+ def mark_deleted
13
+ self.deleted_at = Time.now
14
+ end
15
+
16
+ def mark_deleted!
17
+ mark_deleted
18
+ self.save
19
+ end
20
+
21
+ end
22
+ end
@@ -0,0 +1,26 @@
1
+ module Gemgento
2
+
3
+ # @author Gemgento LLC
4
+ class ProductAttributeValue < ActiveRecord::Base
5
+ include Gemgento::ProductTouches
6
+
7
+ belongs_to :product
8
+ belongs_to :product_attribute
9
+ belongs_to :store
10
+ belongs_to :product_attribute_option,
11
+ ->(join_or_model) {
12
+ if join_or_model.is_a? ProductAttributeValue
13
+ where(product_attribute_id: join_or_model.product_attribute_id)
14
+ else
15
+ where('gemgento_product_attribute_options.product_attribute_id = gemgento_product_attribute_values.product_attribute_id')
16
+ end
17
+ },
18
+ foreign_key: 'value',
19
+ primary_key: 'value'
20
+
21
+ default_scope -> { includes(:product_attribute) }
22
+
23
+ validates :product, :product_attribute, :store, presence: true
24
+ validates :product_attribute, uniqueness: { scope: [:product, :store] }
25
+ end
26
+ end
@@ -0,0 +1,34 @@
1
+ module Gemgento
2
+
3
+ # @author Gemgento LLC
4
+ class ProductCategory < ActiveRecord::Base
5
+ include Gemgento::ProductTouches
6
+
7
+ belongs_to :product
8
+ belongs_to :category
9
+ belongs_to :store
10
+
11
+ touch :category, after_touch: :after_touch
12
+
13
+ validates :product, :category, :store, presence: true
14
+ validates :product, uniqueness: { scope: [:category, :store] }
15
+
16
+ default_scope -> { order(:category_id, :position, :product_id, :id) }
17
+
18
+ before_save :update_magento_category_product, if: -> { sync_needed }
19
+
20
+ attr_accessor :sync_needed
21
+
22
+ def update_magento_category_product
23
+ response = API::SOAP::Catalog::Category.update_product(self)
24
+
25
+ if response.success?
26
+ self.sync_needed = false
27
+ return true
28
+ else
29
+ errors.add(:base, response.body[:faultstring])
30
+ return false
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,359 @@
1
+ module Gemgento
2
+
3
+ # @author Gemgento LLC
4
+ class ProductImport < Import
5
+
6
+ NON_ATTRIBUTE_HEADERS = %w(sku status image visibility magento_type category)
7
+
8
+ attr_accessor :simple_products
9
+
10
+ validates_with ProductImportValidator, on: :create
11
+
12
+ def default_options
13
+ {
14
+ image_labels: [],
15
+ image_file_extensions: [],
16
+ image_types: [],
17
+ image_path: nil,
18
+ product_attribute_set_id: nil,
19
+ store_id: nil,
20
+ root_category_id: nil,
21
+ simple_product_visibility: 1,
22
+ configurable_product_visibility: 1,
23
+ set_default_inventory_values: false,
24
+ include_images: false,
25
+ configurable_attribute_ids: []
26
+ }
27
+ end
28
+
29
+ def image_labels_raw
30
+ image_labels.join("\n")
31
+ end
32
+
33
+ def image_labels_raw=(values)
34
+ options[:image_labels] = values.gsub("\r", '').split("\n")
35
+ end
36
+
37
+ def image_file_extensions_raw
38
+ image_file_extensions.join(', ')
39
+ end
40
+
41
+ def image_file_extensions_raw=(values)
42
+ options[:image_file_extensions] = values.gsub(' ', '').split(',')
43
+ end
44
+
45
+ def image_types_raw
46
+ image_types.join("\n")
47
+ end
48
+
49
+ def image_types_raw=(values)
50
+ options[:image_types] = []
51
+ options[:image_types] = values.gsub("\r", '').split("\n").map { |t| t.split(',').collect(&:strip) }
52
+ end
53
+
54
+ def include_images?
55
+ options[:include_images].to_bool
56
+ end
57
+
58
+ def set_default_inventory_values?
59
+ options[:set_default_inventory_values].to_bool
60
+ end
61
+
62
+ # @return [Gemgento::ProductAttributeSet]
63
+ def product_attribute_set
64
+ if options[:product_attribute_set_id].nil?
65
+ nil
66
+ else
67
+ @product_attribute_set ||= Gemgento::ProductAttributeSet.find(options[:product_attribute_set_id])
68
+ end
69
+ end
70
+
71
+ def store
72
+ if options[:store_id].nil?
73
+ nil
74
+ else
75
+ @store ||= Gemgento::Store.find(options[:store_id])
76
+ end
77
+ end
78
+
79
+ def root_category
80
+ if options[:root_category_id].nil?
81
+ nil
82
+ else
83
+ @root_category ||= Gemgento::Category.find(options[:root_category_id])
84
+ end
85
+ end
86
+
87
+ def configurable_attributes
88
+ @configurable_attributes ||= Gemgento::ProductAttribute.where(is_configurable: true, id: options[:configurable_attribute_ids])
89
+ end
90
+
91
+ ### IMPORT PROCESSING ###
92
+
93
+ def process_row
94
+ self.simple_products ||= []
95
+
96
+ if value('magento_type').casecmp('simple') == 0
97
+ process_simple_product
98
+ else
99
+ process_configurable_product
100
+ end
101
+ end
102
+
103
+ def process_simple_product
104
+ simple_product = create_simple_product
105
+
106
+ if simple_product.errors.any?
107
+ self.process_errors << "Row ##{current_row}: #{simple_product.errors.full_messages.join(', ')}"
108
+ else
109
+ self.simple_products << simple_product
110
+ end
111
+ end
112
+
113
+ def process_configurable_product
114
+ configurable_product = create_configurable_product
115
+
116
+ if configurable_product.errors.any?
117
+ self.process_errors << "Row ##{current_row}: #{configurable_product.errors.full_messages.join(', ')}"
118
+ end
119
+
120
+ self.simple_products = []
121
+ end
122
+
123
+ # Create/Update a simple product.
124
+ #
125
+ # @return [Gemgento::Product]
126
+ def create_simple_product
127
+ sku = value('sku')
128
+
129
+ product = Gemgento::Product.not_deleted.find_or_initialize_by(sku: sku)
130
+ product.magento_id = existing_magento_id(sku)
131
+
132
+ product.magento_type = 'simple'
133
+ product.product_attribute_set = self.product_attribute_set
134
+ product.stores << self.store unless product.stores.include?(self.store)
135
+ product.status = value('status', :boolean)
136
+
137
+ unless product.magento_id
138
+ product.sync_needed = false
139
+ product.save
140
+ end
141
+
142
+ product = set_attribute_values(product)
143
+ set_categories(product)
144
+
145
+ product.sync_needed = true
146
+
147
+ if product.save
148
+ create_images(product) if self.include_images?
149
+ set_default_config_inventories(product) if self.set_default_inventory_values?
150
+ end
151
+
152
+ return product
153
+ end
154
+
155
+ # Set product attribute values supplied by spreadsheet.
156
+ #
157
+ # @param product [Gemgento::Product]
158
+ # @return [Gemgento::Product]
159
+ def set_attribute_values(product)
160
+ self.header_row.each do |attribute_code|
161
+ next if NON_ATTRIBUTE_HEADERS.include?(attribute_code)
162
+
163
+ product_attribute = product_attribute_set.product_attributes.find_by!(code: attribute_code)
164
+ value = value(attribute_code)
165
+ value = value.gsub('.0', '') if value.end_with? '.0'
166
+
167
+ if product_attribute.frontend_input == 'select'
168
+ label = value
169
+ attribute_option = product_attribute.product_attribute_options.find_by(label: label, store: self.store)
170
+
171
+ if attribute_option.nil?
172
+ attribute_option = create_attribute_option(product_attribute, label)
173
+ end
174
+
175
+ value = attribute_option.nil? ? nil : attribute_option.value
176
+ end
177
+
178
+ if value.nil?
179
+ self.process_errors << "Row #{current_row}: Unknown attribute value '#{value(attribute_code)}' for code '#{attribute_code}'"
180
+ else
181
+ product.set_attribute_value(product_attribute.code, value, self.store)
182
+ end
183
+ end
184
+
185
+ product = set_default_attribute_values(product)
186
+
187
+ return product
188
+ end
189
+
190
+ # Create a new ProductAttributeOption.
191
+ #
192
+ # @param product_attribute [Gemgento::ProductAttribute]
193
+ # @param option_label [String]
194
+ # @return [Gemgento::ProductAttributeOption]
195
+ def create_attribute_option(product_attribute, option_label)
196
+ attribute_option = Gemgento::ProductAttributeOption.new
197
+ attribute_option.product_attribute = product_attribute
198
+ attribute_option.label = option_label
199
+ attribute_option.store = self.store
200
+ attribute_option.sync_local_to_magento
201
+
202
+ return Gemgento::ProductAttributeOption.find_by(product_attribute: product_attribute, label: option_label, store: self.store)
203
+ end
204
+
205
+ # Set default attribute values based on options and missing values.
206
+ #
207
+ # @param product [Gemgento::Product]
208
+ # @return [Gemgento::Product]
209
+ def set_default_attribute_values(product)
210
+ product.status = 1 if product.status.nil?
211
+ product.visibility = self.simple_product_visibility.to_i
212
+
213
+ if product.url_key.nil?
214
+ url_key = product.name.to_s.strip.gsub(' ', '-').gsub(/[^\w\s]/, '').downcase
215
+ product.set_attribute_value('url_key', url_key)
216
+ end
217
+
218
+ return product
219
+ end
220
+
221
+ # Associate Product with Categories.
222
+ #
223
+ # @param product [Gemgento::Product]
224
+ # @return [void]
225
+ def set_categories(product)
226
+ categories = value('category').split('&')
227
+
228
+ categories.each do |category_string|
229
+ category_string.strip!
230
+ subcategories = category_string.split('>')
231
+ parent_id = self.root_category.id
232
+
233
+ subcategories.each do |category_url_key|
234
+ category_url_key.strip!
235
+ category = Gemgento::Category.find_by(url_key: category_url_key, parent_id: parent_id)
236
+
237
+ unless category.nil?
238
+ Gemgento::ProductCategory.find_or_create_by!(category: category, product: product, store: self.store)
239
+ parent_id = category.id
240
+ else
241
+ self.process_errors << "Row ##{@index}: Unknown category url key '#{category_url_key}' - skipped"
242
+ end
243
+ end
244
+ end
245
+ end
246
+
247
+ # Find and create all images for a Product.
248
+ #
249
+ # @param product [Gemgento::Product]
250
+ # @return [void]
251
+ def create_images(product)
252
+ self.image_labels.each_with_index do |label, position|
253
+
254
+ self.image_file_extensions.each do |extension|
255
+ file_name = self.image_path + value('image') + '_' + label + extension
256
+ next unless File.exist?(file_name)
257
+
258
+ types = []
259
+
260
+ unless self.image_types[position].nil?
261
+ types = product_attribute_set.asset_types.where(code: self.image_types[position].split(',').map(&:strip))
262
+ end
263
+
264
+ image = Asset.new
265
+ image.product = product
266
+ image.store = self.store
267
+ image.position = position
268
+ image.label = label
269
+ image.set_file(File.open(file_name))
270
+
271
+ types.each do |type|
272
+ image.asset_types << type
273
+ end
274
+
275
+ # save without sync to format with paperclip
276
+ image.sync_needed = false
277
+ image.save
278
+
279
+ # save with sync to push to magento
280
+ image.sync_needed = true
281
+ image.save
282
+ end
283
+ end
284
+ end
285
+
286
+ # Create/Update a configurable product.
287
+ #
288
+ # @return [Gemgento::Product]
289
+ def create_configurable_product
290
+ sku = value('sku')
291
+
292
+ # set the default configurable product attributes
293
+ configurable_product = Gemgento::Product.not_deleted.find_or_initialize_by(sku: sku)
294
+ configurable_product.magento_id = existing_magento_id(sku)
295
+
296
+ configurable_product.magento_type = 'configurable'
297
+ configurable_product.product_attribute_set = product_attribute_set
298
+ configurable_product.status = value('status', :boolean)
299
+ configurable_product.stores << store unless configurable_product.stores.include?(store)
300
+ configurable_product.sync_needed = false
301
+ configurable_product.save
302
+
303
+ # add the configurable attributes
304
+ configurable_attributes.each do |configurable_attribute|
305
+ configurable_product.configurable_attributes << configurable_attribute unless configurable_product.configurable_attributes.include? configurable_attribute
306
+ end
307
+
308
+ # associate all simple products with the new configurable product
309
+ self.simple_products.each do |simple_product|
310
+ configurable_product.simple_products << simple_product unless configurable_product.simple_products.include?(simple_product)
311
+ end
312
+
313
+ # set the additional configurable product details
314
+ set_attribute_values(configurable_product)
315
+ set_categories(configurable_product)
316
+
317
+ configurable_product.visibility = self.configurable_product_visibility.to_i
318
+ configurable_product.sync_needed = true
319
+
320
+ if configurable_product.save
321
+ # add the images
322
+ create_images(configurable_product) if include_images?
323
+ set_default_config_inventories(configurable_product) if self.set_default_inventory_values?
324
+ end
325
+
326
+ return configurable_product
327
+ end
328
+
329
+ # @param product [Gemgento::Product]
330
+ # @return [void]
331
+ def set_default_config_inventories(product)
332
+ inventory = product.inventories.find_or_initialize_by(store: self.store)
333
+ inventory.use_config_manage_stock = true
334
+ inventory.use_config_backorders = true
335
+ inventory.use_config_min_qty = true
336
+ inventory.sync_needed = true
337
+ inventory.save
338
+ rescue ActiveRecord::RecordNotUnique
339
+ # when Magento pushes inventory data back, it will create missing inventory rows
340
+ set_default_config_inventories(product)
341
+ end
342
+
343
+ # Look for existing magento_id based on sku
344
+ #
345
+ # @param sku [String]
346
+ # @return [Integer, nil]
347
+ def existing_magento_id(sku)
348
+ magento_id = nil
349
+
350
+ if magento_product = Magento::ProductAdapter.find_by(sku: sku)
351
+ magento_id = magento_product[:product_id].to_i
352
+ magento_id = nil unless magento_id > 0
353
+ end
354
+
355
+ return magento_id
356
+ end
357
+
358
+ end
359
+ end