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,250 @@
1
+ module Gemgento::Adapter::Sellect
2
+ class Product < ActiveRecord::Base
3
+ establish_connection("sellect_#{Rails.env}".to_sym) if Gemgento::Config[:sellect]
4
+
5
+ def self.import(currency = 'usd', app_root = '/Users/Kevin/Sites/victoria_beckham_sites/vb_old/')
6
+ #TODO: Unmapped attributes - color, hex_color, available_on, tax_category_id, shipping_category_id, on_sale, sale_price, model_name, size_pictured, product_details, count_on_hand, style_color, is_representative_color, season_id
7
+ self.table_name = 'sellect_products'
8
+
9
+ self.where('deleted_at IS NULL').each do |sellect_product|
10
+ import_configurable_product(currency, app_root, sellect_product)
11
+ end
12
+ end
13
+
14
+ def self.import_configurable_product(sellect_product, currency, app_root)
15
+ product = Gemgento::Product.not_deleted.configurable.find_or_initialize_by(sku: sellect_product.sku)
16
+
17
+ product.magento_type = 'configurable'
18
+ product.sku = sellect_product.sku
19
+ product.status = 1
20
+ product.product_attribute_set = Gemgento::ProductAttributeSet.first
21
+ product.visibility = 4
22
+ product.sync_needed = false
23
+ product.save
24
+
25
+ product.set_attribute_value('name', sellect_product.name)
26
+ product.set_attribute_value('short_description', sellect_product.description)
27
+ product.set_attribute_value('url_key', sellect_product.permalink)
28
+ product.set_attribute_value('meta_description', sellect_product.meta_description)
29
+ product.set_attribute_value('meta_keyword', sellect_product.meta_keywords)
30
+ product.set_attribute_value('description', sellect_product.detail_description)
31
+ product.set_attribute_value('style_code', sellect_product.style)
32
+
33
+ product.stores << Gemgento::Store.current unless product.stores.include? Gemgento::Store.current
34
+
35
+ set_categories(sellect_product.id, product)
36
+
37
+ simple_products = import_simple_products(sellect_product.id, product, app_root, currency)
38
+
39
+ if simple_products.size <= 1 # if one or less simple products, the configurable is not needed
40
+ product.destroy
41
+ else # configurable is needed, set configurable attrbitues and simple products
42
+ set_configurable_attribute(product, 'size')
43
+ set_configurable_attribute(product, 'color')
44
+
45
+ simple_products.each do |simple_product|
46
+ product.simple_products << simple_product unless product.simple_products.include?(simple_product)
47
+ end
48
+
49
+ product.sync_needed = true
50
+ product.save
51
+
52
+ create_configurable_images(product)
53
+ end
54
+ end
55
+
56
+ def self.import_simple_products(sellect_id, configurable_product, app_root, currency = 'usd')
57
+ self.table_name = 'sellect_variants'
58
+
59
+ simple_products = []
60
+ upc = Gemgento::ProductAttribute.find_by(code: 'upc')
61
+ raise "Missing required product attribute 'UPC'" if upc.nil?
62
+
63
+ sellect_variants = self.where('product_id = ?', sellect_id)
64
+
65
+ sellect_variants.each do |sellect_variant|
66
+ product = Gemgento::Product.not_deleted.simple.filter({ attribute: upc, value: sellect_variant.upc }).first_or_initialize
67
+ product.magento_type = 'simple'
68
+ product.status = 1
69
+ product.visibility = sellect_variants.size > 1 ? 1 : 4
70
+ product.product_attribute_set = configurable_product.product_attribute_set
71
+ product.sync_needed = false
72
+ product.save
73
+
74
+ product.set_attribute_value('name', configurable_product.name)
75
+ product.set_attribute_value('short_description', configurable_product.description)
76
+ product.set_attribute_value('url_key', configurable_product.url_key)
77
+ product.set_attribute_value('meta_description', configurable_product.meta_description)
78
+ product.set_attribute_value('meta_keyword', configurable_product.meta_keyword)
79
+ product.set_attribute_value('description', configurable_product.description)
80
+ product.set_attribute_value('style_code', configurable_product.style_code)
81
+ product.set_attribute_value('upc', sellect_variant.upc)
82
+ product.set_attribute_value('weight', sellect_variant.weight.nil? ? 0 : sellect_variant.weight)
83
+ product.set_attribute_value('price', get_price(sellect_variant.id, currency))
84
+ product.stores << Gemgento::Store.current unless product.stores.include? Gemgento::Store.current
85
+ product.categories = configurable_product.categories
86
+ product.sync_needed = false
87
+ product.save
88
+
89
+ set_option_values(sellect_variant.id, product)
90
+
91
+ product.sku = "#{sellect_variant.sku}_#{product.size}"
92
+
93
+ product.sync_needed = true
94
+ product.save
95
+
96
+ set_assets(sellect_variant, product, app_root)
97
+
98
+ simple_products << product
99
+ end
100
+
101
+ return simple_products
102
+ end
103
+
104
+ def self.set_option_values(sellect_id, product)
105
+ self.table_name = 'sellect_option_types'
106
+
107
+ self.all.each do |option|
108
+ attribute = Gemgento::ProductAttribute.find_by(code: option.name.downcase)
109
+ label = get_option_label(option.id, sellect_id)
110
+ label = '' if label.nil?
111
+
112
+ attribute_option = Gemgento::ProductAttributeOption.find_by(product_attribute_id: attribute.id, label: label)
113
+
114
+ if attribute_option.nil?
115
+ attribute_option = create_attribute_option(attribute, label)
116
+ end
117
+
118
+ product.set_attribute_value(attribute.code, attribute_option.value)
119
+ product.sync_needed = false
120
+ product.save
121
+ end
122
+ end
123
+
124
+ def self.get_option_label(option_id, variant_id)
125
+ self.table_name = 'sellect_option_values'
126
+ option_value = self.joins(ActiveRecord::Base.escape_sql(
127
+ 'INNER JOIN sellect_option_values_variants ON sellect_option_values_variants.option_value_id = sellect_option_values.id ' +
128
+ 'AND sellect_option_values.option_type_id = ? AND sellect_option_values_variants.variant_id = ?',
129
+ option_id,
130
+ variant_id
131
+ )).first
132
+
133
+ return option_value.name
134
+ end
135
+
136
+ def self.create_attribute_option(product_attribute, option_label)
137
+ attribute_option = Gemgento::ProductAttributeOption.new
138
+ attribute_option.product_attribute = product_attribute
139
+ attribute_option.label = option_label
140
+ attribute_option.store = Gemgento::Store.current
141
+ attribute_option.sync_needed = false
142
+ attribute_option.save
143
+
144
+ attribute_option.sync_needed = true
145
+ attribute_option.sync_local_to_magento
146
+ attribute_option.destroy
147
+
148
+ return Gemgento::ProductAttributeOption.where(product_attribute: product_attribute, label: option_label).first
149
+ end
150
+
151
+ def self.set_assets(sellect_product, gemgento_product, app_root)
152
+ self.inheritance_column = :_type_disabled
153
+ self.table_name = 'sellect_assets'
154
+
155
+ self.where(viewable_id: sellect_product.id, viewable_type: 'Sellect::Variant').each do |sellect_asset|
156
+ file = "#{app_root}/#{sellect_asset.id}/original/#{sellect_asset.attachment_file_name}"
157
+
158
+ if File.exist?(file)
159
+ image = Gemgento::Asset.new
160
+
161
+ Gemgento::Asset.unscoped do
162
+ gemgento_product.assets.reload.each do |asset|
163
+ if !asset.asset_file.nil? && FileUtils.compare_file(asset.asset_file.file.path(:original), file)
164
+ image = asset
165
+ break
166
+ end
167
+ end
168
+ end
169
+
170
+ image.product = gemgento_product
171
+ image.store = Gemgento::Store.current
172
+ image.position = sellect_asset.position
173
+ image.label = sellect_asset.alt
174
+ image.set_file(File.open(file))
175
+ image.asset_types << Gemgento::AssetType.all
176
+ image.sync_needed = false
177
+ image.save
178
+
179
+ image.sync_needed = true
180
+ image.save
181
+
182
+ image
183
+ end
184
+ end
185
+ end
186
+
187
+ def self.get_price(variant_id, currency)
188
+ self.table_name = 'sellect_pricings'
189
+
190
+ pricing = self.where('variant_id = ? AND currency LIKE ?', variant_id, currency).first
191
+
192
+ if pricing.nil?
193
+ return nil
194
+ else
195
+ return pricing.price
196
+ end
197
+ end
198
+
199
+ def self.set_categories(product_id, product)
200
+ self.table_name = 'sellect_product_categories'
201
+
202
+ self.joins(ActiveRecord::Base.escape_sql(
203
+ 'INNER JOIN sellect_product_positions ON sellect_product_positions.product_category_id = sellect_product_categories.id ' +
204
+ 'AND sellect_product_positions.product_id = ?',
205
+ product_id
206
+ )).each do |sellect_category|
207
+ categories = Gemgento::Category.where(url_key: sellect_category.permalink)
208
+
209
+ categories.each do |category|
210
+ product.categories << category unless product.categories.include? category
211
+ end
212
+ end
213
+ end
214
+
215
+ def self.set_configurable_attribute(product, attribute_code)
216
+ attribute = Gemgento::ProductAttribute.find_by(code: attribute_code)
217
+ product.configurable_attributes << attribute unless product.configurable_attributes.include?(attribute)
218
+ end
219
+
220
+ def self.create_configurable_images(configurable_product)
221
+ default_product = configurable_product.simple_products.first
222
+
223
+ default_product.assets.each do |asset|
224
+
225
+ asset_copy = Gemgento::Asset.new
226
+
227
+ configurable_product.assets.where(store: Gemgento::Store.current).each do |existing_configurable_asset|
228
+ if !existing_configurable_asset.asset_file.nil? && FileUtils.compare_file(existing_configurable_asset.asset_file.file.path(:original), asset.asset_file.file.path(:original))
229
+ asset_copy = existing_configurable_asset
230
+ break
231
+ end
232
+ end
233
+
234
+ asset_copy.product = configurable_product
235
+ asset_copy.store = asset.store
236
+ asset_copy.set_file(File.open(asset.asset_file.file.path(:original)))
237
+ asset_copy.label = asset.label
238
+ asset_copy.position = asset.position
239
+ asset_copy.asset_types = asset.asset_types
240
+
241
+ asset_copy.sync_needed = false
242
+ asset_copy.save
243
+
244
+ asset_copy.sync_needed = true
245
+ asset_copy.save
246
+ end
247
+ end
248
+
249
+ end
250
+ end
@@ -0,0 +1,16 @@
1
+ module Gemgento::Adapter
2
+ class SellectAdapter < ActiveRecord::Base
3
+ establish_connection("sellect_#{Rails.env}".to_sym) if Gemgento::Config[:sellect]
4
+
5
+ def self.query(table_name)
6
+ self.table_name = table_name
7
+ return self
8
+ end
9
+
10
+ def self.import(store, currency)
11
+ Gemgento::Store.current = store
12
+ Gemgento::Adapter::Sellect::Product.import(currency)
13
+ end
14
+
15
+ end
16
+ end
@@ -0,0 +1,40 @@
1
+ module Gemgento::Adapter::Shopify
2
+ class Address
3
+
4
+ # Import Shopify address to Gemgento
5
+ #
6
+ # @param address [ShopifyAPI::Address]
7
+ # @param user [Gemgento::User]
8
+ # @param skip_existing[Boolean]
9
+ # @return [Gemgento::Address]
10
+ def self.import(shopify_address, user, skip_existing = false)
11
+ if shopify_adapter = Gemgento::Adapter::ShopifyAdapter.find_by_shopify_model(shopify_address)
12
+ address = shopify_adapter.gemgento_model
13
+ return address if skip_existing
14
+ else
15
+ address = Gemgento::Address.new
16
+ end
17
+
18
+ address.addressable = user
19
+ address.address1 = shopify_address.address1
20
+ address.address2 = shopify_address.address2
21
+ address.city = shopify_address.city
22
+ address.company = shopify_address.company
23
+ address.country = Gemgento::Country.find_by(iso2_code: shopify_address.country_code)
24
+ address.first_name = shopify_address.first_name
25
+ address.last_name = shopify_address.last_name
26
+ address.telephone = shopify_address.phone
27
+ address.region = Gemgento::Region.find_by(code: shopify_address.province_code)
28
+ address.postcode = shopify_address.zip
29
+ address.is_billing = shopify_address.default ? true : false
30
+ address.is_shipping = shopify_address.default ? true : false
31
+ address.sync_needed = true
32
+ address.save
33
+
34
+ Gemgento::Adapter::ShopifyAdapter.create_association(address, shopify_address) if address.shopify_adapter.nil?
35
+
36
+ return address
37
+ end
38
+
39
+ end
40
+ end
@@ -0,0 +1,51 @@
1
+ require 'shopify_api'
2
+
3
+ module Gemgento::Adapter::Shopify
4
+ class Category
5
+
6
+ # Import all Shopify collections.
7
+ #
8
+ # @return [void]
9
+ def self.import
10
+ page = 1
11
+ ShopifyAPI::Base.site = Gemgento::Adapter::ShopifyAdapter.api_url
12
+ shopify_collections = ShopifyAPI::CustomCollection.where(limit: 250, page: page)
13
+
14
+ while shopify_collections.any?
15
+ shopify_collections.each do |collection|
16
+ sync_shopify_category(collection)
17
+ end
18
+
19
+ page = page + 1
20
+ shopify_collections = ShopifyAPI::CustomCollection.where(limit: 250, page: page)
21
+ end
22
+ end
23
+
24
+ # Create Gemgento::Category from Shopify collection.
25
+ #
26
+ # @param collection [ShopifyAPI::CustomCollection]
27
+ # @return [Gemgento::Category]
28
+ def self.sync_shopify_category(collection)
29
+ if shopify_adapter = Gemgento::Adapter::ShopifyAdapter.find_by_shopify_model(collection)
30
+ category = shopify_adapter.gemgento_model
31
+ else
32
+ category = Gemgento::Category.new
33
+ end
34
+
35
+ category.url_key = collection.handle
36
+ category.name = collection.title
37
+ category.parent = Gemgento::Category.root
38
+ category.image = URI.parse(collection.image) if collection.has_attribute? :image
39
+ category.is_active = collection.published_at ? true : false
40
+ category.include_in_menu = false
41
+ category.stores = Gemgento::Store.where.not(code: 'admin')
42
+ category.sync_needed = true
43
+ category.save
44
+
45
+ Gemgento::Adapter::ShopifyAdapter.create_association(category, collection)
46
+
47
+ return category
48
+ end
49
+
50
+ end
51
+ end
@@ -0,0 +1,66 @@
1
+ require 'shopify_api'
2
+
3
+ module Gemgento::Adapter::Shopify
4
+ class Customer
5
+
6
+ # Import all customers from Shopify.
7
+ #
8
+ # @param skip_existing [Boolean]
9
+ # @return [Void]
10
+ def self.import(skip_existing = false)
11
+ page = 1
12
+ ShopifyAPI::Base.site = Gemgento::Adapter::ShopifyAdapter.api_url
13
+
14
+ shopify_customers = ShopifyAPI::Customer.where(limit: 250, page: page)
15
+
16
+ while shopify_customers.any?
17
+ shopify_customers.each do |customer|
18
+ user = create_user(customer, skip_existing)
19
+ create_addresses(customer, user, skip_existing)
20
+ end
21
+
22
+ page = page + 1
23
+ shopify_customers = ShopifyAPI::Customer.where(limit: 250, page: page)
24
+ end
25
+ end
26
+
27
+ # Create a user from Shopify customer.
28
+ #
29
+ # @param shopify_customer [ShopifyAPI::Customer]
30
+ # @param skip_existing [Boolean]
31
+ # @return [Gemgento::User]
32
+ def self.create_user(shopify_customer, skip_existing)
33
+ if shopify_adapter = Gemgento::Adapter::ShopifyAdapter.find_by_shopify_model(shopify_customer)
34
+ user = shopify_adapter.gemgento_model
35
+ return user if skip_existing && !user.magento_id.nil?
36
+ else
37
+ user = Gemgento::User.new
38
+ end
39
+
40
+ user.email = shopify_customer.email
41
+ user.first_name = shopify_customer.first_name
42
+ user.last_name = shopify_customer.last_name
43
+ user.user_group = Gemgento::UserGroup.find_by(code: 'General')
44
+ user.stores = Gemgento::Store.all
45
+ user.sync_needed = true
46
+ user.save validate: false
47
+
48
+ Gemgento::Adapter::ShopifyAdapter.create_association(user, shopify_customer)
49
+
50
+ return user
51
+ end
52
+
53
+ # Import all addresses for a shopify customer.
54
+ #
55
+ # @param shopify_customer [ShopifyAPI::Customer]
56
+ # @param user [Gemgento::User]
57
+ # @param skip_existing [Boolean]
58
+ # @return [Void]
59
+ def self.create_addresses(shopify_customer, user, skip_existing)
60
+ shopify_customer.addresses.each do |shopify_address|
61
+ Gemgento::Adapter::Shopify::Address.import(shopify_address, user, skip_existing)
62
+ end
63
+ end
64
+
65
+ end
66
+ end
@@ -0,0 +1,334 @@
1
+ require 'csv'
2
+ require 'shopify_api'
3
+
4
+ module Gemgento::Adapter::Shopify
5
+ class Order
6
+
7
+ # Export all shopify orders to a CSV.
8
+ #
9
+ # @return [Void]
10
+ def self.export
11
+ ShopifyAPI::Base.site = Gemgento::Adapter::ShopifyAdapter.api_url
12
+ page = 1
13
+ shopify_orders = ShopifyAPI::Order.where(limit: 250, page: page)
14
+
15
+ CSV.open('orders.csv', 'wb') do |csv|
16
+ csv << order_export_headers
17
+
18
+ while shopify_orders.any?
19
+ shopify_orders.each do |shopify_order|
20
+ csv << order_row(shopify_order)
21
+ end
22
+
23
+ page = page + 1
24
+ shopify_orders = ShopifyAPI::Order.where(limit: 250, page: page)
25
+ end
26
+ end
27
+ end
28
+
29
+ # Generate CSV headers for an order export.
30
+ #
31
+ # @return [Array(String)]
32
+ def self.order_export_headers
33
+ %w[
34
+ order_id website email password group_id store_id payment_method shipping_method
35
+ billing_prefix billing_firstname billing_middlename billing_lastname billing_suffix
36
+ billing_street_full billing_city billing_region billing_country billing_postcode
37
+ billing_telephone billing_company billing_fax shipping_prefix shipping_firstname
38
+ shipping_middlename shipping_lastname shipping_suffix shipping_street_full shipping_city
39
+ shipping_region shipping_country shipping_postcode shipping_telephone shipping_company
40
+ shipping_fax created_in is_subscribed customer_id created_at updated_at tax_amount
41
+ shipping_amount discount_amount subtotal grand_total total_paid total_refunded
42
+ total_qty_ordered total_canceled total_invoiced total_online_refunded total_offline_refunded
43
+ base_tax_amount base_shipping_amount base_discount_amount base_subtotal base_grand_total
44
+ base_total_paid base_total_refunded base_total_qty_ordered base_total_canceled base_total_invoiced
45
+ base_total_online_refunded base_total_offline_refunded subtotal_refunded subtotal_canceled
46
+ discount_refunded discount_invoiced tax_refunded tax_canceled shipping_refunded shipping_canceled
47
+ base_subtotal_refunded base_subtotal_canceled base_discount_refunded base_discount_canceled
48
+ base_discount_invoiced base_tax_refunded base_tax_canceled base_shipping_refunded
49
+ base_shipping_canceled subtotal_invoiced tax_invoiced shipping_invoiced base_subtotal_invoiced
50
+ base_tax_invoiced base_shipping_invoiced shipping_tax_amount base_shipping_tax_amount
51
+ shipping_tax_refunded base_shipping_tax_refunded products_ordered order_status
52
+ ]
53
+ end
54
+
55
+ # Create a row for the given order.
56
+ #
57
+ # @param order [ShopifyAPI::Order]
58
+ # @return [Array(String)]
59
+ def self.order_row(order)
60
+ user = Gemgento::User.find_by(email: order.email)
61
+ store = store(order)
62
+
63
+ begin
64
+ shipping_address = order.shipping_address
65
+ rescue
66
+ shipping_address = nil
67
+ end
68
+
69
+ begin
70
+ billing_address = order.billing_address
71
+ rescue
72
+ billing_address = nil
73
+ end
74
+
75
+ totals = totals(order)
76
+ line_items = order.line_items
77
+
78
+ [
79
+ order.order_number, # order_id
80
+ store.code, # website
81
+ order.email, # email
82
+ '', # password
83
+ user_group(user), # group_id
84
+ store.magento_id, # store_id
85
+ 'payment_cryozonic_stripe', # payment_method
86
+ 'flatrate_flatrate', # shipping_method
87
+ '', # billing_prefix
88
+ (billing_address ? billing_address.first_name : ''), # billing_firstname
89
+ '', # billing_middlename
90
+ (billing_address ? billing_address.last_name : ''), # billing_lastname
91
+ '', # billing_suffix
92
+ (billing_address ? street(billing_address) : ''), # billing_street_full
93
+ (billing_address ? billing_address.city : ''), # billing_city
94
+ (billing_address ? billing_address.province : ''), # billing_region
95
+ (billing_address ? billing_address.country : ''), # billing_country
96
+ (billing_address ? billing_address.zip : ''), # billing_postcode
97
+ (billing_address ? billing_address.phone : ''), # billing_telephone
98
+ (billing_address ? billing_address.company : ''), # billing_company
99
+ '', # billing_fax
100
+ '', # shipping_prefix
101
+ (shipping_address ? shipping_address.first_name : ''), # shipping_firstname
102
+ '', # shipping_middlename
103
+ (shipping_address ? shipping_address.last_name : ''), # shipping_lastname
104
+ '', # shipping_suffix
105
+ (shipping_address ? street(shipping_address) : ''), # shipping_street_full
106
+ (shipping_address ? shipping_address.city : ''), # shipping_city
107
+ (shipping_address ? shipping_address.province : ''), # shipping_region
108
+ (shipping_address ? shipping_address.country : ''), # shipping_country
109
+ (shipping_address ? shipping_address.zip : ''), # shipping_postcode
110
+ (shipping_address ? shipping_address.phone : ''), # shipping_telephone
111
+ (shipping_address ? shipping_address.company : ''), # shipping_company
112
+ '', # shipping_fax
113
+ store.name, # created_in
114
+ (order.buyer_accepts_marketing ? 1 : 0), # is_subscribed
115
+ (user.nil? ? nil : user.magento_id), # customer_id
116
+ order.created_at, # created_at
117
+ order.updated_at, # updated_at
118
+ totals[:tax], # tax_amount
119
+ totals[:shipping], # shipping_amount
120
+ totals[:discount], # discount_amount
121
+ totals[:subtotal], # subtotal
122
+ totals[:grand], # grand_total
123
+ totals[:paid], # total_paid
124
+ totals[:refunded], # total_refunded
125
+ quantity_ordered(order), # total_qty_ordered
126
+ totals[:canceled], # total_canceled
127
+ totals[:grand], # total_invoiced
128
+ totals[:refunded], # total_online_refunded
129
+ 0, # total_offline_refunded
130
+ totals[:tax], # base_tax_amount
131
+ totals[:shipping], # base_shipping_amount
132
+ totals[:discount], # base_discount_amount
133
+ totals[:subtotal], # base_subtotal
134
+ totals[:grand], # base_grand_total
135
+ totals[:paid], # base_total_paid
136
+ totals[:refunded], # base_total_refunded
137
+ quantity_ordered(order), # base_total_qty_ordered
138
+ totals[:canceled], # base_total_canceled
139
+ totals[:grand], # base_total_invoiced
140
+ totals[:refunded], # base_total_online_refunded
141
+ 0, # base_total_offline_refunded
142
+ totals[:refunded], # subtotal_refunded
143
+ totals[:canceled], # subtotal_canceled
144
+ 0, # discount_refunded
145
+ 0, # discount_invoiced
146
+ 0, # tax_refunded
147
+ 0, # tax_canceled
148
+ 0, # shipping_refunded
149
+ 0, # shipping_canceled
150
+ totals[:refunded], # base_subtotal_refunded
151
+ totals[:canceled], # base_subtotal_canceled
152
+ 0, # base_discount_refunded
153
+ 0, # base_discount_canceled
154
+ 0, # base_discount_invoiced
155
+ 0, # base_tax_refunded
156
+ 0, # base_tax_canceled
157
+ 0, # base_shipping_refunded
158
+ 0, # base_shipping_canceled
159
+ totals[:subtotal], # subtotal_invoiced
160
+ totals[:tax], # tax_invoiced
161
+ totals[:shipping], # shipping_invoiced
162
+ totals[:subtotal], # base_subtotal_invoiced
163
+ totals[:tax], # base_tax_invoiced
164
+ totals[:shipping], # base_shipping_invoiced
165
+ 0, # shipping_tax_amount
166
+ 0, # base_shipping_tax_amount
167
+ 0, # shipping_tax_refunded
168
+ 0, # base_shipping_tax_refunded
169
+ products_ordered(line_items, store), # products_ordered
170
+ order_status(order) # order_status
171
+ ]
172
+ end
173
+
174
+ # Retrieve the store related to the order.
175
+ #
176
+ # @param order [ShopifyAPI::Order]
177
+ # @return [Gemgento::Store]
178
+ def self.store(order)
179
+ return Gemgento::Store.current
180
+ end
181
+
182
+ # Calculate the various totals for an order.
183
+ #
184
+ # @param [ShopifyAPI::Order]
185
+ # @return [Hash(Double)]
186
+ def self.totals(order)
187
+ totals = {}
188
+ totals[:subtotal] = order.subtotal_price
189
+ totals[:tax] = order.total_tax
190
+ totals[:shipping] = shipping_amount(order)
191
+ totals[:discount] = order.total_discounts
192
+ totals[:grand] = order.total_price
193
+ totals[:refunded] = refund_amount(order)
194
+ totals[:paid] = paid_amount(order)
195
+ totals[:canceled] = (order.financial_status == 'voided') ? totals[:paid] : 0.0
196
+
197
+ return totals
198
+ end
199
+
200
+ # Get the user group from the provided user. Default to NOT LOGGED IN.
201
+ #
202
+ # @param user [Gemgento::User, nil]
203
+ # @return [String]
204
+ def self.user_group(user)
205
+ if user.nil?
206
+ return Gemgento::UserGroup.find_by(magento_id: 0).code
207
+ else
208
+ return user.user_group.code
209
+ end
210
+ end
211
+
212
+ # Get a formatted street attribute from an address.
213
+ #
214
+ # @param address [ShopifyAPI::ShippingAddress, ShopifyAPI::BillingAddress]
215
+ # @return [String]
216
+ def self.street(address)
217
+ street = address.address1
218
+ street = "#{street}\n#{address.address2}" unless address.address2.blank?
219
+
220
+ return street
221
+ end
222
+
223
+ # Calculate the amount paid for an order.
224
+ #
225
+ # @param order [ShopifyAPI::Order]
226
+ # @return [Float]
227
+ def self.paid_amount(order)
228
+ return order.total_price if order.financial_status == 'paid'
229
+
230
+ begin
231
+ total = 0.0
232
+
233
+ order.transactions.each do |transaction|
234
+ total = total + transaction.amount.to_f if (transaction.kind == 'capture' && transaction.status == 'success')
235
+ end
236
+
237
+ return total
238
+ rescue
239
+ return 0.0
240
+ end
241
+ end
242
+
243
+ # Calculate total shipping cost for shopify order.
244
+ #
245
+ # @param order [ShopifyAPI::Order]
246
+ # @return [Float]
247
+ def self.shipping_amount(order)
248
+ total = 0.0
249
+
250
+ order.shipping_lines.each do |shipping_line|
251
+ total = total + shipping_line.price.to_f
252
+ end
253
+
254
+ return total
255
+ end
256
+
257
+ # Calculate the total amount refunded.
258
+ #
259
+ # @param order [ShopifyAPI::Order]
260
+ # @return [Float]
261
+ def self.refund_amount(order)
262
+ total = 0.0
263
+
264
+ order.refunds.each do |refund|
265
+ refund.transactions.each do |transaction|
266
+ total = total + transaction.amount.to_f if transaction.kind = 'refund'
267
+ end
268
+ end
269
+
270
+ return total
271
+ end
272
+
273
+ # Calculate total quantity of ordered items.
274
+ #
275
+ # @param [ShopifyAPI::Order]
276
+ # @return [Float]
277
+ def self.quantity_ordered(order)
278
+ total = 0.0
279
+
280
+ order.line_items.each do |line_item|
281
+ total = total + line_item.quantity.to_f
282
+ end
283
+
284
+ return total
285
+ end
286
+
287
+ # Generate a string of line item details for the order.
288
+ #
289
+ # @param line_items [ShopifyAPI::LineItem]
290
+ # @param store [Gemgento::Store]
291
+ def self.products_ordered(line_items, store)
292
+ ordered = []
293
+
294
+ line_items.each do |line_item|
295
+ if shopify_adapter = Gemgento::Adapter::ShopifyAdapter.find_by(shopify_model_type: 'ShopifyAPI::Variant', shopify_model_id: line_item.variant_id)
296
+ product = shopify_adapter.gemgento_model
297
+ else
298
+ product = Gemgento::Product.find_by(sku: Gemgento::Adapter::Shopify::Product.normalize_sku(line_item.sku))
299
+ end
300
+
301
+ if product
302
+ ordered << "#{product.sku}:#{line_item.quantity}:#{line_item.price}"
303
+ else
304
+ ordered << "#{Gemgento::Adapter::Shopify::Product.normalize_sku(line_item.sku)}:#{line_item.quantity}:#{line_item.price}"
305
+ end
306
+ end
307
+
308
+ return ordered.join('|')
309
+ end
310
+
311
+ # Determine the Magento order status from a Shopify order.
312
+ #
313
+ # @param order [ShopifyAPI::Order]
314
+ # @return [String]
315
+ def self.order_status(order)
316
+ if %w[paid refunded partially_refunded].include? order.financial_status
317
+ if order.fulfillment_status == 'shipped'
318
+ return 'complete'
319
+ elsif %w[refunded partially_refunded].include? order.financial_status
320
+ return 'complete'
321
+ else
322
+ return 'pending'
323
+ end
324
+ elsif order.financial_status == 'pending'
325
+ return 'pending'
326
+ elsif order.financial_status == 'voided'
327
+ return 'canceled'
328
+ else
329
+ return 'complete'
330
+ end
331
+ end
332
+
333
+ end
334
+ end