spree_api 5.6.1 → 6.0.0.beta1

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 (540) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +28 -0
  3. data/Rakefile +1 -1
  4. data/app/controllers/concerns/spree/api/v3/address_params.rb +17 -0
  5. data/app/controllers/concerns/spree/api/v3/admin/product_listing.rb +46 -0
  6. data/app/controllers/concerns/spree/api/v3/admin/product_membership.rb +110 -0
  7. data/app/controllers/concerns/spree/api/v3/admin/receivable_actions.rb +68 -0
  8. data/app/controllers/concerns/spree/api/v3/admin/reporting_authorization.rb +27 -0
  9. data/app/controllers/concerns/spree/api/v3/admin/role_grant_guard.rb +69 -33
  10. data/app/controllers/concerns/spree/api/v3/admin/stock_receipt_actions.rb +86 -0
  11. data/app/controllers/concerns/spree/api/v3/admin/store_context.rb +97 -0
  12. data/app/controllers/concerns/spree/api/v3/admin/subclassed_resource.rb +12 -6
  13. data/app/controllers/concerns/spree/api/v3/admin/validation_details.rb +91 -0
  14. data/app/controllers/concerns/spree/api/v3/admin_authentication.rb +9 -5
  15. data/app/controllers/concerns/spree/api/v3/api_key_authentication.rb +41 -5
  16. data/app/controllers/concerns/spree/api/v3/authentication_strategies.rb +48 -0
  17. data/app/controllers/concerns/spree/api/v3/bulk_operations.rb +4 -6
  18. data/app/controllers/concerns/spree/api/v3/cart_resolvable.rb +52 -16
  19. data/app/controllers/concerns/spree/api/v3/company_address_writes.rb +37 -0
  20. data/app/controllers/concerns/spree/api/v3/current_password_confirmation.rb +41 -0
  21. data/app/controllers/concerns/spree/api/v3/direct_uploads.rb +35 -0
  22. data/app/controllers/concerns/spree/api/v3/error_handler.rb +53 -11
  23. data/app/controllers/concerns/spree/api/v3/idempotent.rb +10 -4
  24. data/app/controllers/concerns/spree/api/v3/items_payload.rb +54 -0
  25. data/app/controllers/concerns/spree/api/v3/jwt_authentication.rb +23 -3
  26. data/app/controllers/concerns/spree/api/v3/key_store_context.rb +31 -0
  27. data/app/controllers/concerns/spree/api/v3/locale_and_currency.rb +3 -3
  28. data/app/controllers/concerns/spree/api/v3/order_lock.rb +22 -3
  29. data/app/controllers/concerns/spree/api/v3/orders/claim_actions.rb +112 -0
  30. data/app/controllers/concerns/spree/api/v3/orders/delivery_actions.rb +105 -0
  31. data/app/controllers/concerns/spree/api/v3/orders/exchange_actions.rb +117 -0
  32. data/app/controllers/concerns/spree/api/v3/orders/fulfillment_actions.rb +157 -0
  33. data/app/controllers/concerns/spree/api/v3/orders/post_sale_actions.rb +76 -0
  34. data/app/controllers/concerns/spree/api/v3/orders/return_actions.rb +116 -0
  35. data/app/controllers/concerns/spree/api/v3/orders/shipping_label_actions.rb +128 -0
  36. data/app/controllers/concerns/spree/api/v3/params_normalizer.rb +7 -4
  37. data/app/controllers/concerns/spree/api/v3/permission_serialization.rb +42 -0
  38. data/app/controllers/concerns/spree/api/v3/rate_limit_headers.rb +40 -6
  39. data/app/controllers/concerns/spree/api/v3/scoped_authorization.rb +80 -26
  40. data/app/controllers/concerns/spree/api/v3/seller/auth_cookies.rb +62 -0
  41. data/app/controllers/concerns/spree/api/v3/seller/seller_context.rb +127 -0
  42. data/app/controllers/concerns/spree/api/v3/seller_authentication.rb +40 -0
  43. data/app/controllers/concerns/spree/api/v3/storefront_access.rb +38 -0
  44. data/app/controllers/concerns/spree/api/v3/streams_shipping_label.rb +37 -0
  45. data/app/controllers/concerns/spree/api/v3/tax_identifier_validation.rb +41 -0
  46. data/app/controllers/spree/api/v3/admin/admin_users_controller.rb +11 -14
  47. data/app/controllers/spree/api/v3/admin/allowed_origins_controller.rb +1 -1
  48. data/app/controllers/spree/api/v3/admin/api_keys_controller.rb +16 -7
  49. data/app/controllers/spree/api/v3/admin/auth_controller.rb +138 -22
  50. data/app/controllers/spree/api/v3/admin/base_controller.rb +2 -0
  51. data/app/controllers/spree/api/v3/admin/catalog_assignments_controller.rb +27 -0
  52. data/app/controllers/spree/api/v3/admin/catalogs/base_controller.rb +29 -0
  53. data/app/controllers/spree/api/v3/admin/catalogs/order_minimums_controller.rb +40 -0
  54. data/app/controllers/spree/api/v3/admin/catalogs/products_controller.rb +107 -0
  55. data/app/controllers/spree/api/v3/admin/catalogs/quantity_rules_controller.rb +75 -0
  56. data/app/controllers/spree/api/v3/admin/catalogs_controller.rb +191 -0
  57. data/app/controllers/spree/api/v3/admin/categories/products_controller.rb +28 -41
  58. data/app/controllers/spree/api/v3/admin/categories_controller.rb +16 -7
  59. data/app/controllers/spree/api/v3/admin/channels_controller.rb +50 -2
  60. data/app/controllers/spree/api/v3/admin/claim_reasons_controller.rb +25 -0
  61. data/app/controllers/spree/api/v3/admin/claims_controller.rb +31 -0
  62. data/app/controllers/spree/api/v3/admin/collection_rules_controller.rb +40 -0
  63. data/app/controllers/spree/api/v3/admin/collections/products_controller.rb +101 -0
  64. data/app/controllers/spree/api/v3/admin/collections_controller.rb +56 -0
  65. data/app/controllers/spree/api/v3/admin/commission_lines_controller.rb +39 -0
  66. data/app/controllers/spree/api/v3/admin/commission_rates_controller.rb +174 -0
  67. data/app/controllers/spree/api/v3/admin/companies/addresses_controller.rb +65 -0
  68. data/app/controllers/spree/api/v3/admin/companies/base_controller.rb +29 -0
  69. data/app/controllers/spree/api/v3/admin/companies/invitations_controller.rb +56 -0
  70. data/app/controllers/spree/api/v3/admin/companies/memberships_controller.rb +66 -0
  71. data/app/controllers/spree/api/v3/admin/companies/tax_exemption_certificates_controller.rb +137 -0
  72. data/app/controllers/spree/api/v3/admin/companies/tax_identifiers_controller.rb +46 -0
  73. data/app/controllers/spree/api/v3/admin/companies_controller.rb +59 -0
  74. data/app/controllers/spree/api/v3/admin/concerns/external_references.rb +166 -0
  75. data/app/controllers/spree/api/v3/admin/consent_records_controller.rb +31 -0
  76. data/app/controllers/spree/api/v3/admin/countries_controller.rb +12 -4
  77. data/app/controllers/spree/api/v3/admin/custom_field_definitions_controller.rb +19 -4
  78. data/app/controllers/spree/api/v3/admin/custom_fields_controller.rb +5 -5
  79. data/app/controllers/spree/api/v3/admin/customer_groups_controller.rb +1 -1
  80. data/app/controllers/spree/api/v3/admin/customers/addresses_controller.rb +4 -4
  81. data/app/controllers/spree/api/v3/admin/customers/base_controller.rb +1 -1
  82. data/app/controllers/spree/api/v3/admin/customers/store_credits_controller.rb +2 -3
  83. data/app/controllers/spree/api/v3/admin/customers/tax_identifiers_controller.rb +43 -0
  84. data/app/controllers/spree/api/v3/admin/customers_controller.rb +190 -11
  85. data/app/controllers/spree/api/v3/admin/dashboard_controller.rb +24 -20
  86. data/app/controllers/spree/api/v3/admin/data_requests_controller.rb +60 -0
  87. data/app/controllers/spree/api/v3/admin/delivery_method_rules_controller.rb +54 -0
  88. data/app/controllers/spree/api/v3/admin/delivery_methods/rules_controller.rb +114 -0
  89. data/app/controllers/spree/api/v3/admin/delivery_methods_controller.rb +243 -0
  90. data/app/controllers/spree/api/v3/admin/delivery_profiles/origin_groups_controller.rb +80 -0
  91. data/app/controllers/spree/api/v3/admin/delivery_profiles_controller.rb +107 -0
  92. data/app/controllers/spree/api/v3/admin/delivery_zones_controller.rb +116 -0
  93. data/app/controllers/spree/api/v3/admin/digital_links_controller.rb +48 -0
  94. data/app/controllers/spree/api/v3/admin/direct_uploads_controller.rb +17 -3
  95. data/app/controllers/spree/api/v3/admin/exchanges_controller.rb +31 -0
  96. data/app/controllers/spree/api/v3/admin/exports_controller.rb +2 -2
  97. data/app/controllers/spree/api/v3/admin/gift_card_batches_controller.rb +1 -1
  98. data/app/controllers/spree/api/v3/admin/gift_cards_controller.rb +3 -2
  99. data/app/controllers/spree/api/v3/admin/imports_controller.rb +71 -8
  100. data/app/controllers/spree/api/v3/admin/integrations_controller.rb +67 -0
  101. data/app/controllers/spree/api/v3/admin/invitation_acceptances_controller.rb +5 -5
  102. data/app/controllers/spree/api/v3/admin/invitations_controller.rb +5 -1
  103. data/app/controllers/spree/api/v3/admin/locales_controller.rb +3 -1
  104. data/app/controllers/spree/api/v3/admin/markets_controller.rb +9 -5
  105. data/app/controllers/spree/api/v3/admin/me_controller.rb +4 -30
  106. data/app/controllers/spree/api/v3/admin/media_controller.rb +88 -38
  107. data/app/controllers/spree/api/v3/admin/media_library_controller.rb +156 -0
  108. data/app/controllers/spree/api/v3/admin/option_types_controller.rb +1 -0
  109. data/app/controllers/spree/api/v3/admin/order_cancellation_reasons_controller.rb +25 -0
  110. data/app/controllers/spree/api/v3/admin/order_groups_controller.rb +43 -0
  111. data/app/controllers/spree/api/v3/admin/order_routing_rules_controller.rb +1 -1
  112. data/app/controllers/spree/api/v3/admin/orders/claims_controller.rb +56 -0
  113. data/app/controllers/spree/api/v3/admin/orders/deliveries_controller.rb +66 -0
  114. data/app/controllers/spree/api/v3/admin/orders/discount_codes_controller.rb +86 -0
  115. data/app/controllers/spree/api/v3/admin/orders/discounts_controller.rb +99 -0
  116. data/app/controllers/spree/api/v3/admin/orders/exchanges_controller.rb +62 -0
  117. data/app/controllers/spree/api/v3/admin/orders/fees_controller.rb +83 -0
  118. data/app/controllers/spree/api/v3/admin/orders/fulfillments_controller.rb +45 -67
  119. data/app/controllers/spree/api/v3/admin/orders/items_controller.rb +40 -22
  120. data/app/controllers/spree/api/v3/admin/orders/labels_controller.rb +75 -0
  121. data/app/controllers/spree/api/v3/admin/orders/payments_controller.rb +36 -18
  122. data/app/controllers/spree/api/v3/admin/orders/refunds_controller.rb +39 -18
  123. data/app/controllers/spree/api/v3/admin/orders/returns_controller.rb +70 -0
  124. data/app/controllers/spree/api/v3/admin/orders/store_credits_controller.rb +2 -2
  125. data/app/controllers/spree/api/v3/admin/orders/tax_identifiers_controller.rb +41 -0
  126. data/app/controllers/spree/api/v3/admin/orders/tax_lines_controller.rb +32 -0
  127. data/app/controllers/spree/api/v3/admin/orders_controller.rb +157 -32
  128. data/app/controllers/spree/api/v3/admin/package_types_controller.rb +39 -0
  129. data/app/controllers/spree/api/v3/admin/password_resets_controller.rb +1 -1
  130. data/app/controllers/spree/api/v3/admin/payment_methods_controller.rb +15 -4
  131. data/app/controllers/spree/api/v3/admin/payout_providers_controller.rb +27 -0
  132. data/app/controllers/spree/api/v3/admin/permissions_controller.rb +30 -0
  133. data/app/controllers/spree/api/v3/admin/policies_controller.rb +42 -0
  134. data/app/controllers/spree/api/v3/admin/price_lists/products_controller.rb +93 -0
  135. data/app/controllers/spree/api/v3/admin/price_lists_controller.rb +43 -29
  136. data/app/controllers/spree/api/v3/admin/prices_controller.rb +41 -4
  137. data/app/controllers/spree/api/v3/admin/product_types_controller.rb +93 -0
  138. data/app/controllers/spree/api/v3/admin/products/digital_assets_controller.rb +148 -0
  139. data/app/controllers/spree/api/v3/admin/products/variants_controller.rb +24 -3
  140. data/app/controllers/spree/api/v3/admin/products_controller.rb +149 -33
  141. data/app/controllers/spree/api/v3/admin/promotion_actions_controller.rb +6 -2
  142. data/app/controllers/spree/api/v3/admin/promotion_rules_controller.rb +1 -1
  143. data/app/controllers/spree/api/v3/admin/promotions_controller.rb +1 -5
  144. data/app/controllers/spree/api/v3/admin/purchase_orders/stock_receipts_controller.rb +32 -0
  145. data/app/controllers/spree/api/v3/admin/purchase_orders_controller.rb +161 -0
  146. data/app/controllers/spree/api/v3/admin/refund_reasons_controller.rb +25 -0
  147. data/app/controllers/spree/api/v3/admin/reporting/saved_reports_controller.rb +45 -0
  148. data/app/controllers/spree/api/v3/admin/reporting_controller.rb +95 -0
  149. data/app/controllers/spree/api/v3/admin/resource_controller.rb +27 -10
  150. data/app/controllers/spree/api/v3/admin/return_reasons_controller.rb +25 -0
  151. data/app/controllers/spree/api/v3/admin/returns_controller.rb +31 -0
  152. data/app/controllers/spree/api/v3/admin/roles_controller.rb +50 -6
  153. data/app/controllers/spree/api/v3/admin/seller_payouts_controller.rb +83 -0
  154. data/app/controllers/spree/api/v3/admin/seller_requirement_submissions_controller.rb +139 -0
  155. data/app/controllers/spree/api/v3/admin/seller_requirements_controller.rb +115 -0
  156. data/app/controllers/spree/api/v3/admin/seller_transfers_controller.rb +36 -0
  157. data/app/controllers/spree/api/v3/admin/sellers/balances_controller.rb +44 -0
  158. data/app/controllers/spree/api/v3/admin/sellers/invitations_controller.rb +77 -0
  159. data/app/controllers/spree/api/v3/admin/sellers/payouts_controller.rb +107 -0
  160. data/app/controllers/spree/api/v3/admin/sellers/team_controller.rb +64 -0
  161. data/app/controllers/spree/api/v3/admin/sellers_controller.rb +197 -0
  162. data/app/controllers/spree/api/v3/admin/setup_controller.rb +231 -0
  163. data/app/controllers/spree/api/v3/admin/stock_levels_controller.rb +172 -0
  164. data/app/controllers/spree/api/v3/admin/stock_locations_controller.rb +3 -2
  165. data/app/controllers/spree/api/v3/admin/stock_movements_controller.rb +37 -0
  166. data/app/controllers/spree/api/v3/admin/stock_reservations_controller.rb +1 -1
  167. data/app/controllers/spree/api/v3/admin/stock_transfers/stock_receipts_controller.rb +31 -0
  168. data/app/controllers/spree/api/v3/admin/stock_transfers_controller.rb +134 -38
  169. data/app/controllers/spree/api/v3/admin/store_controller.rb +65 -0
  170. data/app/controllers/spree/api/v3/admin/store_credits/events_controller.rb +47 -0
  171. data/app/controllers/spree/api/v3/admin/store_credits_controller.rb +87 -0
  172. data/app/controllers/spree/api/v3/admin/suppliers_controller.rb +30 -0
  173. data/app/controllers/spree/api/v3/admin/tags_controller.rb +2 -2
  174. data/app/controllers/spree/api/v3/admin/tax_categories_controller.rb +4 -0
  175. data/app/controllers/spree/api/v3/admin/tax_providers_controller.rb +25 -0
  176. data/app/controllers/spree/api/v3/admin/tax_rates_controller.rb +33 -0
  177. data/app/controllers/spree/api/v3/admin/tracking_carriers_controller.rb +33 -0
  178. data/app/controllers/spree/api/v3/admin/translatable_resources_controller.rb +37 -9
  179. data/app/controllers/spree/api/v3/admin/translations_controller.rb +10 -5
  180. data/app/controllers/spree/api/v3/admin/translations_coverage_controller.rb +150 -0
  181. data/app/controllers/spree/api/v3/admin/variants_controller.rb +11 -4
  182. data/app/controllers/spree/api/v3/admin/webhook_endpoints_controller.rb +1 -1
  183. data/app/controllers/spree/api/v3/base_controller.rb +59 -16
  184. data/app/controllers/spree/api/v3/resource_controller.rb +154 -38
  185. data/app/controllers/spree/api/v3/seller/auth_controller.rb +169 -0
  186. data/app/controllers/spree/api/v3/seller/balances_controller.rb +35 -0
  187. data/app/controllers/spree/api/v3/seller/base_controller.rb +25 -0
  188. data/app/controllers/spree/api/v3/seller/claim_reasons_controller.rb +20 -0
  189. data/app/controllers/spree/api/v3/seller/countries_controller.rb +38 -0
  190. data/app/controllers/spree/api/v3/seller/delivery_methods_controller.rb +265 -0
  191. data/app/controllers/spree/api/v3/seller/delivery_profiles_controller.rb +65 -0
  192. data/app/controllers/spree/api/v3/seller/delivery_zones_controller.rb +41 -0
  193. data/app/controllers/spree/api/v3/seller/direct_uploads_controller.rb +21 -0
  194. data/app/controllers/spree/api/v3/seller/exports_controller.rb +195 -0
  195. data/app/controllers/spree/api/v3/seller/import_rows_controller.rb +49 -0
  196. data/app/controllers/spree/api/v3/seller/imports_controller.rb +317 -0
  197. data/app/controllers/spree/api/v3/seller/invitation_acceptances_controller.rb +152 -0
  198. data/app/controllers/spree/api/v3/seller/invitations_controller.rb +71 -0
  199. data/app/controllers/spree/api/v3/seller/me_controller.rb +72 -0
  200. data/app/controllers/spree/api/v3/seller/onboarding_controller.rb +111 -0
  201. data/app/controllers/spree/api/v3/seller/order_cancellation_reasons_controller.rb +25 -0
  202. data/app/controllers/spree/api/v3/seller/orders/base_controller.rb +44 -0
  203. data/app/controllers/spree/api/v3/seller/orders/claims_controller.rb +45 -0
  204. data/app/controllers/spree/api/v3/seller/orders/deliveries_controller.rb +38 -0
  205. data/app/controllers/spree/api/v3/seller/orders/exchanges_controller.rb +50 -0
  206. data/app/controllers/spree/api/v3/seller/orders/fulfillments_controller.rb +79 -0
  207. data/app/controllers/spree/api/v3/seller/orders/labels_controller.rb +55 -0
  208. data/app/controllers/spree/api/v3/seller/orders/notes_controller.rb +82 -0
  209. data/app/controllers/spree/api/v3/seller/orders/returns_controller.rb +44 -0
  210. data/app/controllers/spree/api/v3/seller/orders_controller.rb +199 -0
  211. data/app/controllers/spree/api/v3/seller/package_types_controller.rb +100 -0
  212. data/app/controllers/spree/api/v3/seller/password_resets_controller.rb +155 -0
  213. data/app/controllers/spree/api/v3/seller/payouts_controller.rb +47 -0
  214. data/app/controllers/spree/api/v3/seller/policies_controller.rb +57 -0
  215. data/app/controllers/spree/api/v3/seller/product_types_controller.rb +35 -0
  216. data/app/controllers/spree/api/v3/seller/products_controller.rb +394 -0
  217. data/app/controllers/spree/api/v3/seller/profile_controller.rb +137 -0
  218. data/app/controllers/spree/api/v3/seller/reasons_controller.rb +45 -0
  219. data/app/controllers/spree/api/v3/seller/requirement_submissions_controller.rb +95 -0
  220. data/app/controllers/spree/api/v3/seller/resource_controller.rb +75 -0
  221. data/app/controllers/spree/api/v3/seller/return_reasons_controller.rb +20 -0
  222. data/app/controllers/spree/api/v3/seller/stock_locations_controller.rb +56 -0
  223. data/app/controllers/spree/api/v3/seller/tax_identifiers_controller.rb +48 -0
  224. data/app/controllers/spree/api/v3/seller/team_controller.rb +103 -0
  225. data/app/controllers/spree/api/v3/seller/tracking_carriers_controller.rb +35 -0
  226. data/app/controllers/spree/api/v3/seller/transfers_controller.rb +43 -0
  227. data/app/controllers/spree/api/v3/store/account/companies_controller.rb +42 -0
  228. data/app/controllers/spree/api/v3/store/auth_controller.rb +21 -34
  229. data/app/controllers/spree/api/v3/store/base_controller.rb +4 -0
  230. data/app/controllers/spree/api/v3/store/carts/discount_codes_controller.rb +24 -2
  231. data/app/controllers/spree/api/v3/store/carts/fulfillments_controller.rb +41 -15
  232. data/app/controllers/spree/api/v3/store/carts/items_controller.rb +53 -20
  233. data/app/controllers/spree/api/v3/store/carts/payment_sessions_controller.rb +36 -20
  234. data/app/controllers/spree/api/v3/store/carts/po_documents_controller.rb +111 -0
  235. data/app/controllers/spree/api/v3/store/carts/store_credits_controller.rb +2 -2
  236. data/app/controllers/spree/api/v3/store/carts/tax_identifiers_controller.rb +96 -0
  237. data/app/controllers/spree/api/v3/store/carts_controller.rb +57 -12
  238. data/app/controllers/spree/api/v3/store/categories_controller.rb +6 -3
  239. data/app/controllers/spree/api/v3/store/collections/products_controller.rb +59 -0
  240. data/app/controllers/spree/api/v3/store/collections_controller.rb +36 -0
  241. data/app/controllers/spree/api/v3/store/companies/addresses_controller.rb +81 -0
  242. data/app/controllers/spree/api/v3/store/companies/base_controller.rb +24 -0
  243. data/app/controllers/spree/api/v3/store/companies/invitations_controller.rb +50 -0
  244. data/app/controllers/spree/api/v3/store/companies/members_controller.rb +66 -0
  245. data/app/controllers/spree/api/v3/store/companies/orders_controller.rb +28 -0
  246. data/app/controllers/spree/api/v3/store/companies_controller.rb +47 -0
  247. data/app/controllers/spree/api/v3/store/company_invitations_controller.rb +90 -0
  248. data/app/controllers/spree/api/v3/store/countries_controller.rb +8 -6
  249. data/app/controllers/spree/api/v3/store/customer/addresses_controller.rb +3 -1
  250. data/app/controllers/spree/api/v3/store/customer/data_requests_controller.rb +78 -0
  251. data/app/controllers/spree/api/v3/store/customer/digital_links_controller.rb +52 -0
  252. data/app/controllers/spree/api/v3/store/customer/orders_controller.rb +6 -0
  253. data/app/controllers/spree/api/v3/store/customer/password_resets_controller.rb +7 -3
  254. data/app/controllers/spree/api/v3/store/customer/payment_setup_sessions_controller.rb +3 -3
  255. data/app/controllers/spree/api/v3/store/customer/store_credits_controller.rb +0 -3
  256. data/app/controllers/spree/api/v3/store/customer/tax_identifiers_controller.rb +91 -0
  257. data/app/controllers/spree/api/v3/store/customers_controller.rb +26 -31
  258. data/app/controllers/spree/api/v3/store/data_feeds_controller.rb +11 -0
  259. data/app/controllers/spree/api/v3/store/data_request_downloads_controller.rb +58 -0
  260. data/app/controllers/spree/api/v3/store/delivery_methods_controller.rb +108 -0
  261. data/app/controllers/spree/api/v3/store/digital_links_controller.rb +105 -0
  262. data/app/controllers/spree/api/v3/store/markets/countries_controller.rb +5 -9
  263. data/app/controllers/spree/api/v3/store/markets_controller.rb +4 -4
  264. data/app/controllers/spree/api/v3/store/newsletter_subscribers_controller.rb +8 -9
  265. data/app/controllers/spree/api/v3/store/orders/claims_controller.rb +94 -0
  266. data/app/controllers/spree/api/v3/store/orders/returns_controller.rb +116 -0
  267. data/app/controllers/spree/api/v3/store/orders/tax_identifiers_controller.rb +46 -0
  268. data/app/controllers/spree/api/v3/store/orders_controller.rb +12 -15
  269. data/app/controllers/spree/api/v3/store/products/filters_controller.rb +10 -3
  270. data/app/controllers/spree/api/v3/store/products_controller.rb +25 -6
  271. data/app/controllers/spree/api/v3/store/resource_controller.rb +2 -0
  272. data/app/controllers/spree/api/v3/store/sellers_controller.rb +43 -0
  273. data/app/controllers/spree/api/v3/store/wishlist_items_controller.rb +9 -6
  274. data/app/controllers/spree/api/v3/store/wishlists_controller.rb +3 -3
  275. data/app/controllers/spree/api/v3/webhooks/fulfillments_controller.rb +88 -0
  276. data/app/controllers/spree/api/v3/webhooks/payments_controller.rb +5 -2
  277. data/app/controllers/spree/api/v3/webhooks/payouts_controller.rb +61 -0
  278. data/app/models/spree/api/data_request_urls.rb +25 -0
  279. data/app/models/spree/api/digital_link_urls.rb +26 -0
  280. data/app/serializers/spree/api/v3/address_serializer.rb +17 -5
  281. data/app/serializers/spree/api/v3/admin/address_serializer.rb +27 -4
  282. data/app/serializers/spree/api/v3/admin/admin_user_serializer.rb +13 -10
  283. data/app/serializers/spree/api/v3/admin/api_key_serializer.rb +1 -1
  284. data/app/serializers/spree/api/v3/admin/applied_promotion_serializer.rb +15 -0
  285. data/app/serializers/spree/api/v3/admin/cart_serializer.rb +34 -0
  286. data/app/serializers/spree/api/v3/admin/catalog_assignment_serializer.rb +32 -0
  287. data/app/serializers/spree/api/v3/admin/catalog_order_minimum_serializer.rb +23 -0
  288. data/app/serializers/spree/api/v3/admin/catalog_price_serializer.rb +48 -0
  289. data/app/serializers/spree/api/v3/admin/catalog_price_tier_serializer.rb +23 -0
  290. data/app/serializers/spree/api/v3/admin/catalog_product_serializer.rb +57 -0
  291. data/app/serializers/spree/api/v3/admin/catalog_product_term_serializer.rb +38 -0
  292. data/app/serializers/spree/api/v3/admin/catalog_quantity_rule_serializer.rb +37 -0
  293. data/app/serializers/spree/api/v3/admin/catalog_serializer.rb +46 -0
  294. data/app/serializers/spree/api/v3/admin/category_serializer.rb +3 -2
  295. data/app/serializers/spree/api/v3/admin/channel_serializer.rb +15 -1
  296. data/app/serializers/spree/api/v3/admin/claim_line_item_serializer.rb +16 -0
  297. data/app/serializers/spree/api/v3/admin/claim_reason_serializer.rb +21 -0
  298. data/app/serializers/spree/api/v3/admin/claim_serializer.rb +29 -0
  299. data/app/serializers/spree/api/v3/admin/collection_rule_serializer.rb +22 -0
  300. data/app/serializers/spree/api/v3/admin/collection_serializer.rb +29 -0
  301. data/app/serializers/spree/api/v3/admin/commission_line_serializer.rb +67 -0
  302. data/app/serializers/spree/api/v3/admin/commission_rate_serializer.rb +69 -0
  303. data/app/serializers/spree/api/v3/admin/commission_rule_serializer.rb +61 -0
  304. data/app/serializers/spree/api/v3/admin/company_invitation_serializer.rb +15 -0
  305. data/app/serializers/spree/api/v3/admin/company_membership_serializer.rb +11 -0
  306. data/app/serializers/spree/api/v3/admin/company_serializer.rb +37 -0
  307. data/app/serializers/spree/api/v3/admin/concerns/external_references_attribute.rb +33 -0
  308. data/app/serializers/spree/api/v3/admin/consent_record_serializer.rb +28 -0
  309. data/app/serializers/spree/api/v3/admin/country_serializer.rb +2 -2
  310. data/app/serializers/spree/api/v3/admin/credit_card_serializer.rb +1 -1
  311. data/app/serializers/spree/api/v3/admin/custom_field_definition_serializer.rb +2 -2
  312. data/app/serializers/spree/api/v3/admin/custom_field_serializer.rb +2 -2
  313. data/app/serializers/spree/api/v3/admin/customer_serializer.rb +23 -22
  314. data/app/serializers/spree/api/v3/admin/dashboard_counter_serializer.rb +24 -0
  315. data/app/serializers/spree/api/v3/admin/data_request_serializer.rb +36 -0
  316. data/app/serializers/spree/api/v3/admin/delivery_method_rule_serializer.rb +32 -0
  317. data/app/serializers/spree/api/v3/admin/delivery_method_serializer.rb +66 -1
  318. data/app/serializers/spree/api/v3/admin/delivery_method_service_serializer.rb +15 -0
  319. data/app/serializers/spree/api/v3/admin/delivery_origin_group_serializer.rb +34 -0
  320. data/app/serializers/spree/api/v3/admin/delivery_profile_serializer.rb +65 -0
  321. data/app/serializers/spree/api/v3/admin/delivery_rate_serializer.rb +10 -1
  322. data/app/serializers/spree/api/v3/admin/delivery_serializer.rb +20 -0
  323. data/app/serializers/spree/api/v3/admin/delivery_zone_member_serializer.rb +11 -0
  324. data/app/serializers/spree/api/v3/admin/delivery_zone_serializer.rb +29 -0
  325. data/app/serializers/spree/api/v3/admin/digital_asset_serializer.rb +59 -0
  326. data/app/serializers/spree/api/v3/admin/discount_serializer.rb +3 -4
  327. data/app/serializers/spree/api/v3/admin/exchange_line_item_serializer.rb +16 -0
  328. data/app/serializers/spree/api/v3/admin/exchange_serializer.rb +35 -0
  329. data/app/serializers/spree/api/v3/admin/export_serializer.rb +20 -1
  330. data/app/serializers/spree/api/v3/admin/fee_serializer.rb +14 -0
  331. data/app/serializers/spree/api/v3/admin/freight_summary_line_serializer.rb +46 -0
  332. data/app/serializers/spree/api/v3/admin/freight_summary_serializer.rb +16 -0
  333. data/app/serializers/spree/api/v3/admin/fulfillment_item_serializer.rb +39 -0
  334. data/app/serializers/spree/api/v3/admin/fulfillment_serializer.rb +31 -9
  335. data/app/serializers/spree/api/v3/admin/gift_card_serializer.rb +2 -3
  336. data/app/serializers/spree/api/v3/admin/import_serializer.rb +15 -2
  337. data/app/serializers/spree/api/v3/admin/integration_serializer.rb +32 -0
  338. data/app/serializers/spree/api/v3/admin/invitation_serializer.rb +4 -4
  339. data/app/serializers/spree/api/v3/admin/line_item_serializer.rb +19 -5
  340. data/app/serializers/spree/api/v3/admin/market_serializer.rb +5 -1
  341. data/app/serializers/spree/api/v3/admin/media_serializer.rb +50 -2
  342. data/app/serializers/spree/api/v3/admin/membership_product_serializer.rb +29 -0
  343. data/app/serializers/spree/api/v3/admin/order_cancellation_reason_serializer.rb +29 -0
  344. data/app/serializers/spree/api/v3/admin/order_group_serializer.rb +50 -0
  345. data/app/serializers/spree/api/v3/admin/order_routing_rule_serializer.rb +2 -6
  346. data/app/serializers/spree/api/v3/admin/order_serializer.rb +131 -19
  347. data/app/serializers/spree/api/v3/admin/package_type_serializer.rb +53 -0
  348. data/app/serializers/spree/api/v3/admin/payment_method_serializer.rb +8 -2
  349. data/app/serializers/spree/api/v3/admin/payment_serializer.rb +6 -0
  350. data/app/serializers/spree/api/v3/admin/payment_split_serializer.rb +41 -0
  351. data/app/serializers/spree/api/v3/admin/permission_serializer.rb +39 -0
  352. data/app/serializers/spree/api/v3/admin/policy_serializer.rb +11 -0
  353. data/app/serializers/spree/api/v3/admin/price_adjustment_tier_serializer.rb +22 -0
  354. data/app/serializers/spree/api/v3/admin/price_list_product_serializer.rb +32 -0
  355. data/app/serializers/spree/api/v3/admin/price_list_serializer.rb +20 -8
  356. data/app/serializers/spree/api/v3/admin/price_rule_serializer.rb +2 -12
  357. data/app/serializers/spree/api/v3/admin/price_serializer.rb +3 -0
  358. data/app/serializers/spree/api/v3/admin/product_serializer.rb +54 -8
  359. data/app/serializers/spree/api/v3/admin/product_submission_serializer.rb +39 -0
  360. data/app/serializers/spree/api/v3/admin/product_type_custom_field_definition_serializer.rb +44 -0
  361. data/app/serializers/spree/api/v3/admin/product_type_serializer.rb +34 -0
  362. data/app/serializers/spree/api/v3/admin/promotion_action_serializer.rb +6 -12
  363. data/app/serializers/spree/api/v3/admin/promotion_rule_serializer.rb +17 -15
  364. data/app/serializers/spree/api/v3/admin/purchase_order_item_serializer.rb +80 -0
  365. data/app/serializers/spree/api/v3/admin/purchase_order_serializer.rb +94 -0
  366. data/app/serializers/spree/api/v3/admin/refund_reason_serializer.rb +27 -0
  367. data/app/serializers/spree/api/v3/admin/refund_serializer.rb +0 -5
  368. data/app/serializers/spree/api/v3/admin/reporting_result_serializer.rb +72 -0
  369. data/app/serializers/spree/api/v3/admin/return_line_item_serializer.rb +16 -0
  370. data/app/serializers/spree/api/v3/admin/return_reason_serializer.rb +21 -0
  371. data/app/serializers/spree/api/v3/admin/return_serializer.rb +59 -0
  372. data/app/serializers/spree/api/v3/admin/role_serializer.rb +24 -6
  373. data/app/serializers/spree/api/v3/admin/saved_report_serializer.rb +33 -0
  374. data/app/serializers/spree/api/v3/admin/seller_balance_serializer.rb +37 -0
  375. data/app/serializers/spree/api/v3/admin/seller_payout_serializer.rb +46 -0
  376. data/app/serializers/spree/api/v3/admin/seller_requirement_serializer.rb +68 -0
  377. data/app/serializers/spree/api/v3/admin/seller_requirement_status_serializer.rb +48 -0
  378. data/app/serializers/spree/api/v3/admin/seller_requirement_submission_serializer.rb +57 -0
  379. data/app/serializers/spree/api/v3/admin/seller_serializer.rb +92 -0
  380. data/app/serializers/spree/api/v3/admin/seller_team_member_serializer.rb +29 -0
  381. data/app/serializers/spree/api/v3/admin/seller_transfer_serializer.rb +53 -0
  382. data/app/serializers/spree/api/v3/admin/shipping_label_serializer.rb +82 -0
  383. data/app/serializers/spree/api/v3/admin/state_serializer.rb +1 -1
  384. data/app/serializers/spree/api/v3/admin/stock_level_serializer.rb +65 -0
  385. data/app/serializers/spree/api/v3/admin/stock_location_serializer.rb +20 -4
  386. data/app/serializers/spree/api/v3/admin/stock_movement_serializer.rb +116 -0
  387. data/app/serializers/spree/api/v3/admin/stock_receipt_item_serializer.rb +57 -0
  388. data/app/serializers/spree/api/v3/admin/stock_receipt_serializer.rb +49 -0
  389. data/app/serializers/spree/api/v3/admin/stock_reservation_serializer.rb +5 -5
  390. data/app/serializers/spree/api/v3/admin/stock_transfer_item_serializer.rb +57 -0
  391. data/app/serializers/spree/api/v3/admin/stock_transfer_serializer.rb +36 -16
  392. data/app/serializers/spree/api/v3/admin/store_credit_event_serializer.rb +32 -0
  393. data/app/serializers/spree/api/v3/admin/store_credit_serializer.rb +42 -7
  394. data/app/serializers/spree/api/v3/admin/store_serializer.rb +63 -1
  395. data/app/serializers/spree/api/v3/admin/supplier_serializer.rb +39 -0
  396. data/app/serializers/spree/api/v3/admin/tax_exemption_certificate_serializer.rb +67 -0
  397. data/app/serializers/spree/api/v3/admin/tax_identifier_serializer.rb +43 -0
  398. data/app/serializers/spree/api/v3/admin/tax_line_serializer.rb +21 -0
  399. data/app/serializers/spree/api/v3/admin/tax_rate_serializer.rb +49 -0
  400. data/app/serializers/spree/api/v3/admin/variant_serializer.rb +49 -8
  401. data/app/serializers/spree/api/v3/applied_promotion_serializer.rb +23 -0
  402. data/app/serializers/spree/api/v3/base_serializer.rb +39 -2
  403. data/app/serializers/spree/api/v3/cart_serializer.rb +90 -12
  404. data/app/serializers/spree/api/v3/category_serializer.rb +3 -3
  405. data/app/serializers/spree/api/v3/claim_line_item_serializer.rb +50 -0
  406. data/app/serializers/spree/api/v3/claim_reason_serializer.rb +20 -0
  407. data/app/serializers/spree/api/v3/claim_serializer.rb +62 -0
  408. data/app/serializers/spree/api/v3/collection_serializer.rb +41 -0
  409. data/app/serializers/spree/api/v3/company_invitation_serializer.rb +28 -0
  410. data/app/serializers/spree/api/v3/company_membership_serializer.rb +28 -0
  411. data/app/serializers/spree/api/v3/company_serializer.rb +33 -0
  412. data/app/serializers/spree/api/v3/custom_field_serializer.rb +2 -2
  413. data/app/serializers/spree/api/v3/customer_serializer.rb +9 -1
  414. data/app/serializers/spree/api/v3/data_request_event_serializer.rb +30 -0
  415. data/app/serializers/spree/api/v3/data_request_serializer.rb +40 -0
  416. data/app/serializers/spree/api/v3/delivery_method_serializer.rb +12 -2
  417. data/app/serializers/spree/api/v3/delivery_rate_serializer.rb +34 -17
  418. data/app/serializers/spree/api/v3/delivery_serializer.rb +29 -0
  419. data/app/serializers/spree/api/v3/delivery_zone_member_serializer.rb +29 -0
  420. data/app/serializers/spree/api/v3/delivery_zone_serializer.rb +13 -0
  421. data/app/serializers/spree/api/v3/digital_asset_serializer.rb +23 -0
  422. data/app/serializers/spree/api/v3/digital_link_serializer.rb +6 -2
  423. data/app/serializers/spree/api/v3/discount_serializer.rb +21 -7
  424. data/app/serializers/spree/api/v3/exchange_line_item_serializer.rb +53 -0
  425. data/app/serializers/spree/api/v3/exchange_serializer.rb +61 -0
  426. data/app/serializers/spree/api/v3/fee_serializer.rb +27 -0
  427. data/app/serializers/spree/api/v3/freight_summary_serializer.rb +38 -0
  428. data/app/serializers/spree/api/v3/fulfillment_serializer.rb +28 -15
  429. data/app/serializers/spree/api/v3/gift_card_serializer.rb +2 -2
  430. data/app/serializers/spree/api/v3/import_row_serializer.rb +1 -1
  431. data/app/serializers/spree/api/v3/import_serializer.rb +18 -4
  432. data/app/serializers/spree/api/v3/invitation_serializer.rb +1 -1
  433. data/app/serializers/spree/api/v3/line_item_serializer.rb +18 -1
  434. data/app/serializers/spree/api/v3/market_serializer.rb +2 -2
  435. data/app/serializers/spree/api/v3/{asset_serializer.rb → media_event_serializer.rb} +4 -4
  436. data/app/serializers/spree/api/v3/media_serializer.rb +48 -7
  437. data/app/serializers/spree/api/v3/newsletter_subscriber_serializer.rb +1 -1
  438. data/app/serializers/spree/api/v3/option_type_serializer.rb +1 -1
  439. data/app/serializers/spree/api/v3/order_group_serializer.rb +60 -0
  440. data/app/serializers/spree/api/v3/order_serializer.rb +58 -6
  441. data/app/serializers/spree/api/v3/payment_method_serializer.rb +1 -1
  442. data/app/serializers/spree/api/v3/payment_serializer.rb +2 -6
  443. data/app/serializers/spree/api/v3/payment_session_serializer.rb +10 -3
  444. data/app/serializers/spree/api/v3/payment_setup_session_serializer.rb +1 -1
  445. data/app/serializers/spree/api/v3/policy_serializer.rb +7 -2
  446. data/app/serializers/spree/api/v3/product_filter_option_serializer.rb +1 -1
  447. data/app/serializers/spree/api/v3/product_serializer.rb +42 -10
  448. data/app/serializers/spree/api/v3/product_type_serializer.rb +17 -0
  449. data/app/serializers/spree/api/v3/purchase_order_event_serializer.rb +11 -0
  450. data/app/serializers/spree/api/v3/refund_serializer.rb +9 -3
  451. data/app/serializers/spree/api/v3/return_line_item_serializer.rb +42 -0
  452. data/app/serializers/spree/api/v3/return_reason_serializer.rb +20 -0
  453. data/app/serializers/spree/api/v3/return_serializer.rb +62 -0
  454. data/app/serializers/spree/api/v3/seller/balance_serializer.rb +35 -0
  455. data/app/serializers/spree/api/v3/seller/claim_line_item_serializer.rb +21 -0
  456. data/app/serializers/spree/api/v3/seller/claim_serializer.rb +25 -0
  457. data/app/serializers/spree/api/v3/seller/delivery_method_rule_serializer.rb +32 -0
  458. data/app/serializers/spree/api/v3/seller/delivery_method_serializer.rb +59 -0
  459. data/app/serializers/spree/api/v3/seller/delivery_profile_serializer.rb +26 -0
  460. data/app/serializers/spree/api/v3/seller/delivery_rate_serializer.rb +35 -0
  461. data/app/serializers/spree/api/v3/seller/delivery_serializer.rb +17 -0
  462. data/app/serializers/spree/api/v3/seller/delivery_zone_serializer.rb +26 -0
  463. data/app/serializers/spree/api/v3/seller/exchange_line_item_serializer.rb +29 -0
  464. data/app/serializers/spree/api/v3/seller/exchange_serializer.rb +30 -0
  465. data/app/serializers/spree/api/v3/seller/export_serializer.rb +44 -0
  466. data/app/serializers/spree/api/v3/seller/fulfillment_item_serializer.rb +43 -0
  467. data/app/serializers/spree/api/v3/seller/fulfillment_serializer.rb +76 -0
  468. data/app/serializers/spree/api/v3/seller/import_mapping_serializer.rb +20 -0
  469. data/app/serializers/spree/api/v3/seller/import_row_serializer.rb +17 -0
  470. data/app/serializers/spree/api/v3/seller/import_serializer.rb +77 -0
  471. data/app/serializers/spree/api/v3/seller/invitation_serializer.rb +29 -0
  472. data/app/serializers/spree/api/v3/seller/media_serializer.rb +26 -0
  473. data/app/serializers/spree/api/v3/seller/order_line_item_serializer.rb +44 -0
  474. data/app/serializers/spree/api/v3/seller/order_serializer.rb +119 -0
  475. data/app/serializers/spree/api/v3/seller/package_type_serializer.rb +52 -0
  476. data/app/serializers/spree/api/v3/seller/payment_split_serializer.rb +34 -0
  477. data/app/serializers/spree/api/v3/seller/payout_serializer.rb +36 -0
  478. data/app/serializers/spree/api/v3/seller/policy_serializer.rb +11 -0
  479. data/app/serializers/spree/api/v3/seller/product_serializer.rb +60 -0
  480. data/app/serializers/spree/api/v3/seller/product_submission_serializer.rb +30 -0
  481. data/app/serializers/spree/api/v3/seller/product_type_serializer.rb +29 -0
  482. data/app/serializers/spree/api/v3/seller/profile_serializer.rb +77 -0
  483. data/app/serializers/spree/api/v3/seller/reason_serializer.rb +24 -0
  484. data/app/serializers/spree/api/v3/seller/requirement_custom_field_serializer.rb +36 -0
  485. data/app/serializers/spree/api/v3/seller/requirement_status_serializer.rb +62 -0
  486. data/app/serializers/spree/api/v3/seller/requirement_submission_serializer.rb +33 -0
  487. data/app/serializers/spree/api/v3/seller/return_line_item_serializer.rb +24 -0
  488. data/app/serializers/spree/api/v3/seller/return_serializer.rb +51 -0
  489. data/app/serializers/spree/api/v3/seller/shipping_label_serializer.rb +23 -0
  490. data/app/serializers/spree/api/v3/seller/stock_level_serializer.rb +27 -0
  491. data/app/serializers/spree/api/v3/seller/stock_location_serializer.rb +17 -0
  492. data/app/serializers/spree/api/v3/seller/tax_identifier_serializer.rb +15 -0
  493. data/app/serializers/spree/api/v3/seller/team_member_serializer.rb +22 -0
  494. data/app/serializers/spree/api/v3/seller/transfer_serializer.rb +49 -0
  495. data/app/serializers/spree/api/v3/seller/variant_serializer.rb +71 -0
  496. data/app/serializers/spree/api/v3/seller_serializer.rb +50 -0
  497. data/app/serializers/spree/api/v3/shipping_label_event_serializer.rb +11 -0
  498. data/app/serializers/spree/api/v3/{stock_item_serializer.rb → stock_level_serializer.rb} +5 -5
  499. data/app/serializers/spree/api/v3/stock_location_serializer.rb +11 -7
  500. data/app/serializers/spree/api/v3/stock_movement_serializer.rb +8 -15
  501. data/app/serializers/spree/api/v3/stock_receipt_event_serializer.rb +11 -0
  502. data/app/serializers/spree/api/v3/stock_transfer_serializer.rb +6 -6
  503. data/app/serializers/spree/api/v3/store_credit_event_serializer.rb +29 -0
  504. data/app/serializers/spree/api/v3/supplier_event_serializer.rb +11 -0
  505. data/app/serializers/spree/api/v3/tax_identifier_serializer.rb +15 -0
  506. data/app/serializers/spree/api/v3/tax_line_serializer.rb +37 -0
  507. data/app/serializers/spree/api/v3/variant_serializer.rb +52 -2
  508. data/app/serializers/spree/api/v3/wishlist_item_serializer.rb +6 -6
  509. data/app/serializers/spree/api/v3/wishlist_serializer.rb +1 -1
  510. data/app/services/spree/api/v3/filters_aggregator.rb +14 -12
  511. data/app/services/spree/webhooks/deliver_webhook.rb +62 -26
  512. data/app/subscribers/spree/webhook_event_subscriber.rb +9 -5
  513. data/config/brakeman.ignore +1 -1
  514. data/config/initializers/typelizer.rb +51 -4
  515. data/config/locales/en.yml +5 -0
  516. data/config/routes.rb +730 -22
  517. data/lib/spree/api/configuration.rb +2 -7
  518. data/lib/spree/api/dependencies.rb +173 -227
  519. data/lib/spree/api/openapi/schema_helper.rb +179 -13
  520. data/lib/spree/api/testing_support/v3/base.rb +45 -15
  521. data/lib/spree/api.rb +10 -4
  522. data/lib/typelizer/open_enums.rb +35 -0
  523. metadata +341 -27
  524. data/app/controllers/spree/api/v3/admin/orders/adjustments_controller.rb +0 -25
  525. data/app/controllers/spree/api/v3/admin/stock_items_controller.rb +0 -42
  526. data/app/controllers/spree/api/v3/admin/store_credit_categories_controller.rb +0 -21
  527. data/app/controllers/spree/api/v3/store/digitals_controller.rb +0 -38
  528. data/app/serializers/spree/api/v3/admin/adjustment_serializer.rb +0 -24
  529. data/app/serializers/spree/api/v3/admin/dashboard_analytics_serializer.rb +0 -143
  530. data/app/serializers/spree/api/v3/admin/reimbursement_serializer.rb +0 -15
  531. data/app/serializers/spree/api/v3/admin/return_authorization_serializer.rb +0 -19
  532. data/app/serializers/spree/api/v3/admin/stock_item_serializer.rb +0 -34
  533. data/app/serializers/spree/api/v3/admin/store_credit_category_serializer.rb +0 -19
  534. data/app/serializers/spree/api/v3/customer_return_serializer.rb +0 -17
  535. data/app/serializers/spree/api/v3/digital_serializer.rb +0 -17
  536. data/app/serializers/spree/api/v3/reimbursement_serializer.rb +0 -27
  537. data/app/serializers/spree/api/v3/report_serializer.rb +0 -34
  538. data/app/serializers/spree/api/v3/return_authorization_serializer.rb +0 -31
  539. data/app/serializers/spree/api/v3/return_item_serializer.rb +0 -53
  540. data/app/serializers/spree/api/v3/shipping_category_serializer.rb +0 -11
@@ -0,0 +1,54 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ # The `items` list a request names, for the endpoints that take one:
5
+ # receiving a return, an exchange, a claim, a stock transfer or a
6
+ # purchase order, and opening any of them.
7
+ #
8
+ # The distinction all of them need is between *omitted* and *empty*. An
9
+ # omitted `items` means "all of it, as recorded" — receive the whole
10
+ # return, the whole delivery. An empty list, or an explicit `null`, means
11
+ # the caller named nothing, and must not fall through to that default.
12
+ module ItemsPayload
13
+ extend ActiveSupport::Concern
14
+
15
+ # A payload whose `items` is not a list. Raised out of the params
16
+ # helper so it cannot be mistaken for a workflow rejection, and
17
+ # answered as the client mistake it is rather than a 500.
18
+ class InvalidItems < StandardError; end
19
+
20
+ included do
21
+ rescue_from InvalidItems, with: :render_invalid_items
22
+ end
23
+
24
+ protected
25
+
26
+ # @param keys [Array<Symbol>] the per-item keys to permit
27
+ # @return [Array<ActionController::Parameters>, nil] nil when the
28
+ # payload said nothing about items
29
+ def items_payload(keys)
30
+ return nil unless params.key?(:items)
31
+
32
+ raw = params[:items]
33
+ return [] if raw.nil?
34
+ # Checked before `permit`, which silently drops a scalar `items` —
35
+ # leaving a client typo indistinguishable from "named nothing".
36
+ raise InvalidItems unless raw.is_a?(Array)
37
+
38
+ params.permit(items: keys)[:items] || []
39
+ end
40
+
41
+ # Reported against `:base`, not `:items`. The payload is malformed
42
+ # rather than a field being wrong, and ActiveModel reads the named
43
+ # attribute off the record to interpolate a message — which raises for
44
+ # every record whose lines are not called `items` (a return's are
45
+ # `return_line_items`).
46
+ def render_invalid_items
47
+ errors = ActiveModel::Errors.new(@resource || model_class.new)
48
+ errors.add(:base, :invalid_items, message: Spree.t('errors.messages.items_not_a_list'))
49
+ render_validation_error(errors)
50
+ end
51
+ end
52
+ end
53
+ end
54
+ end
@@ -11,6 +11,11 @@ module Spree
11
11
 
12
12
  JWT_AUDIENCE_STORE = 'store_api'.freeze
13
13
  JWT_AUDIENCE_ADMIN = 'admin_api'.freeze
14
+ # Marketplace sellers share the admin user class, so the audience — not
15
+ # the principal — is what keeps a seller's token off the admin API and
16
+ # an admin's off the seller panel. Enforced at decode, before any store
17
+ # or seller is resolved.
18
+ JWT_AUDIENCE_SELLER = 'seller_api'.freeze
14
19
  JWT_ISSUER = 'spree'.freeze
15
20
 
16
21
  included do
@@ -67,8 +72,12 @@ module Spree
67
72
  header = request.headers['Authorization']
68
73
  return header.split(' ').last if header.present? && header.start_with?('Bearer ')
69
74
 
70
- # Restricted fallback: only for digital download endpoints
71
- params[:token] if controller_name == 'digitals'
75
+ # Restricted fallback: only the storefront tokenized download
76
+ # endpoint, which carries its link token in the query string. The
77
+ # customer library and admin grant endpoints share the controller
78
+ # name but authenticate by header, so matching on the name alone
79
+ # would let their bearer JWTs travel in the URL (logs, history).
80
+ params[:token] if controller_path == 'spree/api/v3/store/digital_links'
72
81
  end
73
82
 
74
83
  def decode_jwt(token)
@@ -104,10 +113,21 @@ module Spree
104
113
  when USER_TYPE_ADMIN
105
114
  Spree.admin_user_class.find(user_id)
106
115
  else
107
- Spree.user_class.find(user_id)
116
+ customer_from(user_id)
108
117
  end
109
118
  end
110
119
 
120
+ # An erased account stops answering to its old tokens. Clearing the
121
+ # password blocks a fresh sign-in, but a JWT issued before the erasure
122
+ # would otherwise keep working until it expired — long enough to write
123
+ # a name and phone back onto the record, after which a second erasure
124
+ # is refused as already done.
125
+ def customer_from(user_id)
126
+ customer = Spree.customer_class.find(user_id)
127
+
128
+ customer.respond_to?(:anonymized?) && customer.anonymized? ? nil : customer
129
+ end
130
+
111
131
  def determine_user_type(user)
112
132
  if user.is_a?(Spree.admin_user_class)
113
133
  USER_TYPE_ADMIN
@@ -0,0 +1,31 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ # Store API store context: the publishable key selects the store (the
5
+ # key belongs to exactly one store) — the request host is never
6
+ # consulted. See docs/plans/6.0-store-context-and-first-run-setup.md.
7
+ #
8
+ # Included in both Store API branch anchors (Store::BaseController and
9
+ # Store::ResourceController) alongside ApiKeyAuthentication, whose
10
+ # memoized +publishable_api_key+ lookup this reads — pre-authentication
11
+ # callbacks (channel resolution, locale fallbacks) resolve the same key
12
+ # row authentication later verifies.
13
+ module KeyStoreContext
14
+ extend ActiveSupport::Concern
15
+
16
+ included do
17
+ # An invalid or missing key must render 401 from
18
+ # +authenticate_api_key!+ — without this skip the store-presence
19
+ # guard would 404 first on the ResourceController branch, where it
20
+ # runs ahead of authentication.
21
+ skip_before_action :raise_record_not_found_if_store_is_not_found
22
+ end
23
+
24
+ # @return [Spree::Store, nil]
25
+ def current_store
26
+ @current_store ||= publishable_api_key&.store
27
+ end
28
+ end
29
+ end
30
+ end
31
+ end
@@ -171,10 +171,10 @@ module Spree
171
171
  # When a matching market is found, it is set on +Spree::Current.market+,
172
172
  # which influences the default locale and currency fallbacks.
173
173
  def set_market_from_country
174
- country_iso = request.headers['x-spree-country'].presence || params[:country].presence
175
- return unless country_iso
174
+ country_code = request.headers['x-spree-country'].presence || params[:country].presence
175
+ return unless country_code
176
176
 
177
- country = Spree::Country.find_by(iso: country_iso.upcase)
177
+ country = Spree::Country.by_iso(country_code)
178
178
  return unless country
179
179
 
180
180
  market = current_store&.market_for_country(country)
@@ -15,15 +15,34 @@ module Spree
15
15
  order = @order || @parent || @cart
16
16
 
17
17
  order.with_lock do
18
+ # Completed carts are readonly — nothing left to version-bump;
19
+ # the row lock alone still serializes the idempotent paths.
20
+ next yield if order.readonly?
21
+
22
+ # A completion attempt fixed this cart's totals under the lock and
23
+ # is now off at the gateway — mutating the cart mid-window would
24
+ # complete it with different totals than the ones being charged.
25
+ # The completion claim excludes mutations for exactly that window;
26
+ # checked after acquiring the lock so it cannot race the claim
27
+ # being written. The TTL matches guard_concurrent_completion — a
28
+ # crashed completion must not brick its cart.
29
+ if order.is_a?(Spree::Cart) && order.completion_claimed?
30
+ next render_error(
31
+ code: 'completion_in_progress',
32
+ message: Spree.t(:cart_completion_in_progress),
33
+ status: :conflict
34
+ )
35
+ end
36
+
18
37
  # Persist increment within the transaction so reloads inside yield see the new version
19
- new_version = order.state_lock_version + 1
20
- order.update_column(:state_lock_version, new_version)
38
+ new_version = order.lock_version + 1
39
+ order.update_column(:lock_version, new_version)
21
40
 
22
41
  yield
23
42
 
24
43
  if performed? && response.status >= 400
25
44
  # Operation failed — revert the increment
26
- order.update_column(:state_lock_version, new_version - 1)
45
+ order.update_column(:lock_version, new_version - 1)
27
46
  end
28
47
  end
29
48
  end
@@ -0,0 +1,112 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Orders
5
+ # Something went wrong with a delivery, and the merchant makes it
6
+ # right — money back, a replacement, or both — without necessarily
7
+ # asking for the goods back.
8
+ #
9
+ # See {PostSaleActions} for why the lookups a payload's ids resolve
10
+ # through are deliberately left to the including controller.
11
+ module ClaimActions
12
+ extend ActiveSupport::Concern
13
+ include PostSaleActions
14
+
15
+ # POST .../claims
16
+ def create
17
+ create_post_sale_record(Spree.claim_create_workflow, Spree::Claim)
18
+ end
19
+
20
+ # PATCH .../claims/:id/approve
21
+ def approve
22
+ run_workflow(Spree.claim_approve_workflow, approver: try_spree_current_user)
23
+ end
24
+
25
+ # PATCH .../claims/:id/resolve — a refund, a replacement, or both.
26
+ def resolve
27
+ run_workflow(Spree.claim_resolve_workflow,
28
+ resolution: params[:resolution],
29
+ refund_method: params[:refund_method] || 'store_credit',
30
+ amount: params[:amount],
31
+ replacement_line_item_ids: replacement_line_item_ids,
32
+ resolver: try_spree_current_user)
33
+ end
34
+
35
+ # PATCH .../claims/:id/deny
36
+ def deny
37
+ run_workflow(Spree.claim_deny_workflow, reason: params[:reason])
38
+ end
39
+
40
+ # PATCH .../claims/:id/cancel
41
+ def cancel
42
+ run_workflow(Spree.claim_cancel_workflow, reason: params[:reason])
43
+ end
44
+
45
+ protected
46
+
47
+ def model_class
48
+ Spree::Claim
49
+ end
50
+
51
+ def parent_association
52
+ :claims
53
+ end
54
+
55
+ def workflow_record_key
56
+ :claim
57
+ end
58
+
59
+ private
60
+
61
+ def create_params
62
+ @create_params ||= params.permit(
63
+ :memo, :reason_id,
64
+ items: [:line_item_id, :quantity, :description, :send_replacement,
65
+ :replacement_variant_id, :refund_amount]
66
+ )
67
+ end
68
+
69
+ # Every claimed line is resolved through the order itself, so a line
70
+ # item from another order cannot be claimed against this one.
71
+ def items_for_create
72
+ Array(create_params[:items]).map do |item|
73
+ {
74
+ line_item: @order.line_items.find_by_prefix_id!(item[:line_item_id]),
75
+ quantity: item[:quantity].to_i,
76
+ description: item[:description],
77
+ send_replacement: item[:send_replacement].to_b,
78
+ replacement_variant: replacement_variant_for(item[:replacement_variant_id]),
79
+ refund_amount: item[:refund_amount]
80
+ }
81
+ end
82
+ end
83
+
84
+ # Which lines to replace, decided at resolution time. Absent means
85
+ # "leave whatever the claim was opened with".
86
+ def replacement_line_item_ids
87
+ return nil unless params.key?(:replacement_line_item_ids)
88
+
89
+ Array(params[:replacement_line_item_ids]).map do |id|
90
+ @resource.claim_line_items.find_by_prefix_id!(id).id
91
+ end
92
+ end
93
+
94
+ def reason_for_create
95
+ return nil if create_params[:reason_id].blank?
96
+
97
+ current_store.claim_reasons.find_by_prefix_id!(create_params[:reason_id])
98
+ end
99
+
100
+ # The catalogue a replacement may be promised from. Left to the
101
+ # including controller precisely because getting it wrong would let
102
+ # one seller ship another's stock.
103
+ #
104
+ # @return [Spree::Variant, nil]
105
+ def replacement_variant_for(_variant_id)
106
+ raise NotImplementedError, "#{self.class} must implement #replacement_variant_for"
107
+ end
108
+ end
109
+ end
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,105 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Orders
5
+ # The consignments of one fulfillment — a parcel each, or a freight
6
+ # PRO number covering several pallets.
7
+ #
8
+ # A delivery is born when a tracking number is attached, days before
9
+ # anything arrives, so POST means "this went out as another
10
+ # consignment"; arrival is a transition on an existing row.
11
+ #
12
+ # Shared by the operator's branch and the seller's. `@parent` (the
13
+ # fulfillment) and `@resource` arrive already fetched and authorized,
14
+ # so including this concern cannot widen what a caller reaches.
15
+ module DeliveryActions
16
+ extend ActiveSupport::Concern
17
+
18
+ # POST .../deliveries
19
+ def create
20
+ authorize!(:create, Spree::Delivery)
21
+
22
+ with_order_lock do
23
+ # Every key is passed whether or not the request carried it, so
24
+ # the service sees a missing tracking number as a blank one to
25
+ # reject rather than a keyword it was never given.
26
+ result = Spree.delivery_create_service.call(
27
+ owner: @parent,
28
+ **resource_permitted_attributes.index_with { |key| delivery_params[key] }
29
+ )
30
+
31
+ if result.success?
32
+ render json: serialize_resource(result.value), status: :created
33
+ else
34
+ render_result_error(result)
35
+ end
36
+ end
37
+ end
38
+
39
+ # PATCH .../deliveries/:id — correcting the number, carrier or link.
40
+ #
41
+ # A corrected number is a different parcel as far as the carrier is
42
+ # concerned: its journey starts over, and the carrier and link that
43
+ # belonged to the old number go with it unless this request supplies
44
+ # new ones. A consignment that started over may also have been the
45
+ # one holding the fulfillment at delivered.
46
+ def update
47
+ with_order_lock do
48
+ if @resource.update(@resource.correction_attributes(delivery_params.to_h))
49
+ recalculate_fulfillment_delivery
50
+ render json: serialize_resource(@resource.reload)
51
+ else
52
+ render_validation_error(@resource.errors)
53
+ end
54
+ end
55
+ end
56
+
57
+ # DELETE .../deliveries/:id — 422 when a label minted it.
58
+ def destroy
59
+ with_order_lock do
60
+ result = Spree.delivery_destroy_service.call(delivery: @resource)
61
+
62
+ if result.success?
63
+ head :no_content
64
+ else
65
+ render_result_error(result)
66
+ end
67
+ end
68
+ end
69
+
70
+ protected
71
+
72
+ def model_class
73
+ Spree::Delivery
74
+ end
75
+
76
+ def parent_association
77
+ :deliveries
78
+ end
79
+
80
+ def collection_includes
81
+ [:shipping_label]
82
+ end
83
+
84
+ def resource_permitted_attributes
85
+ [:tracking_number, :carrier, :service, :tracking_url]
86
+ end
87
+
88
+ private
89
+
90
+ def delivery_params
91
+ @delivery_params ||= params.permit(*resource_permitted_attributes)
92
+ end
93
+
94
+ # Deliveries can hang off something other than a fulfillment, which
95
+ # has no delivered state to roll up.
96
+ def recalculate_fulfillment_delivery
97
+ return unless @parent.is_a?(Spree::Fulfillment)
98
+
99
+ Spree.fulfillment_recalculate_delivery_service.call(fulfillment: @parent)
100
+ end
101
+ end
102
+ end
103
+ end
104
+ end
105
+ end
@@ -0,0 +1,117 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Orders
5
+ # Swapping goods on an order — a different size, colour or product —
6
+ # and the four moves that settle it.
7
+ #
8
+ # See {PostSaleActions} for why the lookups a payload's ids resolve
9
+ # through are deliberately left to the including controller.
10
+ module ExchangeActions
11
+ extend ActiveSupport::Concern
12
+ include PostSaleActions
13
+
14
+ # POST .../exchanges
15
+ def create
16
+ create_post_sale_record(
17
+ Spree.exchange_create_workflow, Spree::Exchange,
18
+ stock_location: stock_location_for_create
19
+ )
20
+ end
21
+
22
+ # PATCH .../exchanges/:id/approve
23
+ def approve
24
+ run_workflow(Spree.exchange_approve_workflow, approver: try_spree_current_user)
25
+ end
26
+
27
+ # PATCH .../exchanges/:id/receive
28
+ def receive
29
+ run_workflow(Spree.exchange_receive_workflow,
30
+ items: items_for_receive,
31
+ received_by: try_spree_current_user)
32
+ end
33
+
34
+ # PATCH .../exchanges/:id/fulfill — sends the replacement, settling
35
+ # any price difference, which is why it takes a refund method.
36
+ def fulfill
37
+ run_workflow(Spree.exchange_fulfill_workflow,
38
+ refund_method: params[:refund_method] || 'store_credit',
39
+ refunder: try_spree_current_user)
40
+ end
41
+
42
+ # PATCH .../exchanges/:id/cancel
43
+ def cancel
44
+ run_workflow(Spree.exchange_cancel_workflow, reason: params[:reason])
45
+ end
46
+
47
+ protected
48
+
49
+ def model_class
50
+ Spree::Exchange
51
+ end
52
+
53
+ def parent_association
54
+ :exchanges
55
+ end
56
+
57
+ def workflow_record_key
58
+ :exchange
59
+ end
60
+
61
+ private
62
+
63
+ def create_params
64
+ @create_params ||= params.permit(
65
+ :memo, :reason_id, :stock_location_id,
66
+ items: [:fulfillment_item_id, :new_variant_id, :quantity]
67
+ )
68
+ end
69
+
70
+ # The units going back are resolved through the order; what comes
71
+ # out instead is resolved through {#replacement_variant_for}.
72
+ def items_for_create
73
+ Array(create_params[:items]).map do |item|
74
+ {
75
+ fulfillment_item: @order.fulfillment_items.find_by_prefix_id!(item[:fulfillment_item_id]),
76
+ new_variant: replacement_variant_for(item[:new_variant_id]),
77
+ quantity: item[:quantity].to_i
78
+ }
79
+ end
80
+ end
81
+
82
+ def items_for_receive
83
+ sent = received_items([:exchange_line_item_id, :quantity, :resellable])
84
+ return nil if sent.nil?
85
+
86
+ sent.map do |item|
87
+ {
88
+ exchange_line_item: @resource.exchange_line_items.find_by_prefix_id!(item[:exchange_line_item_id]),
89
+ quantity: item[:quantity].to_i,
90
+ resellable: item.key?(:resellable) ? item[:resellable].to_b : true
91
+ }
92
+ end
93
+ end
94
+
95
+ def reason_for_create
96
+ return nil if create_params[:reason_id].blank?
97
+
98
+ current_store.return_reasons.find_by_prefix_id!(create_params[:reason_id])
99
+ end
100
+
101
+ # The catalogue the replacement comes out of, and the shelf the
102
+ # returned goods go back to. Both are left to the including
103
+ # controller: an operator exchanges into the whole store, a seller
104
+ # only into their own goods, and getting this wrong would put one
105
+ # seller's stock on another's order.
106
+ def replacement_variant_for(_variant_id)
107
+ raise NotImplementedError, "#{self.class} must implement #replacement_variant_for"
108
+ end
109
+
110
+ def stock_location_for_create
111
+ raise NotImplementedError, "#{self.class} must implement #stock_location_for_create"
112
+ end
113
+ end
114
+ end
115
+ end
116
+ end
117
+ end
@@ -0,0 +1,157 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Orders
5
+ # Dispatching what is owed on an order: shipping a parcel, cancelling
6
+ # one, and splitting goods that leave separately.
7
+ #
8
+ # Shared by the operator's branch and the seller's, which run the same
9
+ # workflows. What differs is only *whose records a payload may name*,
10
+ # and that stays in the including controller: this concern never
11
+ # fetches an order, a variant or a stock location. `@order` and
12
+ # `@resource` arrive already fetched and authorized — through
13
+ # `current_store` on one branch, `current_seller_orders` on the other
14
+ # — and this code never learns which.
15
+ module FulfillmentActions
16
+ extend ActiveSupport::Concern
17
+
18
+ # PATCH .../fulfillments/:id
19
+ def update
20
+ with_order_lock do
21
+ result = Spree.fulfillment_update_workflow.call(
22
+ fulfillment: @resource, fulfillment_attributes: update_attributes
23
+ )
24
+
25
+ if result.success?
26
+ render json: serialize_resource(@resource.reload)
27
+ else
28
+ render_result_error(result)
29
+ end
30
+ end
31
+ end
32
+
33
+ # PATCH .../fulfillments/:id/fulfill
34
+ #
35
+ # Ships the parcel. `items` narrows it to part of what the
36
+ # fulfillment holds, which splits the rest onto a new one.
37
+ def fulfill
38
+ with_order_lock do
39
+ result = Spree.fulfillment_fulfill_workflow.call(
40
+ fulfillment: @resource,
41
+ items: items_for_fulfill,
42
+ tracking: fulfill_params[:tracking],
43
+ tracking_carrier: fulfill_params[:tracking_carrier],
44
+ notify_customer: notify_customer?(fulfill_params[:notify_customer]),
45
+ **fulfill_workflow_options
46
+ )
47
+
48
+ if result.success?
49
+ render json: serialize_resource(result.value)
50
+ else
51
+ render_result_error(result)
52
+ end
53
+ end
54
+ end
55
+
56
+ # PATCH .../fulfillments/:id/cancel
57
+ #
58
+ # Restocking and standing the carrier down happen in the workflow.
59
+ def cancel
60
+ with_order_lock do
61
+ result = Spree.fulfillment_cancel_workflow.call(fulfillment: @resource)
62
+
63
+ if result.success?
64
+ render json: serialize_resource(result.value)
65
+ else
66
+ render_result_error(result)
67
+ end
68
+ end
69
+ end
70
+
71
+ # PATCH .../fulfillments/:id/split
72
+ #
73
+ # Moves part of what this parcel holds onto one of its own, for
74
+ # goods leaving separately. Answers with every fulfillment on the
75
+ # order, since splitting rewrites more than one.
76
+ def split
77
+ with_order_lock do
78
+ changer = @resource.transfer_to_location(
79
+ variant_for_split, params[:quantity].to_i, stock_location_for_split
80
+ )
81
+
82
+ if changer.run!
83
+ render json: {
84
+ data: @order.reload.fulfillments.map { |fulfillment| serialize_resource(fulfillment) }
85
+ }
86
+ else
87
+ render_validation_error(changer.errors)
88
+ end
89
+ end
90
+ end
91
+
92
+ protected
93
+
94
+ def model_class
95
+ Spree::Fulfillment
96
+ end
97
+
98
+ def parent_association
99
+ :fulfillments
100
+ end
101
+
102
+ private
103
+
104
+ def fulfill_params
105
+ @fulfill_params ||= params.permit(*fulfill_permitted_keys)
106
+ end
107
+
108
+ def fulfill_permitted_keys
109
+ [:tracking, :tracking_carrier, :notify_customer, { items: [:item_id, :quantity] }]
110
+ end
111
+
112
+ # Extra keywords the branch's own fulfil accepts — forcing past a
113
+ # guard is the operator's call, so the seller adds nothing.
114
+ def fulfill_workflow_options
115
+ {}
116
+ end
117
+
118
+ # The workflow addresses what to ship by line item, and the lookup
119
+ # runs through the order so an id from elsewhere cannot be shipped.
120
+ def items_for_fulfill
121
+ return if fulfill_params[:items].nil?
122
+
123
+ fulfill_params[:items].map do |item|
124
+ {
125
+ line_item: @order.line_items.find_by_prefix_id!(item[:item_id]),
126
+ quantity: Integer(item[:quantity].to_s, exception: false)
127
+ }
128
+ end
129
+ end
130
+
131
+ # Only an explicit false suppresses the email; an omitted flag keeps
132
+ # sending it.
133
+ def notify_customer?(value)
134
+ !ActiveModel::Type::Boolean.new.cast(value).equal?(false)
135
+ end
136
+
137
+ # The attributes handed to the update workflow. The workflow assigns
138
+ # ids raw, so a branch that must narrow one resolves it here first.
139
+ def update_attributes
140
+ permitted_params.to_h
141
+ end
142
+
143
+ # What may be split out of this parcel, and where the split half
144
+ # ships from. Both are left to the including controller: they decide
145
+ # whose catalogue and whose shelves are reachable.
146
+ def variant_for_split
147
+ raise NotImplementedError, "#{self.class} must implement #variant_for_split"
148
+ end
149
+
150
+ def stock_location_for_split
151
+ raise NotImplementedError, "#{self.class} must implement #stock_location_for_split"
152
+ end
153
+ end
154
+ end
155
+ end
156
+ end
157
+ end