duodealer_api 1.0.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 (322) hide show
  1. checksums.yaml +7 -0
  2. data/.document +5 -0
  3. data/.gitignore +13 -0
  4. data/.rubocop.yml +8 -0
  5. data/.travis.yml +23 -0
  6. data/Gemfile +5 -0
  7. data/Gemfile_ar41 +5 -0
  8. data/Gemfile_ar50 +5 -0
  9. data/Gemfile_ar51 +5 -0
  10. data/Gemfile_ar_master +5 -0
  11. data/RELEASING +13 -0
  12. data/Rakefile +44 -0
  13. data/docker-compose.yml +13 -0
  14. data/docs/graphql.md +191 -0
  15. data/duodealer_api.gemspec +38 -0
  16. data/lib/active_resource/connection_ext.rb +10 -0
  17. data/lib/active_resource/detailed_log_subscriber.rb +52 -0
  18. data/lib/active_resource/json_errors.rb +31 -0
  19. data/lib/duodealer_api.rb +33 -0
  20. data/lib/duodealer_api/api_version.rb +205 -0
  21. data/lib/duodealer_api/connection.rb +35 -0
  22. data/lib/duodealer_api/countable.rb +14 -0
  23. data/lib/duodealer_api/disable_prefix_check.rb +31 -0
  24. data/lib/duodealer_api/events.rb +7 -0
  25. data/lib/duodealer_api/graphql.rb +79 -0
  26. data/lib/duodealer_api/graphql/http_client.rb +22 -0
  27. data/lib/duodealer_api/graphql/railtie.rb +17 -0
  28. data/lib/duodealer_api/graphql/task.rake +97 -0
  29. data/lib/duodealer_api/limits.rb +76 -0
  30. data/lib/duodealer_api/message_enricher.rb +23 -0
  31. data/lib/duodealer_api/meta.rb +15 -0
  32. data/lib/duodealer_api/metafields.rb +20 -0
  33. data/lib/duodealer_api/paginated_collection.rb +69 -0
  34. data/lib/duodealer_api/pagination_link_headers.rb +33 -0
  35. data/lib/duodealer_api/resources.rb +3 -0
  36. data/lib/duodealer_api/resources/abandoned_checkout.rb +7 -0
  37. data/lib/duodealer_api/resources/access_scope.rb +10 -0
  38. data/lib/duodealer_api/resources/access_token.rb +8 -0
  39. data/lib/duodealer_api/resources/address.rb +4 -0
  40. data/lib/duodealer_api/resources/announcement.rb +4 -0
  41. data/lib/duodealer_api/resources/api_permission.rb +9 -0
  42. data/lib/duodealer_api/resources/application_charge.rb +15 -0
  43. data/lib/duodealer_api/resources/application_credit.rb +4 -0
  44. data/lib/duodealer_api/resources/array_base.rb +13 -0
  45. data/lib/duodealer_api/resources/article.rb +21 -0
  46. data/lib/duodealer_api/resources/asset.rb +100 -0
  47. data/lib/duodealer_api/resources/assigned_fulfillment_order.rb +16 -0
  48. data/lib/duodealer_api/resources/base.rb +162 -0
  49. data/lib/duodealer_api/resources/billing_address.rb +4 -0
  50. data/lib/duodealer_api/resources/blog.rb +10 -0
  51. data/lib/duodealer_api/resources/carrier_service.rb +4 -0
  52. data/lib/duodealer_api/resources/cart.rb +4 -0
  53. data/lib/duodealer_api/resources/checkout.rb +30 -0
  54. data/lib/duodealer_api/resources/collect.rb +6 -0
  55. data/lib/duodealer_api/resources/collection.rb +14 -0
  56. data/lib/duodealer_api/resources/collection_listing.rb +18 -0
  57. data/lib/duodealer_api/resources/collection_publication.rb +10 -0
  58. data/lib/duodealer_api/resources/comment.rb +9 -0
  59. data/lib/duodealer_api/resources/country.rb +4 -0
  60. data/lib/duodealer_api/resources/currency.rb +6 -0
  61. data/lib/duodealer_api/resources/custom_collection.rb +19 -0
  62. data/lib/duodealer_api/resources/customer.rb +29 -0
  63. data/lib/duodealer_api/resources/customer_group.rb +5 -0
  64. data/lib/duodealer_api/resources/customer_invite.rb +4 -0
  65. data/lib/duodealer_api/resources/customer_saved_search.rb +11 -0
  66. data/lib/duodealer_api/resources/discount_code.rb +9 -0
  67. data/lib/duodealer_api/resources/draft_order.rb +14 -0
  68. data/lib/duodealer_api/resources/draft_order_invoice.rb +4 -0
  69. data/lib/duodealer_api/resources/event.rb +8 -0
  70. data/lib/duodealer_api/resources/fulfillment.rb +47 -0
  71. data/lib/duodealer_api/resources/fulfillment_event.rb +15 -0
  72. data/lib/duodealer_api/resources/fulfillment_order.rb +137 -0
  73. data/lib/duodealer_api/resources/fulfillment_order_locations_for_move.rb +4 -0
  74. data/lib/duodealer_api/resources/fulfillment_request.rb +15 -0
  75. data/lib/duodealer_api/resources/fulfillment_service.rb +4 -0
  76. data/lib/duodealer_api/resources/fulfillment_v2.rb +20 -0
  77. data/lib/duodealer_api/resources/gift_card.rb +7 -0
  78. data/lib/duodealer_api/resources/image.rb +16 -0
  79. data/lib/duodealer_api/resources/inventory_item.rb +6 -0
  80. data/lib/duodealer_api/resources/inventory_level.rb +55 -0
  81. data/lib/duodealer_api/resources/line_item.rb +14 -0
  82. data/lib/duodealer_api/resources/location.rb +8 -0
  83. data/lib/duodealer_api/resources/marketing_event.rb +10 -0
  84. data/lib/duodealer_api/resources/metafield.rb +13 -0
  85. data/lib/duodealer_api/resources/note_attribute.rb +4 -0
  86. data/lib/duodealer_api/resources/option.rb +4 -0
  87. data/lib/duodealer_api/resources/order.rb +43 -0
  88. data/lib/duodealer_api/resources/order_risk.rb +8 -0
  89. data/lib/duodealer_api/resources/page.rb +6 -0
  90. data/lib/duodealer_api/resources/payment.rb +7 -0
  91. data/lib/duodealer_api/resources/payment_details.rb +4 -0
  92. data/lib/duodealer_api/resources/ping.rb +3 -0
  93. data/lib/duodealer_api/resources/policy.rb +7 -0
  94. data/lib/duodealer_api/resources/price_rule.rb +8 -0
  95. data/lib/duodealer_api/resources/product.rb +35 -0
  96. data/lib/duodealer_api/resources/product_listing.rb +16 -0
  97. data/lib/duodealer_api/resources/product_publication.rb +10 -0
  98. data/lib/duodealer_api/resources/province.rb +5 -0
  99. data/lib/duodealer_api/resources/publication.rb +5 -0
  100. data/lib/duodealer_api/resources/receipt.rb +4 -0
  101. data/lib/duodealer_api/resources/recurring_application_charge.rb +31 -0
  102. data/lib/duodealer_api/resources/redirect.rb +4 -0
  103. data/lib/duodealer_api/resources/refund.rb +14 -0
  104. data/lib/duodealer_api/resources/report.rb +4 -0
  105. data/lib/duodealer_api/resources/resource_feedback.rb +19 -0
  106. data/lib/duodealer_api/resources/rule.rb +4 -0
  107. data/lib/duodealer_api/resources/script_tag.rb +4 -0
  108. data/lib/duodealer_api/resources/shipping_address.rb +4 -0
  109. data/lib/duodealer_api/resources/shipping_line.rb +4 -0
  110. data/lib/duodealer_api/resources/shipping_rate.rb +7 -0
  111. data/lib/duodealer_api/resources/shipping_zone.rb +4 -0
  112. data/lib/duodealer_api/resources/shop.rb +25 -0
  113. data/lib/duodealer_api/resources/smart_collection.rb +19 -0
  114. data/lib/duodealer_api/resources/storefront_access_token.rb +4 -0
  115. data/lib/duodealer_api/resources/tax_line.rb +4 -0
  116. data/lib/duodealer_api/resources/tax_service.rb +4 -0
  117. data/lib/duodealer_api/resources/tender_transaction.rb +6 -0
  118. data/lib/duodealer_api/resources/theme.rb +4 -0
  119. data/lib/duodealer_api/resources/transaction.rb +5 -0
  120. data/lib/duodealer_api/resources/usage_charge.rb +5 -0
  121. data/lib/duodealer_api/resources/user.rb +4 -0
  122. data/lib/duodealer_api/resources/variant.rb +8 -0
  123. data/lib/duodealer_api/resources/webhook.rb +4 -0
  124. data/lib/duodealer_api/session.rb +171 -0
  125. data/lib/duodealer_api/version.rb +3 -0
  126. data/shipit.rubygems.yml +1 -0
  127. data/test/abandoned_checkouts_test.rb +29 -0
  128. data/test/access_scope_test.rb +23 -0
  129. data/test/access_token_test.rb +19 -0
  130. data/test/active_resource/json_errors_test.rb +19 -0
  131. data/test/api_permission_test.rb +9 -0
  132. data/test/api_version_test.rb +157 -0
  133. data/test/application_charge_test.rb +79 -0
  134. data/test/application_credit_test.rb +35 -0
  135. data/test/article_test.rb +73 -0
  136. data/test/asset_test.rb +18 -0
  137. data/test/assigned_fulfillment_order_test.rb +77 -0
  138. data/test/base_test.rb +198 -0
  139. data/test/blog_test.rb +8 -0
  140. data/test/carrier_service_test.rb +17 -0
  141. data/test/cart_test.rb +13 -0
  142. data/test/checkouts_test.rb +77 -0
  143. data/test/collect_test.rb +9 -0
  144. data/test/collection_listing_test.rb +79 -0
  145. data/test/collection_publication_test.rb +40 -0
  146. data/test/collection_test.rb +49 -0
  147. data/test/countable_test.rb +13 -0
  148. data/test/currency_test.rb +21 -0
  149. data/test/custom_collection_test.rb +9 -0
  150. data/test/customer_saved_search_test.rb +27 -0
  151. data/test/customer_test.rb +50 -0
  152. data/test/detailed_log_subscriber_test.rb +139 -0
  153. data/test/discount_code_test.rb +53 -0
  154. data/test/draft_order_test.rb +151 -0
  155. data/test/fixtures/abandoned_checkout.json +184 -0
  156. data/test/fixtures/abandoned_checkouts.json +186 -0
  157. data/test/fixtures/access_scopes.json +10 -0
  158. data/test/fixtures/access_token_delegate.json +4 -0
  159. data/test/fixtures/api_versions.json +38 -0
  160. data/test/fixtures/apis.json +42 -0
  161. data/test/fixtures/application_charge.json +16 -0
  162. data/test/fixtures/application_charges.json +57 -0
  163. data/test/fixtures/application_credit.json +12 -0
  164. data/test/fixtures/application_credits.json +24 -0
  165. data/test/fixtures/article.json +15 -0
  166. data/test/fixtures/articles.json +39 -0
  167. data/test/fixtures/asset.json +9 -0
  168. data/test/fixtures/assets.json +136 -0
  169. data/test/fixtures/assigned_fulfillment_orders.json +78 -0
  170. data/test/fixtures/authors.json +1 -0
  171. data/test/fixtures/blog.json +13 -0
  172. data/test/fixtures/blogs.json +13 -0
  173. data/test/fixtures/carrier_service.json +9 -0
  174. data/test/fixtures/carts.json +43 -0
  175. data/test/fixtures/checkout.json +160 -0
  176. data/test/fixtures/checkouts.json +162 -0
  177. data/test/fixtures/collect.json +12 -0
  178. data/test/fixtures/collection.json +17 -0
  179. data/test/fixtures/collection_listing.json +11 -0
  180. data/test/fixtures/collection_listing_product_ids.json +1 -0
  181. data/test/fixtures/collection_listing_product_ids2.json +1 -0
  182. data/test/fixtures/collection_listings.json +13 -0
  183. data/test/fixtures/collection_products.json +47 -0
  184. data/test/fixtures/collection_publication.json +11 -0
  185. data/test/fixtures/collection_publications.json +13 -0
  186. data/test/fixtures/currencies.json +25 -0
  187. data/test/fixtures/custom_collection.json +17 -0
  188. data/test/fixtures/customer_invite.json +9 -0
  189. data/test/fixtures/customer_saved_search.json +9 -0
  190. data/test/fixtures/customer_saved_search_customers.json +60 -0
  191. data/test/fixtures/customers.json +59 -0
  192. data/test/fixtures/customers_account_activation_url.json +3 -0
  193. data/test/fixtures/customers_search.json +60 -0
  194. data/test/fixtures/discount_code.json +10 -0
  195. data/test/fixtures/discount_codes.json +12 -0
  196. data/test/fixtures/draft_order.json +159 -0
  197. data/test/fixtures/draft_order_completed.json +159 -0
  198. data/test/fixtures/draft_order_invoice.json +9 -0
  199. data/test/fixtures/draft_orders.json +161 -0
  200. data/test/fixtures/engagement.json +15 -0
  201. data/test/fixtures/events.json +31 -0
  202. data/test/fixtures/fulfillment.json +49 -0
  203. data/test/fixtures/fulfillment_event.json +12 -0
  204. data/test/fixtures/fulfillment_order.json +38 -0
  205. data/test/fixtures/fulfillment_order_locations_for_move.json +18 -0
  206. data/test/fixtures/fulfillment_orders.json +78 -0
  207. data/test/fixtures/fulfillment_request.json +28 -0
  208. data/test/fixtures/fulfillment_service.json +10 -0
  209. data/test/fixtures/fulfillments.json +53 -0
  210. data/test/fixtures/gift_card.json +20 -0
  211. data/test/fixtures/gift_card_disabled.json +20 -0
  212. data/test/fixtures/graphql/2019-10.json +1083 -0
  213. data/test/fixtures/graphql/dummy_schema.rb +16 -0
  214. data/test/fixtures/graphql/unstable.json +1083 -0
  215. data/test/fixtures/image.json +10 -0
  216. data/test/fixtures/images.json +20 -0
  217. data/test/fixtures/inventory_level.json +7 -0
  218. data/test/fixtures/inventory_levels.json +24 -0
  219. data/test/fixtures/marketing_event.json +28 -0
  220. data/test/fixtures/marketing_events.json +54 -0
  221. data/test/fixtures/metafield.json +12 -0
  222. data/test/fixtures/metafields.json +34 -0
  223. data/test/fixtures/order.json +297 -0
  224. data/test/fixtures/order_risk.json +14 -0
  225. data/test/fixtures/order_risks.json +28 -0
  226. data/test/fixtures/order_with_properties.json +373 -0
  227. data/test/fixtures/orders.json +299 -0
  228. data/test/fixtures/payment.json +7 -0
  229. data/test/fixtures/payments.json +9 -0
  230. data/test/fixtures/ping/conversation.json +1 -0
  231. data/test/fixtures/ping/failed_delivery_confirmation.json +1 -0
  232. data/test/fixtures/ping/message.json +1 -0
  233. data/test/fixtures/ping/successful_delivery_confirmation.json +1 -0
  234. data/test/fixtures/policies.json +8 -0
  235. data/test/fixtures/price_rule.json +27 -0
  236. data/test/fixtures/price_rules.json +28 -0
  237. data/test/fixtures/product.json +116 -0
  238. data/test/fixtures/product_listing.json +86 -0
  239. data/test/fixtures/product_listing_product_ids.json +1 -0
  240. data/test/fixtures/product_listing_product_ids2.json +1 -0
  241. data/test/fixtures/product_listings.json +174 -0
  242. data/test/fixtures/product_publication.json +11 -0
  243. data/test/fixtures/product_publications.json +13 -0
  244. data/test/fixtures/publications.json +9 -0
  245. data/test/fixtures/recurring_application_charge.json +22 -0
  246. data/test/fixtures/recurring_application_charge_adjustment.json +5 -0
  247. data/test/fixtures/recurring_application_charges.json +106 -0
  248. data/test/fixtures/redirect.json +7 -0
  249. data/test/fixtures/refund.json +112 -0
  250. data/test/fixtures/report.json +9 -0
  251. data/test/fixtures/reports.json +11 -0
  252. data/test/fixtures/script_tag.json +10 -0
  253. data/test/fixtures/script_tags.json +18 -0
  254. data/test/fixtures/shipping_rates.json +12 -0
  255. data/test/fixtures/shipping_zones.json +315 -0
  256. data/test/fixtures/shop.json +26 -0
  257. data/test/fixtures/smart_collection.json +21 -0
  258. data/test/fixtures/smart_collection_products.json +155 -0
  259. data/test/fixtures/storefront_access_token.json +9 -0
  260. data/test/fixtures/storefront_access_tokens.json +18 -0
  261. data/test/fixtures/tags.json +1 -0
  262. data/test/fixtures/tax_service.json +9 -0
  263. data/test/fixtures/tender_transactions.json +52 -0
  264. data/test/fixtures/transaction.json +29 -0
  265. data/test/fixtures/usage_charge.json +11 -0
  266. data/test/fixtures/usage_charges.json +23 -0
  267. data/test/fixtures/user.json +21 -0
  268. data/test/fixtures/users.json +42 -0
  269. data/test/fixtures/variant.json +23 -0
  270. data/test/fixtures/variants.json +88 -0
  271. data/test/fixtures/webhook.json +10 -0
  272. data/test/fixtures/webhooks.json +18 -0
  273. data/test/fulfillment_event_test.rb +69 -0
  274. data/test/fulfillment_order_test.rb +462 -0
  275. data/test/fulfillment_order_test_helper.rb +7 -0
  276. data/test/fulfillment_request_test.rb +33 -0
  277. data/test/fulfillment_service_test.rb +17 -0
  278. data/test/fulfillment_test.rb +224 -0
  279. data/test/fulfillment_v2_test.rb +62 -0
  280. data/test/gift_card_test.rb +22 -0
  281. data/test/graphql/http_client_test.rb +26 -0
  282. data/test/graphql_test.rb +147 -0
  283. data/test/image_test.rb +39 -0
  284. data/test/inventory_level_test.rb +59 -0
  285. data/test/lib/webmock_extensions/last_request.rb +16 -0
  286. data/test/limits_test.rb +38 -0
  287. data/test/location_test.rb +14 -0
  288. data/test/marketing_event_test.rb +68 -0
  289. data/test/message_enricher_test.rb +45 -0
  290. data/test/meta_test.rb +49 -0
  291. data/test/metafield_test.rb +46 -0
  292. data/test/order_risk_test.rb +46 -0
  293. data/test/order_test.rb +125 -0
  294. data/test/pagination_test.rb +257 -0
  295. data/test/payment_test.rb +19 -0
  296. data/test/policy_test.rb +19 -0
  297. data/test/price_rule_test.rb +65 -0
  298. data/test/product_listing_test.rb +97 -0
  299. data/test/product_publication_test.rb +40 -0
  300. data/test/product_test.rb +60 -0
  301. data/test/publication_test.rb +12 -0
  302. data/test/recurring_application_charge_test.rb +142 -0
  303. data/test/redirect_test.rb +9 -0
  304. data/test/refund_test.rb +32 -0
  305. data/test/report_test.rb +35 -0
  306. data/test/resource_feedback_test.rb +42 -0
  307. data/test/script_tag_test.rb +30 -0
  308. data/test/session_test.rb +366 -0
  309. data/test/shipping_rate_test.rb +17 -0
  310. data/test/shipping_zone_test.rb +10 -0
  311. data/test/shop_test.rb +68 -0
  312. data/test/smart_collection_test.rb +35 -0
  313. data/test/storefront_access_token_test.rb +32 -0
  314. data/test/tax_service_test.rb +9 -0
  315. data/test/tender_transaction_test.rb +18 -0
  316. data/test/test_helper.rb +124 -0
  317. data/test/transaction_test.rb +17 -0
  318. data/test/usage_charge_test.rb +21 -0
  319. data/test/user_test.rb +17 -0
  320. data/test/variant_test.rb +46 -0
  321. data/test/webhook_test.rb +21 -0
  322. metadata +541 -0
@@ -0,0 +1,29 @@
1
+ module DuodealerAPI
2
+ class Customer < Base
3
+ include Metafields
4
+
5
+ def orders
6
+ Order.find(:all, params: {customer_id: self.id})
7
+ end
8
+
9
+ def self.search(params)
10
+ find(:all, from: :search, params: params)
11
+ end
12
+
13
+ def account_activation_url
14
+ resource = post(:account_activation_url, {}, only_id)
15
+ data = ActiveSupport::JSON.decode(resource.body.to_s)
16
+ result = nil
17
+
18
+ if data.key?('account_activation_url')
19
+ result = data['account_activation_url']
20
+ end
21
+ result
22
+ end
23
+
24
+ def send_invite(customer_invite = DuodealerAPI::CustomerInvite.new)
25
+ resource = post(:send_invite, {}, customer_invite.encode)
26
+ DuodealerAPI::CustomerInvite.new(DuodealerAPI::CustomerInvite.format.decode(resource.body))
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,5 @@
1
+ require 'duodealer_api/resources/customer_saved_search'
2
+
3
+ module DuodealerAPI
4
+ CustomerGroup = CustomerSavedSearch
5
+ end
@@ -0,0 +1,4 @@
1
+ module DuodealerAPI
2
+ class CustomerInvite < Base
3
+ end
4
+ end
@@ -0,0 +1,11 @@
1
+ require 'duodealer_api/resources/customer'
2
+
3
+ module DuodealerAPI
4
+ class CustomerSavedSearch < Base
5
+ early_july_pagination_release!
6
+
7
+ def customers(params = {})
8
+ Customer.search(params.merge({:customer_saved_search_id => self.id}))
9
+ end
10
+ end
11
+ end
@@ -0,0 +1,9 @@
1
+ module DuodealerAPI
2
+ class DiscountCode < Base
3
+ init_prefix :price_rule
4
+
5
+ def price_rule_id
6
+ @prefix_options[:price_rule_id]
7
+ end
8
+ end
9
+ end
@@ -0,0 +1,14 @@
1
+ module DuodealerAPI
2
+ class DraftOrder < Base
3
+ include Metafields
4
+
5
+ def send_invoice(draft_order_invoice = DuodealerAPI::DraftOrderInvoice.new)
6
+ resource = post(:send_invoice, {}, draft_order_invoice.encode)
7
+ DuodealerAPI::DraftOrderInvoice.new(DuodealerAPI::DraftOrder.format.decode(resource.body))
8
+ end
9
+
10
+ def complete(options = {})
11
+ load_attributes_from_response(put(:complete, options, nil))
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,4 @@
1
+ module DuodealerAPI
2
+ class DraftOrderInvoice < Base
3
+ end
4
+ end
@@ -0,0 +1,8 @@
1
+ module DuodealerAPI
2
+ class Event < Base
3
+ include DisablePrefixCheck
4
+
5
+ conditional_prefix :resource, true
6
+ early_july_pagination_release!
7
+ end
8
+ end
@@ -0,0 +1,47 @@
1
+ module DuodealerAPI
2
+ class Fulfillment < Base
3
+ init_prefix :order
4
+
5
+ def order_id
6
+ @prefix_options[:order_id]
7
+ end
8
+
9
+ def cancel; load_attributes_from_response(post(:cancel, {}, only_id)); end
10
+ def complete; load_attributes_from_response(post(:complete, {}, only_id)); end
11
+ def open; load_attributes_from_response(post(:open, {}, only_id)); end
12
+
13
+ def order_id=(order_id)
14
+ prefix_options[:order_id] = order_id
15
+ end
16
+
17
+ def load(attributes, remove_root = false, persisted = false)
18
+ order_id = attributes['order_id']
19
+ prefix_options[:order_id] = order_id if order_id
20
+ super(attributes, remove_root, persisted)
21
+ end
22
+
23
+ def save
24
+ if prefix_options[:order_id].present?
25
+ super
26
+ else
27
+ line_items = attributes['line_items_by_fulfillment_order'] || attributes[:line_items_by_fulfillment_order]
28
+ if line_items.blank?
29
+ raise DuodealerAPI::ValidationException,
30
+ "either 'line_items_by_fulfillment_order' or prefix_options[:order_id] is required"
31
+ end
32
+
33
+ fulfillmentV2 = FulfillmentV2.new(attributes)
34
+ result = fulfillmentV2.save
35
+ load(fulfillmentV2.attributes, false, true)
36
+ result
37
+ end
38
+ end
39
+
40
+ def update_tracking(tracking_info:, notify_customer:)
41
+ fulfillmentV2 = FulfillmentV2.new(attributes)
42
+ result = fulfillmentV2.update_tracking(tracking_info: tracking_info, notify_customer: notify_customer)
43
+ load(fulfillmentV2.attributes, false, true)
44
+ result
45
+ end
46
+ end
47
+ end
@@ -0,0 +1,15 @@
1
+ module DuodealerAPI
2
+ class FulfillmentEvent < Base
3
+ self.resource_prefix = "orders/:order_id/fulfillments/:fulfillment_id/"
4
+ self.collection_name = 'events'
5
+ self.element_name = 'event'
6
+
7
+ def order_id
8
+ @prefix_options[:order_id]
9
+ end
10
+
11
+ def fulfillment_id
12
+ @prefix_options[:fulfillment_id]
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,137 @@
1
+ module DuodealerAPI
2
+ class FulfillmentOrder < Base
3
+ MINIMUM_VERSION = '2020-01'
4
+
5
+ def initialize(attributes = {}, persisted = false)
6
+ DuodealerAPI::Base.version_validation!(MINIMUM_VERSION)
7
+ super(attributes, persisted)
8
+ end
9
+
10
+ def self.find(scope, *args)
11
+ DuodealerAPI::Base.version_validation!(MINIMUM_VERSION)
12
+
13
+ if scope == :all
14
+ order_id = args.first&.dig(:params, :order_id)
15
+ raise DuodealerAPI::ValidationException, "'order_id' is required" if order_id.blank?
16
+
17
+ order = ::DuodealerAPI::Order.new(id: order_id)
18
+ order.fulfillment_orders(args.first[:params].except(:order_id))
19
+ else
20
+ super(scope, *args)
21
+ end
22
+ end
23
+
24
+ def fulfillments(options = {})
25
+ fulfillment_hashes = get(:fulfillments, options)
26
+ fulfillment_hashes.map { |fulfillment_hash| Fulfillment.new(fulfillment_hash) }
27
+ end
28
+
29
+ def locations_for_move
30
+ locations_for_move_hashes = get(:locations_for_move, {})
31
+
32
+ locations_for_move_hashes.map do |locations_for_move_hash|
33
+ FulfillmentOrderLocationsForMove.new(locations_for_move_hash)
34
+ end
35
+ end
36
+
37
+ def move(new_location_id:)
38
+ body = {
39
+ fulfillment_order: {
40
+ new_location_id: new_location_id
41
+ }
42
+ }
43
+ keyed_fulfillment_orders = keyed_fulfillment_orders_from_response(post(:move, {}, body.to_json))
44
+ load_keyed_fulfillment_order(keyed_fulfillment_orders, 'original_fulfillment_order')
45
+ keyed_fulfillment_orders
46
+ end
47
+
48
+ def cancel
49
+ keyed_fulfillment_orders = keyed_fulfillment_orders_from_response(post(:cancel, {}, only_id))
50
+ load_keyed_fulfillment_order(keyed_fulfillment_orders, 'fulfillment_order')
51
+ keyed_fulfillment_orders
52
+ end
53
+
54
+ def close(message: nil)
55
+ body = {
56
+ fulfillment_order: {
57
+ message: message
58
+ }
59
+ }
60
+ load_attributes_from_response(post(:close, {}, body.to_json))
61
+ end
62
+
63
+ def request_fulfillment(fulfillment_order_line_items: nil, message: nil)
64
+ body = {
65
+ fulfillment_request: {
66
+ fulfillment_order_line_items: fulfillment_order_line_items,
67
+ message: message
68
+ }
69
+ }
70
+ keyed_fulfillment_orders = keyed_fulfillment_orders_from_response(post(:fulfillment_request, {}, body.to_json))
71
+ load_keyed_fulfillment_order(keyed_fulfillment_orders, 'original_fulfillment_order')
72
+ keyed_fulfillment_orders
73
+ end
74
+
75
+ def accept_fulfillment_request(message: nil)
76
+ body = {
77
+ fulfillment_request: {
78
+ message: message
79
+ }
80
+ }
81
+ load_attributes_from_response(post('fulfillment_request/accept', {}, body.to_json))
82
+ end
83
+
84
+ def reject_fulfillment_request(message: nil)
85
+ body = {
86
+ fulfillment_request: {
87
+ message: message
88
+ }
89
+ }
90
+ load_attributes_from_response(post('fulfillment_request/reject', {}, body.to_json))
91
+ end
92
+
93
+ def request_cancellation(message: nil)
94
+ body = {
95
+ cancellation_request: {
96
+ message: message
97
+ }
98
+ }
99
+ load_attributes_from_response(post(:cancellation_request, {}, body.to_json))
100
+ end
101
+
102
+ def accept_cancellation_request(message: nil)
103
+ body = {
104
+ cancellation_request: {
105
+ message: message
106
+ }
107
+ }
108
+ load_attributes_from_response(post('cancellation_request/accept', {}, body.to_json))
109
+ end
110
+
111
+ def reject_cancellation_request(message: nil)
112
+ body = {
113
+ cancellation_request: {
114
+ message: message
115
+ }
116
+ }
117
+ load_attributes_from_response(post('cancellation_request/reject', {}, body.to_json))
118
+ end
119
+
120
+ private
121
+
122
+ def load_keyed_fulfillment_order(keyed_fulfillment_orders, key)
123
+ if keyed_fulfillment_orders[key]&.attributes
124
+ load(keyed_fulfillment_orders[key].attributes, false, true)
125
+ end
126
+ end
127
+
128
+ def keyed_fulfillment_orders_from_response(response)
129
+ return load_attributes_from_response(response) if response.code != '200'
130
+
131
+ keyed_fulfillment_orders = ActiveSupport::JSON.decode(response.body)
132
+ keyed_fulfillment_orders.transform_values do |fulfillment_order_attributes|
133
+ FulfillmentOrder.new(fulfillment_order_attributes) if fulfillment_order_attributes
134
+ end
135
+ end
136
+ end
137
+ end
@@ -0,0 +1,4 @@
1
+ module DuodealerAPI
2
+ class FulfillmentOrderLocationsForMove < Base
3
+ end
4
+ end
@@ -0,0 +1,15 @@
1
+ module DuodealerAPI
2
+ class FulfillmentRequest < Base
3
+ init_prefix :order
4
+
5
+ def order_id
6
+ @prefix_options[:order_id]
7
+ end
8
+
9
+ def mark_as_failed
10
+ options = {}
11
+ options[:message] = failure_message if failure_message
12
+ load_attributes_from_response(put(:mark_as_failed, options))
13
+ end
14
+ end
15
+ end
@@ -0,0 +1,4 @@
1
+ module DuodealerAPI
2
+ class FulfillmentService < Base
3
+ end
4
+ end
@@ -0,0 +1,20 @@
1
+ module DuodealerAPI
2
+ class FulfillmentV2 < Base
3
+ self.element_name = 'fulfillment'
4
+
5
+ def initialize(attributes = {}, persisted = false)
6
+ DuodealerAPI::Base.version_validation!(FulfillmentOrder::MINIMUM_VERSION)
7
+ super(attributes, persisted)
8
+ end
9
+
10
+ def update_tracking(tracking_info:, notify_customer:)
11
+ body = {
12
+ fulfillment: {
13
+ tracking_info: tracking_info,
14
+ notify_customer: notify_customer
15
+ }
16
+ }
17
+ load_attributes_from_response(post(:update_tracking, {}, body.to_json))
18
+ end
19
+ end
20
+ end
@@ -0,0 +1,7 @@
1
+ module DuodealerAPI
2
+ class GiftCard < Base
3
+ def disable
4
+ load_attributes_from_response(post(:disable))
5
+ end
6
+ end
7
+ end
@@ -0,0 +1,16 @@
1
+ module DuodealerAPI
2
+ class Image < Base
3
+ init_prefix :product
4
+
5
+ # generate a method for each possible image variant
6
+ [:pico, :icon, :thumb, :small, :compact, :medium, :large, :grande, :original].each do |m|
7
+ reg_exp_match = "/\\1_#{m}.\\2"
8
+ define_method(m) { src.gsub(/\/(.*)\.(\w{2,4})/, reg_exp_match) }
9
+ end
10
+
11
+ def attach_image(data, filename = nil)
12
+ attributes['attachment'] = Base64.encode64(data)
13
+ attributes['filename'] = filename unless filename.nil?
14
+ end
15
+ end
16
+ end
@@ -0,0 +1,6 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuodealerAPI
4
+ class InventoryItem < Base
5
+ end
6
+ end
@@ -0,0 +1,55 @@
1
+ # frozen_string_literal: true
2
+
3
+ module DuodealerAPI
4
+ class InventoryLevel < Base
5
+
6
+ # The default path structure in ActiveResource for delete would result in:
7
+ # /admin/api/<version>/inventory_levels/#{ inventory_level.id }.json?#{ params }, but since
8
+ # InventroyLevels are a second class resource made up of a Where and a What
9
+ # (Location and InventoryItem), it does not have a resource ID. Here we
10
+ # redefine element_path to remove the id so HTTP DELETE requests go to
11
+ # /admin/api/<version>/inventory_levels.json?#{ params } instead.
12
+ #
13
+ def self.element_path(prefix_options = {}, query_options = nil)
14
+ prefix_options, query_options = split_options(prefix_options) if query_options.nil?
15
+ "#{prefix(prefix_options)}#{collection_name}.#{format.extension}#{query_string(query_options)}"
16
+ end
17
+
18
+ def destroy
19
+ load_attributes_from_response(
20
+ self.class.delete('/', location_id: location_id, inventory_item_id: inventory_item_id)
21
+ )
22
+ end
23
+
24
+ def connect(relocate_if_necessary: nil)
25
+ body = { location_id: location_id, inventory_item_id: inventory_item_id }
26
+ body[:relocate_if_necessary] = relocate_if_necessary unless relocate_if_necessary.nil?
27
+ load_attributes_from_response(
28
+ self.class.post(:connect, {}, body.to_json)
29
+ )
30
+ end
31
+
32
+ def set(new_available, disconnect_if_necessary: nil)
33
+ body = {
34
+ location_id: location_id,
35
+ inventory_item_id: inventory_item_id,
36
+ available: new_available
37
+ }
38
+ body[:disconnect_if_necessary] = disconnect_if_necessary unless disconnect_if_necessary.nil?
39
+ load_attributes_from_response(
40
+ self.class.post(:set, {}, body.to_json)
41
+ )
42
+ end
43
+
44
+ def adjust(available_adjustment)
45
+ body = {
46
+ location_id: location_id,
47
+ inventory_item_id: inventory_item_id,
48
+ available_adjustment: available_adjustment
49
+ }
50
+ load_attributes_from_response(
51
+ self.class.post(:adjust, {}, body.to_json)
52
+ )
53
+ end
54
+ end
55
+ end
@@ -0,0 +1,14 @@
1
+ module DuodealerAPI
2
+ class LineItem < Base
3
+ class Property < Base
4
+ def initialize(*args)
5
+ attributes = args[0] || {}
6
+ persisted = args[1] || false
7
+ super
8
+ rescue NameError
9
+ attributes = attributes.to_hash
10
+ self
11
+ end
12
+ end
13
+ end
14
+ end