spree_api 6.0.0.rc1 → 6.0.0.rc2

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 (370) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +0 -17
  3. data/app/controllers/concerns/spree/api/v3/admin/product_membership.rb +10 -0
  4. data/app/controllers/concerns/spree/api/v3/admin/stock_receipt_actions.rb +26 -4
  5. data/app/controllers/concerns/spree/api/v3/admin/subclassed_resource.rb +14 -28
  6. data/app/controllers/concerns/spree/api/v3/admin/validation_details.rb +1 -1
  7. data/app/controllers/concerns/spree/api/v3/cart_resolvable.rb +3 -2
  8. data/app/controllers/concerns/spree/api/v3/channel_resolution.rb +1 -1
  9. data/app/controllers/concerns/spree/api/v3/company_address_writes.rb +3 -1
  10. data/app/controllers/concerns/spree/api/v3/error_handler.rb +48 -2
  11. data/app/controllers/concerns/spree/api/v3/file_uploads.rb +35 -0
  12. data/app/controllers/concerns/spree/api/v3/money_params.rb +52 -0
  13. data/app/controllers/concerns/spree/api/v3/orders/claim_actions.rb +1 -5
  14. data/app/controllers/concerns/spree/api/v3/orders/delivery_actions.rb +6 -6
  15. data/app/controllers/concerns/spree/api/v3/orders/exchange_actions.rb +1 -4
  16. data/app/controllers/concerns/spree/api/v3/orders/fulfillment_actions.rb +1 -5
  17. data/app/controllers/concerns/spree/api/v3/orders/return_actions.rb +1 -4
  18. data/app/controllers/concerns/spree/api/v3/orders/shipping_label_actions.rb +5 -21
  19. data/app/controllers/concerns/spree/api/v3/params_normalizer.rb +5 -0
  20. data/app/controllers/concerns/spree/api/v3/purchase_serialization.rb +26 -0
  21. data/app/controllers/concerns/spree/api/v3/request_params.rb +65 -0
  22. data/app/controllers/concerns/spree/api/v3/strict_money_params.rb +94 -0
  23. data/app/controllers/spree/api/v3/admin/admin_users_controller.rb +10 -1
  24. data/app/controllers/spree/api/v3/admin/allowed_origins_controller.rb +8 -1
  25. data/app/controllers/spree/api/v3/admin/api_keys_controller.rb +15 -7
  26. data/app/controllers/spree/api/v3/admin/base_controller.rb +1 -0
  27. data/app/controllers/spree/api/v3/admin/catalogs/order_minimums_controller.rb +3 -1
  28. data/app/controllers/spree/api/v3/admin/catalogs/quantity_rules_controller.rb +7 -5
  29. data/app/controllers/spree/api/v3/admin/catalogs_controller.rb +60 -33
  30. data/app/controllers/spree/api/v3/admin/categories/products_controller.rb +4 -1
  31. data/app/controllers/spree/api/v3/admin/categories_controller.rb +40 -20
  32. data/app/controllers/spree/api/v3/admin/channels_controller.rb +39 -6
  33. data/app/controllers/spree/api/v3/admin/claim_reasons_controller.rb +5 -1
  34. data/app/controllers/spree/api/v3/admin/collections/products_controller.rb +4 -1
  35. data/app/controllers/spree/api/v3/admin/collections_controller.rb +44 -15
  36. data/app/controllers/spree/api/v3/admin/commission_rates_controller.rb +60 -12
  37. data/app/controllers/spree/api/v3/admin/companies/addresses_controller.rb +11 -0
  38. data/app/controllers/spree/api/v3/admin/companies/memberships_controller.rb +9 -1
  39. data/app/controllers/spree/api/v3/admin/companies/tax_exemption_certificates_controller.rb +19 -18
  40. data/app/controllers/spree/api/v3/admin/companies/tax_identifiers_controller.rb +6 -1
  41. data/app/controllers/spree/api/v3/admin/companies_controller.rb +17 -3
  42. data/app/controllers/spree/api/v3/admin/countries_controller.rb +5 -1
  43. data/app/controllers/spree/api/v3/admin/custom_field_definitions_controller.rb +21 -11
  44. data/app/controllers/spree/api/v3/admin/custom_fields_controller.rb +12 -5
  45. data/app/controllers/spree/api/v3/admin/customer_groups_controller.rb +9 -1
  46. data/app/controllers/spree/api/v3/admin/customers/addresses_controller.rb +12 -7
  47. data/app/controllers/spree/api/v3/admin/customers/store_credits_controller.rb +11 -9
  48. data/app/controllers/spree/api/v3/admin/customers/tax_identifiers_controller.rb +6 -1
  49. data/app/controllers/spree/api/v3/admin/customers_controller.rb +35 -7
  50. data/app/controllers/spree/api/v3/admin/data_requests_controller.rb +8 -0
  51. data/app/controllers/spree/api/v3/admin/delivery_method_rules_controller.rb +1 -1
  52. data/app/controllers/spree/api/v3/admin/delivery_methods/rules_controller.rb +15 -7
  53. data/app/controllers/spree/api/v3/admin/delivery_methods_controller.rb +92 -57
  54. data/app/controllers/spree/api/v3/admin/delivery_profiles/origin_groups_controller.rb +8 -1
  55. data/app/controllers/spree/api/v3/admin/delivery_profiles_controller.rb +13 -1
  56. data/app/controllers/spree/api/v3/admin/delivery_zones_controller.rb +21 -5
  57. data/app/controllers/spree/api/v3/admin/email_templates/drafts_controller.rb +14 -1
  58. data/app/controllers/spree/api/v3/admin/email_templates/previews_controller.rb +4 -0
  59. data/app/controllers/spree/api/v3/admin/email_templates/publications_controller.rb +7 -0
  60. data/app/controllers/spree/api/v3/admin/email_templates/restorations_controller.rb +8 -0
  61. data/app/controllers/spree/api/v3/admin/email_templates/test_emails_controller.rb +4 -0
  62. data/app/controllers/spree/api/v3/admin/exports_controller.rb +23 -6
  63. data/app/controllers/spree/api/v3/admin/files_controller.rb +29 -0
  64. data/app/controllers/spree/api/v3/admin/gift_card_batches_controller.rb +20 -1
  65. data/app/controllers/spree/api/v3/admin/gift_cards_controller.rb +19 -1
  66. data/app/controllers/spree/api/v3/admin/imports_controller.rb +36 -9
  67. data/app/controllers/spree/api/v3/admin/integrations_controller.rb +13 -1
  68. data/app/controllers/spree/api/v3/admin/invitation_acceptances_controller.rb +9 -2
  69. data/app/controllers/spree/api/v3/admin/invitations_controller.rb +8 -1
  70. data/app/controllers/spree/api/v3/admin/locales_controller.rb +1 -1
  71. data/app/controllers/spree/api/v3/admin/markets_controller.rb +30 -9
  72. data/app/controllers/spree/api/v3/admin/me_controller.rb +12 -3
  73. data/app/controllers/spree/api/v3/admin/media_controller.rb +22 -9
  74. data/app/controllers/spree/api/v3/admin/media_library_controller.rb +4 -0
  75. data/app/controllers/spree/api/v3/admin/option_types_controller.rb +24 -7
  76. data/app/controllers/spree/api/v3/admin/order_cancellation_reasons_controller.rb +5 -1
  77. data/app/controllers/spree/api/v3/admin/order_routing_rules_controller.rb +13 -1
  78. data/app/controllers/spree/api/v3/admin/orders/claims_controller.rb +39 -1
  79. data/app/controllers/spree/api/v3/admin/orders/deliveries_controller.rb +19 -1
  80. data/app/controllers/spree/api/v3/admin/orders/discount_codes_controller.rb +5 -1
  81. data/app/controllers/spree/api/v3/admin/orders/discounts_controller.rb +29 -5
  82. data/app/controllers/spree/api/v3/admin/orders/exchanges_controller.rb +36 -1
  83. data/app/controllers/spree/api/v3/admin/orders/fees_controller.rb +22 -1
  84. data/app/controllers/spree/api/v3/admin/orders/fulfillments_controller.rb +66 -7
  85. data/app/controllers/spree/api/v3/admin/orders/gift_cards_controller.rb +6 -2
  86. data/app/controllers/spree/api/v3/admin/orders/items_controller.rb +11 -1
  87. data/app/controllers/spree/api/v3/admin/orders/labels_controller.rb +35 -2
  88. data/app/controllers/spree/api/v3/admin/orders/payments_controller.rb +16 -5
  89. data/app/controllers/spree/api/v3/admin/orders/refunds_controller.rb +6 -0
  90. data/app/controllers/spree/api/v3/admin/orders/returns_controller.rb +37 -1
  91. data/app/controllers/spree/api/v3/admin/orders/store_credits_controller.rb +6 -3
  92. data/app/controllers/spree/api/v3/admin/orders_controller.rb +74 -60
  93. data/app/controllers/spree/api/v3/admin/package_types_controller.rb +30 -5
  94. data/app/controllers/spree/api/v3/admin/password_resets_controller.rb +17 -0
  95. data/app/controllers/spree/api/v3/admin/payment_methods_controller.rb +38 -22
  96. data/app/controllers/spree/api/v3/admin/policies_controller.rb +8 -4
  97. data/app/controllers/spree/api/v3/admin/price_lists_controller.rb +27 -15
  98. data/app/controllers/spree/api/v3/admin/prices_controller.rb +51 -4
  99. data/app/controllers/spree/api/v3/admin/product_types_controller.rb +25 -8
  100. data/app/controllers/spree/api/v3/admin/products/digital_assets_controller.rb +27 -10
  101. data/app/controllers/spree/api/v3/admin/products/variants_controller.rb +9 -14
  102. data/app/controllers/spree/api/v3/admin/products_controller.rb +121 -70
  103. data/app/controllers/spree/api/v3/admin/promotion_actions_controller.rb +11 -2
  104. data/app/controllers/spree/api/v3/admin/promotion_rules_controller.rb +10 -1
  105. data/app/controllers/spree/api/v3/admin/promotions_controller.rb +50 -14
  106. data/app/controllers/spree/api/v3/admin/purchase_orders_controller.rb +54 -7
  107. data/app/controllers/spree/api/v3/admin/refund_reasons_controller.rb +5 -1
  108. data/app/controllers/spree/api/v3/admin/reporting/saved_reports_controller.rb +9 -1
  109. data/app/controllers/spree/api/v3/admin/reporting_controller.rb +34 -0
  110. data/app/controllers/spree/api/v3/admin/resource_controller.rb +1 -0
  111. data/app/controllers/spree/api/v3/admin/return_reasons_controller.rb +5 -1
  112. data/app/controllers/spree/api/v3/admin/roles_controller.rb +13 -1
  113. data/app/controllers/spree/api/v3/admin/seller_payouts_controller.rb +6 -0
  114. data/app/controllers/spree/api/v3/admin/seller_requirement_submissions_controller.rb +15 -0
  115. data/app/controllers/spree/api/v3/admin/seller_requirements_controller.rb +32 -6
  116. data/app/controllers/spree/api/v3/admin/sellers_controller.rb +75 -22
  117. data/app/controllers/spree/api/v3/admin/setup_controller.rb +54 -15
  118. data/app/controllers/spree/api/v3/admin/stock_levels_controller.rb +38 -9
  119. data/app/controllers/spree/api/v3/admin/stock_locations_controller.rb +41 -9
  120. data/app/controllers/spree/api/v3/admin/stock_transfers_controller.rb +48 -7
  121. data/app/controllers/spree/api/v3/admin/store_controller.rb +122 -53
  122. data/app/controllers/spree/api/v3/admin/store_credits_controller.rb +1 -7
  123. data/app/controllers/spree/api/v3/admin/suppliers_controller.rb +16 -6
  124. data/app/controllers/spree/api/v3/admin/tax_categories_controller.rb +7 -4
  125. data/app/controllers/spree/api/v3/admin/tax_rates_controller.rb +21 -3
  126. data/app/controllers/spree/api/v3/admin/tracking_carriers_controller.rb +4 -0
  127. data/app/controllers/spree/api/v3/admin/translations/batches_controller.rb +17 -9
  128. data/app/controllers/spree/api/v3/admin/translations_controller.rb +4 -0
  129. data/app/controllers/spree/api/v3/admin/translations_coverage_controller.rb +5 -0
  130. data/app/controllers/spree/api/v3/admin/updates_controller.rb +39 -0
  131. data/app/controllers/spree/api/v3/admin/webhook_endpoints_controller.rb +23 -1
  132. data/app/controllers/spree/api/v3/base_controller.rb +2 -0
  133. data/app/controllers/spree/api/v3/resource_controller.rb +63 -10
  134. data/app/controllers/spree/api/v3/seller/auth_controller.rb +8 -0
  135. data/app/controllers/spree/api/v3/seller/base_controller.rb +1 -0
  136. data/app/controllers/spree/api/v3/seller/countries_controller.rb +2 -2
  137. data/app/controllers/spree/api/v3/seller/delivery_methods_controller.rb +49 -60
  138. data/app/controllers/spree/api/v3/seller/exports_controller.rb +18 -1
  139. data/app/controllers/spree/api/v3/seller/files_controller.rb +27 -0
  140. data/app/controllers/spree/api/v3/seller/imports_controller.rb +25 -9
  141. data/app/controllers/spree/api/v3/seller/invitation_acceptances_controller.rb +9 -1
  142. data/app/controllers/spree/api/v3/seller/me_controller.rb +14 -3
  143. data/app/controllers/spree/api/v3/seller/onboarding_controller.rb +11 -0
  144. data/app/controllers/spree/api/v3/seller/orders/claims_controller.rb +35 -0
  145. data/app/controllers/spree/api/v3/seller/orders/deliveries_controller.rb +12 -0
  146. data/app/controllers/spree/api/v3/seller/orders/exchanges_controller.rb +33 -0
  147. data/app/controllers/spree/api/v3/seller/orders/fulfillments_controller.rb +28 -2
  148. data/app/controllers/spree/api/v3/seller/orders/labels_controller.rb +22 -1
  149. data/app/controllers/spree/api/v3/seller/orders/notes_controller.rb +8 -1
  150. data/app/controllers/spree/api/v3/seller/orders/returns_controller.rb +32 -0
  151. data/app/controllers/spree/api/v3/seller/orders_controller.rb +35 -14
  152. data/app/controllers/spree/api/v3/seller/package_types_controller.rb +21 -9
  153. data/app/controllers/spree/api/v3/seller/password_resets_controller.rb +10 -0
  154. data/app/controllers/spree/api/v3/seller/policies_controller.rb +12 -4
  155. data/app/controllers/spree/api/v3/seller/products_controller.rb +114 -28
  156. data/app/controllers/spree/api/v3/seller/profile_controller.rb +33 -10
  157. data/app/controllers/spree/api/v3/seller/requirement_submissions_controller.rb +12 -5
  158. data/app/controllers/spree/api/v3/seller/resource_controller.rb +12 -0
  159. data/app/controllers/spree/api/v3/seller/stock_locations_controller.rb +44 -13
  160. data/app/controllers/spree/api/v3/seller/tax_identifiers_controller.rb +10 -1
  161. data/app/controllers/spree/api/v3/seller/team_controller.rb +4 -0
  162. data/app/controllers/spree/api/v3/store/auth_controller.rb +10 -0
  163. data/app/controllers/spree/api/v3/store/carts/discount_codes_controller.rb +8 -1
  164. data/app/controllers/spree/api/v3/store/carts/fulfillments_controller.rb +10 -2
  165. data/app/controllers/spree/api/v3/store/carts/gift_cards_controller.rb +8 -1
  166. data/app/controllers/spree/api/v3/store/carts/items_controller.rb +17 -5
  167. data/app/controllers/spree/api/v3/store/carts/payment_sessions_controller.rb +20 -6
  168. data/app/controllers/spree/api/v3/store/carts/payments_controller.rb +11 -0
  169. data/app/controllers/spree/api/v3/store/carts/po_documents_controller.rb +24 -26
  170. data/app/controllers/spree/api/v3/store/carts/store_credits_controller.rb +7 -1
  171. data/app/controllers/spree/api/v3/store/carts/tax_identifiers_controller.rb +5 -1
  172. data/app/controllers/spree/api/v3/store/carts_controller.rb +56 -47
  173. data/app/controllers/spree/api/v3/store/companies/addresses_controller.rb +12 -4
  174. data/app/controllers/spree/api/v3/store/companies/members_controller.rb +4 -0
  175. data/app/controllers/spree/api/v3/store/companies_controller.rb +5 -1
  176. data/app/controllers/spree/api/v3/store/company_invitations_controller.rb +9 -1
  177. data/app/controllers/spree/api/v3/store/customer/addresses_controller.rb +8 -7
  178. data/app/controllers/spree/api/v3/store/customer/data_requests_controller.rb +5 -0
  179. data/app/controllers/spree/api/v3/store/customer/password_resets_controller.rb +17 -0
  180. data/app/controllers/spree/api/v3/store/customer/payment_setup_sessions_controller.rb +10 -5
  181. data/app/controllers/spree/api/v3/store/customer/tax_identifiers_controller.rb +5 -1
  182. data/app/controllers/spree/api/v3/store/customers_controller.rb +28 -2
  183. data/app/controllers/spree/api/v3/store/newsletter_subscribers_controller.rb +22 -0
  184. data/app/controllers/spree/api/v3/store/orders/claims_controller.rb +11 -2
  185. data/app/controllers/spree/api/v3/store/orders/returns_controller.rb +10 -1
  186. data/app/controllers/spree/api/v3/store/orders_controller.rb +47 -10
  187. data/app/controllers/spree/api/v3/store/products_controller.rb +8 -0
  188. data/app/controllers/spree/api/v3/store/wishlist_items_controller.rb +10 -4
  189. data/app/controllers/spree/api/v3/store/wishlists_controller.rb +12 -4
  190. data/app/request_schemas/spree/api/v3/address_request_schema.rb +27 -0
  191. data/app/request_schemas/spree/api/v3/admin/address_request_schema.rb +13 -0
  192. data/app/request_schemas/spree/api/v3/admin/bulk_tags_request_schema.rb +17 -0
  193. data/app/request_schemas/spree/api/v3/admin/catalog_order_minimum_request_schema.rb +17 -0
  194. data/app/request_schemas/spree/api/v3/admin/email_template_language_request_schema.rb +17 -0
  195. data/app/request_schemas/spree/api/v3/admin/email_template_preview_request_schema.rb +32 -0
  196. data/app/request_schemas/spree/api/v3/admin/price_adjustment_tier_request_schema.rb +21 -0
  197. data/app/request_schemas/spree/api/v3/admin/price_list_price_request_schema.rb +21 -0
  198. data/app/request_schemas/spree/api/v3/admin/price_list_rule_request_schema.rb +19 -0
  199. data/app/request_schemas/spree/api/v3/admin/product_membership_reposition_request_schema.rb +17 -0
  200. data/app/request_schemas/spree/api/v3/admin/promotion_action_calculator_request_schema.rb +18 -0
  201. data/app/request_schemas/spree/api/v3/admin/promotion_action_line_item_request_schema.rb +15 -0
  202. data/app/request_schemas/spree/api/v3/admin/promotion_action_request_schema.rb +19 -0
  203. data/app/request_schemas/spree/api/v3/admin/promotion_rule_request_schema.rb +22 -0
  204. data/app/request_schemas/spree/api/v3/admin/reason_request_schema.rb +14 -0
  205. data/app/request_schemas/spree/api/v3/admin/tax_identifier_request_schema.rb +15 -0
  206. data/app/request_schemas/spree/api/v3/custom_field_value_request_schema.rb +15 -0
  207. data/app/request_schemas/spree/api/v3/file_upload_request_schema.rb +20 -0
  208. data/app/request_schemas/spree/api/v3/media_request_schema.rb +27 -0
  209. data/app/request_schemas/spree/api/v3/price_request_schema.rb +17 -0
  210. data/app/request_schemas/spree/api/v3/stock_level_request_schema.rb +18 -0
  211. data/app/request_schemas/spree/api/v3/store/address_request_schema.rb +29 -0
  212. data/app/request_schemas/spree/api/v3/tax_identifier_request_schema.rb +18 -0
  213. data/app/request_schemas/spree/api/v3/variant_option_request_schema.rb +13 -0
  214. data/app/request_schemas/spree/api/v3/variant_request_schema.rb +52 -0
  215. data/app/serializers/concerns/spree/api/v3/purchase_summary.rb +48 -0
  216. data/app/serializers/spree/api/v3/address_serializer.rb +4 -2
  217. data/app/serializers/spree/api/v3/admin/address_serializer.rb +3 -0
  218. data/app/serializers/spree/api/v3/admin/applied_promotion_serializer.rb +3 -1
  219. data/app/serializers/spree/api/v3/admin/cart_serializer.rb +3 -1
  220. data/app/serializers/spree/api/v3/admin/catalog_order_minimum_serializer.rb +3 -2
  221. data/app/serializers/spree/api/v3/admin/catalog_price_serializer.rb +3 -4
  222. data/app/serializers/spree/api/v3/admin/catalog_price_tier_serializer.rb +4 -3
  223. data/app/serializers/spree/api/v3/admin/channel_serializer.rb +5 -7
  224. data/app/serializers/spree/api/v3/admin/claim_line_item_serializer.rb +7 -0
  225. data/app/serializers/spree/api/v3/admin/claim_serializer.rb +5 -0
  226. data/app/serializers/spree/api/v3/admin/commission_line_serializer.rb +7 -18
  227. data/app/serializers/spree/api/v3/admin/commission_rate_serializer.rb +7 -11
  228. data/app/serializers/spree/api/v3/admin/commission_rule_serializer.rb +0 -2
  229. data/app/serializers/spree/api/v3/admin/country_serializer.rb +4 -0
  230. data/app/serializers/spree/api/v3/admin/customer_serializer.rb +3 -7
  231. data/app/serializers/spree/api/v3/admin/delivery_method_rule_serializer.rb +0 -2
  232. data/app/serializers/spree/api/v3/admin/delivery_method_serializer.rb +14 -10
  233. data/app/serializers/spree/api/v3/admin/delivery_method_service_serializer.rb +9 -1
  234. data/app/serializers/spree/api/v3/admin/delivery_rate_serializer.rb +8 -0
  235. data/app/serializers/spree/api/v3/admin/discount_serializer.rb +3 -1
  236. data/app/serializers/spree/api/v3/admin/exchange_line_item_serializer.rb +5 -0
  237. data/app/serializers/spree/api/v3/admin/exchange_serializer.rb +5 -0
  238. data/app/serializers/spree/api/v3/admin/fee_serializer.rb +3 -1
  239. data/app/serializers/spree/api/v3/admin/file_upload_serializer.rb +11 -0
  240. data/app/serializers/spree/api/v3/admin/file_upload_target_serializer.rb +10 -0
  241. data/app/serializers/spree/api/v3/admin/fulfillment_serializer.rb +13 -11
  242. data/app/serializers/spree/api/v3/admin/gift_card_serializer.rb +3 -3
  243. data/app/serializers/spree/api/v3/admin/import_serializer.rb +2 -2
  244. data/app/serializers/spree/api/v3/admin/integration_serializer.rb +1 -3
  245. data/app/serializers/spree/api/v3/admin/line_item_serializer.rb +12 -12
  246. data/app/serializers/spree/api/v3/admin/locale_serializer.rb +13 -0
  247. data/app/serializers/spree/api/v3/admin/market_serializer.rb +3 -0
  248. data/app/serializers/spree/api/v3/admin/media_serializer.rb +3 -2
  249. data/app/serializers/spree/api/v3/admin/order_group_serializer.rb +2 -0
  250. data/app/serializers/spree/api/v3/admin/order_routing_rule_serializer.rb +1 -3
  251. data/app/serializers/spree/api/v3/admin/order_serializer.rb +33 -33
  252. data/app/serializers/spree/api/v3/admin/payment_method_serializer.rb +1 -4
  253. data/app/serializers/spree/api/v3/admin/payment_serializer.rb +6 -3
  254. data/app/serializers/spree/api/v3/admin/payment_split_serializer.rb +8 -9
  255. data/app/serializers/spree/api/v3/admin/price_adjustment_tier_serializer.rb +3 -6
  256. data/app/serializers/spree/api/v3/admin/price_history_serializer.rb +5 -2
  257. data/app/serializers/spree/api/v3/admin/price_list_serializer.rb +1 -5
  258. data/app/serializers/spree/api/v3/admin/price_rule_serializer.rb +1 -3
  259. data/app/serializers/spree/api/v3/admin/price_serializer.rb +2 -0
  260. data/app/serializers/spree/api/v3/admin/product_serializer.rb +2 -0
  261. data/app/serializers/spree/api/v3/admin/promotion_action_serializer.rb +4 -6
  262. data/app/serializers/spree/api/v3/admin/promotion_rule_serializer.rb +0 -2
  263. data/app/serializers/spree/api/v3/admin/purchase_order_item_serializer.rb +5 -11
  264. data/app/serializers/spree/api/v3/admin/purchase_order_serializer.rb +4 -4
  265. data/app/serializers/spree/api/v3/admin/refund_serializer.rb +7 -3
  266. data/app/serializers/spree/api/v3/admin/reporting_result_serializer.rb +9 -2
  267. data/app/serializers/spree/api/v3/admin/return_line_item_serializer.rb +8 -0
  268. data/app/serializers/spree/api/v3/admin/return_serializer.rb +8 -4
  269. data/app/serializers/spree/api/v3/admin/seller_balance_serializer.rb +15 -10
  270. data/app/serializers/spree/api/v3/admin/seller_payout_serializer.rb +3 -5
  271. data/app/serializers/spree/api/v3/admin/seller_serializer.rb +3 -1
  272. data/app/serializers/spree/api/v3/admin/seller_transfer_serializer.rb +7 -8
  273. data/app/serializers/spree/api/v3/admin/shipping_label_serializer.rb +4 -4
  274. data/app/serializers/spree/api/v3/admin/stock_location_serializer.rb +3 -0
  275. data/app/serializers/spree/api/v3/admin/stock_movement_serializer.rb +2 -6
  276. data/app/serializers/spree/api/v3/admin/store_credit_event_serializer.rb +5 -0
  277. data/app/serializers/spree/api/v3/admin/store_credit_serializer.rb +9 -4
  278. data/app/serializers/spree/api/v3/admin/store_serializer.rb +17 -98
  279. data/app/serializers/spree/api/v3/admin/supplier_serializer.rb +1 -1
  280. data/app/serializers/spree/api/v3/admin/tax_exemption_certificate_serializer.rb +3 -1
  281. data/app/serializers/spree/api/v3/admin/tax_line_serializer.rb +4 -2
  282. data/app/serializers/spree/api/v3/admin/tax_rate_serializer.rb +2 -12
  283. data/app/serializers/spree/api/v3/admin/update_status_serializer.rb +28 -0
  284. data/app/serializers/spree/api/v3/admin/variant_serializer.rb +7 -3
  285. data/app/serializers/spree/api/v3/base_serializer.rb +112 -7
  286. data/app/serializers/spree/api/v3/cart_serializer.rb +11 -29
  287. data/app/serializers/spree/api/v3/claim_line_item_serializer.rb +5 -13
  288. data/app/serializers/spree/api/v3/claim_serializer.rb +2 -3
  289. data/app/serializers/spree/api/v3/country_serializer.rb +2 -1
  290. data/app/serializers/spree/api/v3/currency_serializer.rb +9 -1
  291. data/app/serializers/spree/api/v3/customer_serializer.rb +3 -2
  292. data/app/serializers/spree/api/v3/delivery_rate_serializer.rb +8 -12
  293. data/app/serializers/spree/api/v3/delivery_zone_member_serializer.rb +1 -1
  294. data/app/serializers/spree/api/v3/discount_serializer.rb +4 -1
  295. data/app/serializers/spree/api/v3/exchange_line_item_serializer.rb +2 -8
  296. data/app/serializers/spree/api/v3/exchange_serializer.rb +2 -3
  297. data/app/serializers/spree/api/v3/file_upload_serializer.rb +28 -0
  298. data/app/serializers/spree/api/v3/file_upload_target_serializer.rb +17 -0
  299. data/app/serializers/spree/api/v3/gift_card_batch_serializer.rb +2 -4
  300. data/app/serializers/spree/api/v3/gift_card_serializer.rb +4 -2
  301. data/app/serializers/spree/api/v3/import_serializer.rb +0 -12
  302. data/app/serializers/spree/api/v3/line_item_serializer.rb +15 -5
  303. data/app/serializers/spree/api/v3/locale_serializer.rb +3 -1
  304. data/app/serializers/spree/api/v3/market_serializer.rb +5 -5
  305. data/app/serializers/spree/api/v3/media_serializer.rb +7 -2
  306. data/app/serializers/spree/api/v3/order_group_serializer.rb +12 -4
  307. data/app/serializers/spree/api/v3/order_serializer.rb +5 -23
  308. data/app/serializers/spree/api/v3/payment_session_serializer.rb +2 -4
  309. data/app/serializers/spree/api/v3/price_history_serializer.rb +5 -5
  310. data/app/serializers/spree/api/v3/price_serializer.rb +6 -9
  311. data/app/serializers/spree/api/v3/product_filter_price_range_serializer.rb +10 -4
  312. data/app/serializers/spree/api/v3/product_serializer.rb +3 -3
  313. data/app/serializers/spree/api/v3/refund_serializer.rb +8 -5
  314. data/app/serializers/spree/api/v3/return_line_item_serializer.rb +3 -11
  315. data/app/serializers/spree/api/v3/return_serializer.rb +3 -6
  316. data/app/serializers/spree/api/v3/seller/address_serializer.rb +12 -0
  317. data/app/serializers/spree/api/v3/seller/balance_serializer.rb +15 -10
  318. data/app/serializers/spree/api/v3/seller/claim_line_item_serializer.rb +7 -0
  319. data/app/serializers/spree/api/v3/seller/claim_serializer.rb +5 -0
  320. data/app/serializers/spree/api/v3/seller/country_serializer.rb +19 -0
  321. data/app/serializers/spree/api/v3/seller/delivery_method_rule_serializer.rb +1 -3
  322. data/app/serializers/spree/api/v3/seller/delivery_method_serializer.rb +4 -8
  323. data/app/serializers/spree/api/v3/seller/delivery_rate_serializer.rb +9 -8
  324. data/app/serializers/spree/api/v3/seller/exchange_line_item_serializer.rb +5 -0
  325. data/app/serializers/spree/api/v3/seller/exchange_serializer.rb +5 -0
  326. data/app/serializers/spree/api/v3/seller/file_upload_serializer.rb +11 -0
  327. data/app/serializers/spree/api/v3/seller/file_upload_target_serializer.rb +10 -0
  328. data/app/serializers/spree/api/v3/seller/import_serializer.rb +2 -2
  329. data/app/serializers/spree/api/v3/seller/media_serializer.rb +2 -5
  330. data/app/serializers/spree/api/v3/seller/order_line_item_serializer.rb +4 -3
  331. data/app/serializers/spree/api/v3/seller/order_serializer.rb +16 -16
  332. data/app/serializers/spree/api/v3/seller/payment_split_serializer.rb +8 -9
  333. data/app/serializers/spree/api/v3/seller/payout_serializer.rb +2 -4
  334. data/app/serializers/spree/api/v3/seller/price_history_serializer.rb +11 -0
  335. data/app/serializers/spree/api/v3/seller/price_serializer.rb +11 -0
  336. data/app/serializers/spree/api/v3/seller/product_serializer.rb +2 -0
  337. data/app/serializers/spree/api/v3/seller/profile_serializer.rb +7 -7
  338. data/app/serializers/spree/api/v3/seller/return_line_item_serializer.rb +8 -0
  339. data/app/serializers/spree/api/v3/seller/return_serializer.rb +8 -5
  340. data/app/serializers/spree/api/v3/seller/state_serializer.rb +10 -0
  341. data/app/serializers/spree/api/v3/seller/stock_location_serializer.rb +3 -0
  342. data/app/serializers/spree/api/v3/seller/transfer_serializer.rb +6 -7
  343. data/app/serializers/spree/api/v3/seller/variant_serializer.rb +8 -4
  344. data/app/serializers/spree/api/v3/stock_location_serializer.rb +8 -1
  345. data/app/serializers/spree/api/v3/store_credit_event_serializer.rb +1 -3
  346. data/app/serializers/spree/api/v3/store_credit_serializer.rb +3 -5
  347. data/app/serializers/spree/api/v3/tax_line_serializer.rb +2 -4
  348. data/app/serializers/spree/api/v3/variant_serializer.rb +3 -3
  349. data/app/services/spree/api/v3/filter_predicates.rb +29 -0
  350. data/app/services/spree/api/v3/filter_table.rb +337 -0
  351. data/app/services/spree/api/v3/filters_aggregator.rb +2 -2
  352. data/app/services/spree/api/v3/request_schema.rb +430 -0
  353. data/app/services/spree/webhooks/deliver_webhook.rb +7 -3
  354. data/config/initializers/typelizer.rb +1 -1
  355. data/config/routes.rb +5 -3
  356. data/lib/spree/api/configuration.rb +5 -0
  357. data/lib/spree/api/dependencies.rb +7 -6
  358. data/lib/spree/api/middleware/request_size_limit.rb +24 -3
  359. data/lib/spree/api/openapi/filter_documentation.rb +136 -0
  360. data/lib/spree/api/openapi/schema_helper.rb +126 -80
  361. data/lib/spree/api/preference_families.rb +46 -0
  362. data/lib/spree/api/preference_types.rb +138 -0
  363. data/lib/spree/api/typelizer_generation.rb +4 -0
  364. data/lib/tasks/filters.rake +12 -0
  365. data/lib/typelizer/open_enums.rb +10 -0
  366. metadata +60 -10
  367. data/app/controllers/concerns/spree/api/v3/address_params.rb +0 -17
  368. data/app/controllers/concerns/spree/api/v3/direct_uploads.rb +0 -35
  369. data/app/controllers/spree/api/v3/admin/direct_uploads_controller.rb +0 -54
  370. data/app/controllers/spree/api/v3/seller/direct_uploads_controller.rb +0 -21
@@ -2,8 +2,9 @@ module Spree
2
2
  module Api
3
3
  module V3
4
4
  module Admin
5
- # Decorates a Spree::Reporting::Result for the wire: money display
6
- # strings, ISO ranges, and dimension hydration (raw group keys become
5
+ # Decorates a Spree::Reporting::Result for the wire: money as decimal
6
+ # strings in the result's currency, ratios and growth as plain decimal
7
+ # strings, counts as integers, money display strings, ISO ranges, and dimension hydration (raw group keys become
7
8
  # { id, label, meta } display payloads — see Spree::Reporting::Hydration).
8
9
  class ReportingResultSerializer
9
10
  attr_reader :result, :store, :params
@@ -39,7 +40,13 @@ module Spree
39
40
  end
40
41
 
41
42
  def metric_payload(name, payload)
43
+ metric = Spree.reporting.metrics[name]
42
44
  output = payload.dup
45
+ if metric
46
+ output[:value] = metric.format_value(payload[:value], result.meta[:currency])
47
+ output[:previous] = metric.format_value(payload[:previous], result.meta[:currency]) if payload.key?(:previous)
48
+ end
49
+ output[:growth] = Spree::Money::Rounding.format_decimal(payload[:growth]) if payload.key?(:growth)
43
50
  output[:display] = money(payload[:value]) if money_metrics.include?(name)
44
51
  output
45
52
  end
@@ -5,6 +5,14 @@ module Spree
5
5
  module V3
6
6
  module Admin
7
7
  class ReturnLineItemSerializer < V3::ReturnLineItemSerializer
8
+ without_formatted_money
9
+
10
+ # No guest price gating here, so the inherited money fields are always present.
11
+ typelize pre_tax_amount: [:string, nullable: false],
12
+ included_tax_total: [:string, nullable: false], additional_tax_total: [:string, nullable: false],
13
+ tax_total: [:string, nullable: false],
14
+ refund_amount: [:string, nullable: false]
15
+
8
16
  attributes created_at: :iso8601, updated_at: :iso8601
9
17
 
10
18
  one :variant, resource: proc { Spree.api.admin_variant_serializer }, if: proc { expand?('variant') }
@@ -5,15 +5,16 @@ module Spree
5
5
  module V3
6
6
  module Admin
7
7
  class ReturnSerializer < V3::ReturnSerializer
8
+ without_formatted_money
9
+
8
10
  typelize memo: [:string, nullable: true],
9
11
  metadata: 'Record<string, unknown>',
10
12
  documents: "Array<{ kind: string; url: string }>",
11
13
  stock_location_id: [:string, nullable: true],
12
14
  created_by_id: [:string, nullable: true],
13
15
  created_by_type: [:string, nullable: true, enum: Spree::Actor::BUILT_IN_KINDS, enum_type_name: 'ActorKind'],
14
- refunded_total: :string,
15
- display_refunded_total: :string,
16
- refundable_total: :string
16
+ refund_total: [:string, nullable: false],
17
+ refund_tax_total: [:string, nullable: false]
17
18
 
18
19
  attributes :memo, :metadata, created_at: :iso8601, updated_at: :iso8601
19
20
 
@@ -21,7 +22,10 @@ module Spree
21
22
 
22
23
  actor_attributes :created_by
23
24
 
24
- attributes refunded_total: :string, display_refunded_total: :string, refundable_total: :string
25
+ money_attributes :refunded_total, :refundable_total
26
+ typelize refunded_total: [:string, nullable: false],
27
+ refundable_total: [:string, nullable: false]
28
+
25
29
  many :return_line_items,
26
30
  resource: proc { Spree.api.admin_return_line_item_serializer },
27
31
  if: proc { expand?('return_line_items') }
@@ -6,14 +6,14 @@ module Spree
6
6
  # operator. A computed value rather than a record, so it carries no id.
7
7
  class SellerBalanceSerializer < V3::BaseSerializer
8
8
  typelize seller_id: :string,
9
- currency: :string,
10
- settlement_currency: :string,
9
+ currency: [:string, enum: Spree::Money::Rounding::CURRENCY_CODES, enum_type_name: 'CurrencyCode'],
10
+ settlement_currency: [:string, enum: Spree::Money::Rounding::CURRENCY_CODES, enum_type_name: 'CurrencyCode'],
11
11
  converted: :boolean,
12
- earned: :string, display_earned: :string,
13
- payable: :string, display_payable: :string,
14
- paid: :string, display_paid: :string,
15
- balance: :string, display_balance: :string,
16
- pending: :string, display_pending: :string
12
+ earned: :string,
13
+ payable: :string,
14
+ paid: :string,
15
+ balance: :string,
16
+ pending: :string
17
17
 
18
18
  _attributes.delete(:id)
19
19
 
@@ -26,9 +26,14 @@ module Spree
26
26
 
27
27
  attribute(:seller_id) { |balance| balance.seller&.prefixed_id }
28
28
 
29
- %i[earned payable paid balance pending].each do |figure|
30
- attribute(figure) { |balance| balance.public_send(figure).to_s }
31
- attribute(:"display_#{figure}") { |balance| balance.public_send(:"display_#{figure}").to_s }
29
+ # Earnings are in the currency the sales were priced in; what the
30
+ # account holds is in the one it settles in.
31
+ %i[earned pending].each do |figure|
32
+ attribute(figure) { |balance| Spree::Money::Rounding.format(balance.public_send(figure), balance.currency) }
33
+ end
34
+
35
+ %i[payable paid balance].each do |figure|
36
+ attribute(figure) { |balance| Spree::Money::Rounding.format(balance.public_send(figure), balance.settlement_currency) }
32
37
  end
33
38
  end
34
39
  end
@@ -13,19 +13,17 @@ module Spree
13
13
  status: [:string, enum: Spree::SellerPayout.statuses, enum_type_name: 'SellerPayoutStatus'],
14
14
  provider: [:string, comment: 'Payout provider. Built-in: system. Provider gems register more (e.g. stripe).'],
15
15
  amount: :string,
16
- currency: :string,
16
+ currency: [:string, enum: Spree::Money::Rounding::CURRENCY_CODES, enum_type_name: 'CurrencyCode'],
17
17
  reference: 'string | null',
18
18
  period_start: 'string | null',
19
19
  period_end: 'string | null',
20
- transfers_count: :number,
21
- display_amount: :string
20
+ transfers_count: :number
22
21
 
23
22
  attributes :status, :currency, :reference, :metadata,
24
23
  period_start: :iso8601, period_end: :iso8601,
25
24
  created_at: :iso8601, updated_at: :iso8601
26
25
 
27
- attribute(:amount) { |payout| payout.amount&.to_s }
28
- attribute(:display_amount) { |payout| payout.display_amount.to_s }
26
+ attribute(:amount) { |payout| Spree::Money::Rounding.format(payout.amount, payout.currency) }
29
27
  attribute(:seller_id) { |payout| payout.seller&.prefixed_id }
30
28
  attribute(:seller_name) { |payout| payout.seller&.name }
31
29
 
@@ -37,8 +37,10 @@ module Spree
37
37
  # response.
38
38
  _attributes.delete(:policies)
39
39
 
40
+ # Stored without a currency, so it is shown as stored rather than
41
+ # rounded to the store's: a rounded figure would be saved back.
40
42
  attribute :minimum_payout_amount do |seller|
41
- seller.minimum_payout_amount&.to_s
43
+ Spree::Money::Rounding.format(seller.minimum_payout_amount, (current_store || Spree::Current.store)&.default_currency, unit_price: true)
42
44
  end
43
45
 
44
46
  # Approved but away still cannot sell, and the list has to say so
@@ -18,23 +18,22 @@ module Spree
18
18
  status: [:string, enum: Spree::SellerTransfer.statuses, enum_type_name: 'SellerTransferStatus'],
19
19
  provider: [:string, comment: 'Payout provider. Built-in: system. Provider gems register more (e.g. stripe).'],
20
20
  amount: :string,
21
- currency: :string,
21
+ currency: [:string, enum: Spree::Money::Rounding::CURRENCY_CODES, enum_type_name: 'CurrencyCode'],
22
22
  settled_amount: 'string | null',
23
- settled_currency: 'string | null',
23
+ settled_currency: [:string, nullable: true, enum: Spree::Money::Rounding::CURRENCY_CODES, enum_type_name: 'CurrencyCode'],
24
24
  converted: :boolean,
25
- reference: 'string | null',
26
- display_amount: :string
25
+ reference: 'string | null'
27
26
 
28
27
  attributes :kind, :status, :currency, :reference, :metadata,
29
28
  created_at: :iso8601, updated_at: :iso8601
30
29
 
31
- # A string, so the figure a seller is paid round-trips exactly.
32
- attribute(:amount) { |transfer| transfer.amount&.to_s }
33
- attribute(:display_amount) { |transfer| transfer.display_amount.to_s }
30
+ attribute(:amount) { |transfer| Spree::Money::Rounding.format(transfer.amount, transfer.currency) }
34
31
 
35
32
  # What the seller's account received, when the provider converted on
36
33
  # the way in. Null when it settled in the currency of the sale.
37
- attribute(:settled_amount) { |transfer| transfer.settled_amount&.to_s }
34
+ attribute(:settled_amount) do |transfer|
35
+ Spree::Money::Rounding.format(transfer.settled_amount, transfer.settled_currency || transfer.currency)
36
+ end
38
37
  attribute(:settled_currency) { |transfer| transfer.settled_currency }
39
38
  attribute(:converted) { |transfer| transfer.converted? }
40
39
 
@@ -14,9 +14,7 @@ module Spree
14
14
  carrier_name: [:string, nullable: true],
15
15
  service: [:string, nullable: true],
16
16
  tracking_number: [:string, nullable: true],
17
- cost: :string,
18
- currency: [:string, nullable: true],
19
- display_cost: :string,
17
+ currency: [:string, nullable: true, enum: Spree::Money::Rounding::CURRENCY_CODES, enum_type_name: 'CurrencyCode'],
20
18
  format: [:string, nullable: true],
21
19
  external_id: [:string, nullable: true],
22
20
  integration_id: [:string, nullable: true],
@@ -34,7 +32,9 @@ module Spree
34
32
  Spree::Base.polymorphic_api_type(shipping_label.owner_type)
35
33
  end
36
34
 
37
- attributes cost: :string, display_cost: :string
35
+ money_attributes :cost, currency: ->(label) { label.currency.presence || label.store.default_currency }
36
+ typelize cost: [:string, nullable: false]
37
+
38
38
  prefixed_id_attributes :integration
39
39
 
40
40
  # Whether the file is still being fetched from the carrier; the
@@ -3,6 +3,9 @@ module Spree
3
3
  module V3
4
4
  module Admin
5
5
  class StockLocationSerializer < V3::StockLocationSerializer
6
+ # The Store API keeps these deprecated names until 6.1.
7
+ %i[country_iso state_abbr].each { |key| _attributes.delete(key) }
8
+
6
9
  include Concerns::ExternalReferencesAttribute
7
10
 
8
11
  typelize seller_id: [:string, nullable: true], seller_name: [:string, nullable: true],
@@ -13,7 +13,6 @@ module Spree
13
13
  stock_transfer_number: [:string, nullable: true],
14
14
  purchase_order_number: [:string, nullable: true],
15
15
  unit_cost: [:string, nullable: true],
16
- display_unit_cost: [:string, nullable: true],
17
16
  stock_location_id: [:string, nullable: true],
18
17
  stock_location_name: [:string, nullable: true],
19
18
  variant_id: [:string, nullable: true],
@@ -101,11 +100,8 @@ module Spree
101
100
  # purchase. Null on a transfer or a return — moving stock the
102
101
  # merchant already owns is not buying it.
103
102
  attribute :unit_cost do |movement|
104
- movement.unit_cost&.to_s
105
- end
106
-
107
- attribute :display_unit_cost do |movement|
108
- movement.display_unit_cost&.to_s
103
+ currency = movement.purchase_order&.currency || (current_store || Spree::Current.store)&.default_currency
104
+ Spree::Money::Rounding.format(movement.unit_cost, currency, unit_price: true)
109
105
  end
110
106
  end
111
107
  end
@@ -5,6 +5,11 @@ module Spree
5
5
  # One line of a store credit's ledger: how the balance moved and what
6
6
  # moved it. Read-only — events are written by the credit itself.
7
7
  class StoreCreditEventSerializer < V3::StoreCreditEventSerializer
8
+ without_formatted_money
9
+
10
+ # No guest price gating here, so the inherited money fields are always present.
11
+ typelize amount: [:string, nullable: false]
12
+
8
13
  typelize originator_type: [:string, nullable: true],
9
14
  originator_id: [:string, nullable: true],
10
15
  store_credit_id: :string
@@ -3,11 +3,14 @@ module Spree
3
3
  module V3
4
4
  module Admin
5
5
  class StoreCreditSerializer < V3::StoreCreditSerializer
6
+ without_formatted_money
7
+
6
8
  typelize customer_id: [:string, nullable: true],
7
9
  created_by_id: [:string, nullable: true],
8
10
  memo: [:string, nullable: true],
9
- amount_authorized: :string,
10
- display_amount_authorized: :string,
11
+ amount: [:string, nullable: false], amount_used: [:string, nullable: false],
12
+ amount_remaining: [:string, nullable: false],
13
+ amount_authorized: [:string, nullable: false],
11
14
  outstanding: :boolean,
12
15
  originator_type: [:string, nullable: true],
13
16
  originator_id: [:string, nullable: true],
@@ -16,12 +19,14 @@ module Spree
16
19
  attributes :memo, :metadata,
17
20
  created_at: :iso8601, updated_at: :iso8601
18
21
 
19
- attributes amount_authorized: :string
22
+ money_attributes :amount_authorized
20
23
  # Answers the same question as the `outstanding` filter, so the row
21
24
  # and the filter cannot disagree.
22
25
  attribute :outstanding, &:outstanding?
23
26
 
24
- attributes display_amount_authorized: :string
27
+ # money_attributes types its fields nullable for gated guests; the
28
+ # Admin API never gates prices.
29
+ typelize amount_authorized: [:string, nullable: false]
25
30
  prefixed_id_attributes :customer, :created_by
26
31
 
27
32
  # Why the credit exists: the return, exchange, claim or gift card
@@ -4,119 +4,38 @@ module Spree
4
4
  module Admin
5
5
  class StoreSerializer < V3::BaseSerializer
6
6
  typelize name: :string, url: :string, code: :string, api_url: :string,
7
- preferred_storefront_url: [:string, nullable: true],
8
- default_currency: :string, default_locale: :string,
7
+ default_currency: [:string, enum: Spree::Money::Rounding::CURRENCY_CODES, enum_type_name: 'CurrencyCode'], default_locale: [:string, enum: Spree::Locales::ALL, enum_type_name: 'LocaleCode'],
9
8
  default_country_code: [:string, nullable: true],
10
- supported_currencies: [:string, multi: true],
11
- supported_locales: [:string, multi: true],
12
- available_locales: [:string, multi: true],
9
+ supported_currencies: [:string, multi: true, enum: Spree::Money::Rounding::CURRENCY_CODES, enum_type_name: 'CurrencyCode'],
10
+ supported_locales: [:string, multi: true, enum: Spree::Locales::ALL, enum_type_name: 'LocaleCode'],
11
+ available_locales: [:string, multi: true, enum: Spree::Locales::ALL, enum_type_name: 'LocaleCode'],
13
12
  logo_url: [:string, nullable: true],
14
13
  mailer_logo_url: [:string, nullable: true],
15
14
  mail_from_address: [:string, nullable: true],
16
15
  customer_support_email: [:string, nullable: true],
17
16
  new_order_notifications_email: [:string, nullable: true],
18
- preferred_send_consumer_transactional_emails: :boolean,
19
- preferred_email_accent_color: [:string, nullable: true],
20
- preferred_email_background_color: [:string, nullable: true],
21
- preferred_email_card_color: [:string, nullable: true],
22
- preferred_email_text_color: [:string, nullable: true],
23
- preferred_email_heading_color: [:string, nullable: true],
24
- preferred_email_font: [:string, nullable: true, enum: Spree::Emails::Branding::FONTS.keys],
25
- preferred_admin_locale: [:string, nullable: true],
26
- preferred_timezone: :string,
27
- preferred_weight_unit: [:string, enum: Spree::Variant::WEIGHT_UNITS],
28
- preferred_unit_system: :string,
29
- preferred_storefront_access: :string,
30
- preferred_guest_checkout: :boolean,
31
- preferred_always_include_confirm_step: :boolean,
32
- preferred_company_field_enabled: :boolean,
33
- preferred_address_requires_company: :boolean,
34
- preferred_address_requires_phone: :boolean,
35
- preferred_capture_method: :string,
36
- preferred_track_inventory_levels: :boolean,
37
- preferred_stock_reservations_enabled: :boolean,
38
- preferred_low_stock_threshold: :number,
39
- preferred_tax_using_ship_address: :boolean,
40
- preferred_track_price_history: :boolean,
41
- preferred_show_products_without_price: :boolean,
42
- preferred_disable_sku_validation: :boolean,
43
- preferred_order_routing_strategy: [:string, comment: 'Order routing strategy. Built-in: rules. Extensions may register more.'],
44
- preferred_pricing_provider: :string,
45
- preferred_inventory_provider: :string,
46
- preferred_pricing_provider_failure_policy: :string,
47
- preferred_inventory_provider_failure_policy: :string,
48
- preferred_payout_provider: [:string, nullable: true, comment: 'Payout provider; null uses the installation default. Built-in: system. Provider gems register more (e.g. stripe).'],
49
- preferred_default_payouts_schedule_interval: :string,
50
- preferred_default_minimum_payout_amount: :number,
51
- preferred_auto_approve_sellers: :boolean,
52
- preferred_auto_approve_seller_products: :boolean,
53
- preferred_send_seller_transactional_emails: :boolean,
54
- preferred_default_commission_tax_rate: :number,
55
- preferred_document_number_format: :string,
56
- preferred_order_number_prefix: :string,
57
- preferred_order_number_suffix: :string,
58
- preferred_order_number_sequence_start: :number,
17
+ order_routing_strategy: [:string, comment: 'Order routing strategy. Built-in: rules. Extensions may register more.'],
18
+ payout_provider: [:string, nullable: true, comment: 'Payout provider; null uses the installation default. Built-in: system. Provider gems register more (e.g. stripe).'],
59
19
  order_number_sequence_started: :boolean,
60
- preferred_limit_digital_download_count: :boolean,
61
- preferred_digital_asset_authorized_clicks: :number,
62
- preferred_limit_digital_download_days: :boolean,
63
- preferred_digital_asset_authorized_days: :number,
64
20
  metadata: 'Record<string, unknown>'
65
21
 
66
22
  attributes :metadata,
67
23
  :name,
68
24
  :code,
69
- :preferred_storefront_url,
70
25
  :default_currency,
71
26
  :default_locale,
72
27
  :default_country_code,
73
28
  :mail_from_address,
74
29
  :customer_support_email,
75
30
  :new_order_notifications_email,
76
- :preferred_send_consumer_transactional_emails,
77
- :preferred_email_accent_color,
78
- :preferred_email_background_color,
79
- :preferred_email_card_color,
80
- :preferred_email_text_color,
81
- :preferred_email_heading_color,
82
- :preferred_email_font,
83
- :preferred_admin_locale,
84
- :preferred_timezone,
85
- :preferred_weight_unit,
86
- :preferred_unit_system,
87
- :preferred_storefront_access,
88
- :preferred_guest_checkout,
89
- :preferred_always_include_confirm_step,
90
- :preferred_company_field_enabled,
91
- :preferred_address_requires_company,
92
- :preferred_address_requires_phone,
93
- :preferred_capture_method,
94
- :preferred_track_inventory_levels,
95
- :preferred_stock_reservations_enabled,
96
- :preferred_low_stock_threshold,
97
- :preferred_tax_using_ship_address,
98
- :preferred_track_price_history,
99
- :preferred_show_products_without_price,
100
- :preferred_disable_sku_validation,
101
- :preferred_pricing_provider,
102
- :preferred_inventory_provider,
103
- :preferred_pricing_provider_failure_policy,
104
- :preferred_inventory_provider_failure_policy,
105
- :preferred_default_payouts_schedule_interval,
106
- :preferred_auto_approve_sellers,
107
- :preferred_auto_approve_seller_products,
108
- :preferred_send_seller_transactional_emails,
109
- :preferred_document_number_format,
110
- :preferred_order_number_prefix,
111
- :preferred_order_number_suffix,
112
- :preferred_order_number_sequence_start,
113
- :preferred_limit_digital_download_count,
114
- :preferred_digital_asset_authorized_clicks,
115
- :preferred_limit_digital_download_days,
116
- :preferred_digital_asset_authorized_days,
117
31
  created_at: :iso8601, updated_at: :iso8601
118
32
 
119
- api_type_attributes :preferred_order_routing_strategy, :preferred_payout_provider
33
+ api_type_attributes :order_routing_strategy, :payout_provider
34
+
35
+ # The first two read through `api_type_attributes` above; the money
36
+ # and rate settings are formatted below.
37
+ preference_attributes Spree::Store, except: %i[order_routing_strategy payout_provider
38
+ default_minimum_payout_amount default_commission_tax_rate]
120
39
 
121
40
  # Once the counter has issued a number the starting value no longer
122
41
  # applies, so the settings page can say that instead of accepting a
@@ -125,14 +44,14 @@ module Spree
125
44
  Spree::NumberSequence.started?(store: store)
126
45
  end
127
46
 
128
- attribute :preferred_default_minimum_payout_amount do |store|
129
- store.preferred_default_minimum_payout_amount&.to_f
130
- end
47
+ typelize default_minimum_payout_amount: [:string, nullable: true]
131
48
 
132
- attribute :preferred_default_commission_tax_rate do |store|
133
- store.preferred_default_commission_tax_rate&.to_f
49
+ attribute :default_minimum_payout_amount do |store|
50
+ Spree::Money::Rounding.format(store.preferred_default_minimum_payout_amount, store.default_currency, unit_price: true)
134
51
  end
135
52
 
53
+ rate_attributes :default_commission_tax_rate
54
+
136
55
  attribute :url, &:storefront_url
137
56
 
138
57
  # The backend's own public URL — what a headless client sets as its
@@ -15,7 +15,7 @@ module Spree
15
15
  city: 'string | null',
16
16
  state_name: 'string | null',
17
17
  state_code: 'string | null',
18
- country_code: 'string | null',
18
+ country_code: [:string, nullable: true, enum: Spree::IsoData.country_codes, enum_type_name: 'CountryCode'],
19
19
  postal_code: 'string | null',
20
20
  purchase_orders_count: :number,
21
21
  can_be_deleted: :boolean,
@@ -7,8 +7,10 @@ module Spree
7
7
  class TaxExemptionCertificateSerializer < V3::BaseSerializer
8
8
  typelize certificate_number: :string, reason_code: :string, status: [:string, enum: Spree::TaxExemptionCertificate.statuses, enum_type_name: 'TaxExemptionCertificateStatus'],
9
9
  issuing_authority: [:string, nullable: true],
10
+ issued_at: [:string, nullable: true], expires_at: [:string, nullable: true],
11
+ verified_at: [:string, nullable: true],
10
12
  company_id: :string,
11
- country_code: [:string, nullable: true], state_code: [:string, nullable: true],
13
+ country_code: [:string, nullable: true, enum: Spree::IsoData.country_codes, enum_type_name: 'CountryCode'], state_code: [:string, nullable: true],
12
14
  active: :boolean, lapsed: :boolean, can_be_deleted: :boolean,
13
15
  document_filename: [:string, nullable: true],
14
16
  document_byte_size: ['number | null'],
@@ -3,9 +3,11 @@ module Spree
3
3
  module V3
4
4
  module Admin
5
5
  class TaxLineSerializer < V3::TaxLineSerializer
6
- typelize amount: [:string, nullable: false], display_amount: [:string, nullable: false],
6
+ without_formatted_money
7
+
8
+ typelize amount: [:string, nullable: false],
7
9
  provider_id: [:string, nullable: true], metadata: ['Record<string, unknown>', nullable: true],
8
- taxability_reason: [:string, nullable: true], country_code: [:string, nullable: true],
10
+ taxability_reason: [:string, nullable: true], country_code: [:string, nullable: true, enum: Spree::IsoData.country_codes, enum_type_name: 'CountryCode'],
9
11
  state_code: [:string, nullable: true], data: ['Record<string, unknown>', nullable: true],
10
12
  original_tax_line_id: [:string, nullable: true]
11
13
 
@@ -6,13 +6,11 @@ module Spree
6
6
  # customer-facing. What the customer sees is the label on a tax line.
7
7
  class TaxRateSerializer < V3::BaseSerializer
8
8
  typelize name: :string,
9
- amount: :string,
10
- amount_percentage: [:number, nullable: true],
11
9
  included_in_price: :boolean,
12
10
  show_rate_in_label: :boolean,
13
11
  tax_category_id: [:string, nullable: true],
14
12
  store_id: [:string, nullable: true],
15
- country_code: [:string, nullable: true],
13
+ country_code: [:string, nullable: true, enum: Spree::IsoData.country_codes, enum_type_name: 'CountryCode'],
16
14
  state_code: [:string, nullable: true],
17
15
  metadata: ['Record<string, unknown>', nullable: true],
18
16
  deleted_at: [:string, nullable: true]
@@ -20,15 +18,7 @@ module Spree
20
18
  attributes :name, :included_in_price, :show_rate_in_label, :metadata,
21
19
  created_at: :iso8601, updated_at: :iso8601, deleted_at: :iso8601
22
20
 
23
- attribute :amount do |tax_rate|
24
- tax_rate.amount&.to_s
25
- end
26
-
27
- # A real number, unlike the money-style `amount` string — this is a
28
- # percentage for display, not an amount to round-trip exactly.
29
- attribute :amount_percentage do |tax_rate|
30
- tax_rate.amount_percentage&.to_f
31
- end
21
+ rate_attributes :rate, :rate_percent
32
22
 
33
23
  prefixed_id_attributes :tax_category, :store
34
24
 
@@ -0,0 +1,28 @@
1
+ module Spree
2
+ module Api
3
+ module V3
4
+ module Admin
5
+ # What the last update check found (Spree::UpdateStatus). A computed
6
+ # value rather than a record, so it carries no id.
7
+ class UpdateStatusSerializer < V3::BaseSerializer
8
+ typelize current_version: :string,
9
+ enabled: :boolean,
10
+ update_available: :boolean,
11
+ latest_version: [:string, nullable: true],
12
+ latest_release_url: [:string, nullable: true],
13
+ latest_release_published_at: [:string, nullable: true],
14
+ checked_at: [:string, nullable: true]
15
+
16
+ _attributes.delete(:id)
17
+
18
+ attributes :current_version, :enabled, checked_at: :iso8601
19
+
20
+ attribute(:update_available) { |status| status.update_available? }
21
+ attribute(:latest_version) { |status| status.latest_release&.dig(:version) }
22
+ attribute(:latest_release_url) { |status| status.latest_release&.dig(:url) }
23
+ attribute(:latest_release_published_at) { |status| status.latest_release&.dig(:published_at)&.iso8601(3) }
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -5,19 +5,21 @@ module Spree
5
5
  # Admin API Variant Serializer
6
6
  # Full variant data including admin-only fields
7
7
  class VariantSerializer < V3::VariantSerializer
8
+ without_formatted_money
9
+
8
10
  include Concerns::ExternalReferencesAttribute
9
11
 
10
12
 
11
13
  typelize product_name: :string,
12
14
  position: :number, tax_category_id: [:string, nullable: true],
13
- cost_price: [:string, nullable: true], cost_currency: [:string, nullable: true],
15
+ cost_price: [:string, nullable: true], cost_currency: [:string, nullable: true, enum: Spree::Money::Rounding::CURRENCY_CODES, enum_type_name: 'CurrencyCode'],
14
16
  barcode: [:string, nullable: true],
15
17
  available_stock: [:number, nullable: true],
16
18
  reserved_quantity: :number, total_on_hand: [:number, nullable: true],
17
19
  preorderable: :boolean, preorder_ships_at: [:string, nullable: true],
18
20
  backorder_limit: [:number, nullable: true],
19
21
  hs_code: [:string, nullable: true],
20
- country_of_origin: [:string, nullable: true],
22
+ country_of_origin: [:string, nullable: true, enum: Spree::IsoData.country_codes, enum_type_name: 'CountryCode'],
21
23
  customs_description: [:string, nullable: true],
22
24
  deleted_at: [:string, nullable: true],
23
25
  delivery_profile_id: [:string, nullable: true],
@@ -32,7 +34,7 @@ module Spree
32
34
  # The last three override the store serializer's buyer-resolved
33
35
  # values with the variant's OWN: a merchant edits what is stored on
34
36
  # the row, not what some catalog resolves to for a buyer they are not.
35
- attributes :metadata, :position, :cost_price, :cost_currency,
37
+ attributes :metadata, :position, :cost_currency,
36
38
  :barcode, :backorder_limit,
37
39
  :hs_code, :country_of_origin, :customs_description,
38
40
  :minimum_order_quantity, :order_multiple, :purchase_unit,
@@ -40,6 +42,8 @@ module Spree
40
42
  preorder_ships_at: :iso8601, deleted_at: :iso8601,
41
43
  created_at: :iso8601, updated_at: :iso8601
42
44
 
45
+ money_attributes :cost_price, currency: :cost_currency, unit_price: true
46
+
43
47
  attribute :preorderable, &:preorderable?
44
48
 
45
49
  # Stored on the row only — nil means inherit from the product. The