spree_core 5.6.0 → 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 (1588) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +30 -0
  3. data/README.md +2 -3
  4. data/app/finders/spree/line_items/find_by_variant.rb +5 -3
  5. data/app/finders/spree/sellers/panel_url.rb +47 -0
  6. data/app/finders/spree/stores/dashboard_url.rb +76 -0
  7. data/app/helpers/spree/images_helper.rb +1 -1
  8. data/app/jobs/spree/carts/reap_expired_job.rb +43 -0
  9. data/app/jobs/spree/collections/regenerate_time_based_job.rb +18 -0
  10. data/app/jobs/spree/data_requests/process_job.rb +42 -0
  11. data/app/jobs/spree/events/subscriber_job.rb +1 -1
  12. data/app/jobs/spree/images/migrate_product_media_job.rb +80 -0
  13. data/app/jobs/spree/images/save_from_url_job.rb +70 -13
  14. data/app/jobs/spree/imports/create_categories_job.rb +23 -14
  15. data/app/jobs/spree/imports/create_rows_job.rb +3 -62
  16. data/app/jobs/spree/imports/process_group_job.rb +46 -27
  17. data/app/jobs/spree/imports/process_job.rb +164 -0
  18. data/app/jobs/spree/imports/process_rows_job.rb +4 -63
  19. data/app/jobs/spree/orders/finalize_stale_drafts_job.rb +29 -0
  20. data/app/jobs/spree/payments/handle_webhook_job.rb +1 -1
  21. data/app/jobs/spree/price_lists/sync_currencies_job.rb +42 -0
  22. data/app/jobs/spree/product_types/apply_to_products_job.rb +74 -0
  23. data/app/jobs/spree/products/auto_match_collections_job.rb +14 -0
  24. data/app/jobs/spree/products/auto_match_taxons_job.rb +6 -7
  25. data/app/jobs/spree/products/refresh_metrics_job.rb +1 -1
  26. data/app/jobs/spree/products/touch_categories_job.rb +15 -0
  27. data/app/jobs/spree/products/touch_taxons_job.rb +7 -6
  28. data/app/jobs/spree/seller_payouts/sweep_due_job.rb +57 -0
  29. data/app/jobs/spree/seller_payouts/sweep_seller_job.rb +70 -0
  30. data/app/jobs/spree/seller_transfers/execute_pending_due_job.rb +56 -0
  31. data/app/jobs/spree/seller_transfers/execute_pending_job.rb +52 -0
  32. data/app/jobs/spree/shipping_labels/store_file_job.rb +17 -0
  33. data/app/jobs/spree/stock_locations/stock_items/create_job.rb +7 -5
  34. data/app/jobs/spree/stock_locations/stock_levels/create_job.rb +13 -0
  35. data/app/jobs/spree/stock_reservations/expire_job.rb +1 -1
  36. data/app/jobs/spree/tax_identifiers/validate_job.rb +14 -0
  37. data/app/jobs/spree/variants/remove_line_item_job.rb +29 -1
  38. data/app/mailers/spree/admin_user_mailer.rb +6 -35
  39. data/app/mailers/spree/base_mailer.rb +1 -20
  40. data/app/mailers/spree/invitation_mailer.rb +1 -1
  41. data/app/mailers/spree/seller_user_mailer.rb +47 -0
  42. data/app/models/concerns/spree/account_lockout.rb +38 -0
  43. data/app/models/concerns/spree/admin_user_methods.rb +14 -34
  44. data/app/models/concerns/spree/calculated_adjustments.rb +8 -14
  45. data/app/models/concerns/spree/calculator/currency_amounts.rb +43 -0
  46. data/app/models/concerns/spree/capture_method.rb +33 -0
  47. data/app/models/concerns/spree/custom_field_filterable.rb +163 -0
  48. data/app/models/concerns/spree/customer_methods.rb +421 -0
  49. data/app/models/concerns/spree/deprecated_customer_alias.rb +22 -0
  50. data/app/models/concerns/spree/derived_number.rb +66 -0
  51. data/app/models/concerns/spree/has_address_book.rb +89 -0
  52. data/app/models/concerns/spree/has_custom_fields.rb +360 -0
  53. data/app/models/concerns/spree/has_external_references.rb +95 -0
  54. data/app/models/concerns/spree/has_iso_geography.rb +71 -0
  55. data/app/models/concerns/spree/has_library_media.rb +94 -0
  56. data/app/models/concerns/spree/has_list_position.rb +15 -0
  57. data/app/models/concerns/spree/has_number.rb +139 -0
  58. data/app/models/concerns/spree/has_status.rb +76 -0
  59. data/app/models/concerns/spree/has_tracking_carrier.rb +18 -0
  60. data/app/models/concerns/spree/instruments_gateway_calls.rb +20 -0
  61. data/app/models/concerns/spree/integration_backed_provider.rb +89 -0
  62. data/app/models/concerns/spree/integrations_concern.rb +15 -2
  63. data/app/models/concerns/spree/label_translatable.rb +37 -0
  64. data/app/models/concerns/spree/marketplace/order_group.rb +35 -0
  65. data/app/models/concerns/spree/metadata.rb +18 -22
  66. data/app/models/concerns/spree/named_type.rb +11 -1
  67. data/app/models/concerns/spree/parameterizable_name.rb +5 -5
  68. data/app/models/concerns/spree/password_policy.rb +37 -0
  69. data/app/models/concerns/spree/payment_session_transitions.rb +93 -0
  70. data/app/models/concerns/spree/payment_source_concern.rb +1 -1
  71. data/app/models/concerns/spree/personal_data_matching.rb +120 -0
  72. data/app/models/concerns/spree/preference_schema.rb +120 -19
  73. data/app/models/concerns/spree/prefixed_id.rb +25 -3
  74. data/app/models/concerns/spree/presentation_translatable.rb +4 -37
  75. data/app/models/concerns/spree/product_scopes.rb +51 -191
  76. data/app/models/concerns/spree/provider_failure_policy.rb +44 -0
  77. data/app/models/concerns/spree/publishable.rb +7 -7
  78. data/app/models/concerns/spree/purchase/addresses.rb +258 -0
  79. data/app/models/concerns/spree/purchase/channel.rb +19 -0
  80. data/app/models/concerns/spree/purchase/checkout_steps.rb +68 -0
  81. data/app/models/concerns/spree/purchase/company.rb +96 -0
  82. data/app/models/concerns/spree/purchase/currency.rb +29 -0
  83. data/app/models/concerns/spree/purchase/digital_items.rb +60 -0
  84. data/app/models/concerns/spree/purchase/freight.rb +52 -0
  85. data/app/models/concerns/spree/purchase/gift_cards.rb +70 -0
  86. data/app/models/concerns/spree/purchase/lifecycle.rb +53 -0
  87. data/app/models/concerns/spree/purchase/line_item_currencies.rb +38 -0
  88. data/app/models/concerns/spree/purchase/line_item_lookup.rb +25 -0
  89. data/app/models/concerns/spree/purchase/locale.rb +30 -0
  90. data/app/models/concerns/spree/purchase/market.rb +29 -0
  91. data/app/models/concerns/spree/purchase/payment_processing.rb +93 -0
  92. data/app/models/concerns/spree/purchase/purchase_order.rb +94 -0
  93. data/app/models/concerns/spree/purchase/quantity_rules.rb +136 -0
  94. data/app/models/concerns/spree/purchase/store_credits.rb +100 -0
  95. data/app/models/concerns/spree/purchase/taxation.rb +146 -0
  96. data/app/models/concerns/spree/purchase/totals.rb +116 -0
  97. data/app/models/concerns/spree/purchase/validations.rb +45 -0
  98. data/app/models/concerns/spree/receivable.rb +103 -0
  99. data/app/models/concerns/spree/receivable_item.rb +78 -0
  100. data/app/models/concerns/spree/refund_methods.rb +19 -0
  101. data/app/models/concerns/spree/sanitizable_rich_text.rb +109 -0
  102. data/app/models/concerns/spree/search_indexable.rb +5 -2
  103. data/app/models/concerns/spree/single_store_resource.rb +3 -1
  104. data/app/models/concerns/spree/store_data_sources.rb +75 -0
  105. data/app/models/concerns/spree/store_preferences.rb +49 -0
  106. data/app/models/concerns/spree/stores/markets.rb +75 -28
  107. data/app/models/concerns/spree/stores/setup.rb +16 -1
  108. data/app/models/concerns/spree/translatable_resource.rb +25 -6
  109. data/app/models/concerns/spree/typed_adjustment_line.rb +55 -0
  110. data/app/models/concerns/spree/user_address.rb +13 -3
  111. data/app/models/concerns/spree/user_management.rb +18 -6
  112. data/app/models/concerns/spree/user_methods.rb +5 -330
  113. data/app/models/concerns/spree/user_payment_source.rb +1 -1
  114. data/app/models/concerns/spree/user_roles.rb +18 -11
  115. data/app/models/concerns/spree/validates_store_uniqueness.rb +53 -0
  116. data/app/models/concerns/spree/vat_price_calculation.rb +58 -6
  117. data/app/models/concerns/spree/webhook_payload_redaction.rb +1 -1
  118. data/app/models/spree/ability.rb +147 -43
  119. data/app/models/spree/address.rb +387 -118
  120. data/app/models/spree/adjusters/base.rb +26 -0
  121. data/app/models/spree/adjusters/largest_remainder.rb +24 -0
  122. data/app/models/spree/adjusters/promotion.rb +253 -0
  123. data/app/models/spree/admin_user.rb +26 -0
  124. data/app/models/spree/allowed_origin.rb +1 -1
  125. data/app/models/spree/api_key.rb +29 -28
  126. data/app/models/spree/asset.rb +14 -211
  127. data/app/models/spree/authentication/strategies/base_strategy.rb +54 -3
  128. data/app/models/spree/authentication/strategies/email_password_strategy.rb +11 -3
  129. data/app/models/spree/authentication/strategies/oidc_strategy.rb +330 -0
  130. data/app/models/spree/authentication/strategy_registry.rb +83 -0
  131. data/app/models/spree/base.rb +119 -13
  132. data/app/models/spree/base_analytics_event_handler.rb +1 -1
  133. data/app/models/spree/calculator/shipping/digital_delivery.rb +5 -2
  134. data/app/models/spree/calculator/shipping/flat_rate.rb +10 -5
  135. data/app/models/spree/calculator/shipping/flexi_rate.rb +6 -0
  136. data/app/models/spree/calculator/shipping/per_item.rb +8 -3
  137. data/app/models/spree/calculator/shipping/price_sack.rb +6 -0
  138. data/app/models/spree/calculator/tiered_flat_rate.rb +5 -1
  139. data/app/models/spree/calculator.rb +10 -0
  140. data/app/models/spree/cart.rb +285 -0
  141. data/app/models/spree/carts/item_warning.rb +28 -0
  142. data/app/models/spree/carts/resolved_item.rb +37 -0
  143. data/app/models/spree/catalog.rb +466 -0
  144. data/app/models/spree/catalog_assignment.rb +41 -0
  145. data/app/models/spree/catalog_order_minimum.rb +26 -0
  146. data/app/models/spree/catalog_price.rb +100 -0
  147. data/app/models/spree/catalog_price_tier.rb +36 -0
  148. data/app/models/spree/catalog_product.rb +23 -0
  149. data/app/models/spree/catalog_quantity_rule.rb +46 -0
  150. data/app/models/spree/catalogs/product_term.rb +43 -0
  151. data/app/models/spree/category.rb +430 -12
  152. data/app/models/spree/channel/gating.rb +5 -6
  153. data/app/models/spree/channel.rb +38 -4
  154. data/app/models/spree/channel_stock_location.rb +8 -0
  155. data/app/models/spree/checkout/default_requirements.rb +105 -22
  156. data/app/models/spree/checkout/registry.rb +64 -12
  157. data/app/models/spree/checkout/requirement.rb +9 -9
  158. data/app/models/spree/checkout/requirements.rb +25 -20
  159. data/app/models/spree/checkout/step.rb +12 -12
  160. data/app/models/spree/claim.rb +68 -0
  161. data/app/models/spree/claim_line_item.rb +46 -0
  162. data/app/models/spree/claim_reason.rb +24 -0
  163. data/app/models/spree/classification.rb +7 -49
  164. data/app/models/spree/collection.rb +269 -0
  165. data/app/models/spree/collection_rule.rb +58 -0
  166. data/app/models/spree/collection_rules/available_on.rb +21 -0
  167. data/app/models/spree/collection_rules/sale.rb +18 -0
  168. data/app/models/spree/collection_rules/tag.rb +21 -0
  169. data/app/models/spree/commission_line.rb +85 -0
  170. data/app/models/spree/commission_rate.rb +370 -0
  171. data/app/models/spree/commission_rate_value.rb +47 -0
  172. data/app/models/spree/commission_rule.rb +77 -0
  173. data/app/models/spree/commission_rule_product.rb +19 -0
  174. data/app/models/spree/commission_rules/category_rule.rb +33 -0
  175. data/app/models/spree/commission_rules/item_total_rule.rb +31 -0
  176. data/app/models/spree/commission_rules/product_rule.rb +55 -0
  177. data/app/models/spree/commission_rules/seller_rule.rb +33 -0
  178. data/app/models/spree/commission_tax.rb +51 -0
  179. data/app/models/spree/commissions/context.rb +71 -0
  180. data/app/models/spree/company.rb +347 -0
  181. data/app/models/spree/company_invitation.rb +81 -0
  182. data/app/models/spree/company_membership.rb +25 -0
  183. data/app/models/spree/consent_record.rb +125 -0
  184. data/app/models/spree/country.rb +128 -52
  185. data/app/models/spree/coupon_code.rb +18 -5
  186. data/app/models/spree/credit_card.rb +10 -9
  187. data/app/models/spree/current.rb +124 -18
  188. data/app/models/spree/custom_field.rb +160 -7
  189. data/app/models/spree/custom_field_definition/search_capabilities.rb +98 -0
  190. data/app/models/spree/custom_field_definition.rb +219 -5
  191. data/app/models/spree/custom_fields/boolean.rb +15 -0
  192. data/app/models/spree/custom_fields/json.rb +38 -0
  193. data/app/models/spree/custom_fields/long_text.rb +11 -0
  194. data/app/models/spree/custom_fields/number.rb +23 -0
  195. data/app/models/spree/custom_fields/rich_text.rb +23 -0
  196. data/app/models/spree/custom_fields/short_text.rb +15 -0
  197. data/app/models/spree/customer.rb +34 -0
  198. data/app/models/spree/customer_group.rb +12 -12
  199. data/app/models/spree/customer_group_user.rb +6 -4
  200. data/app/models/spree/data_feed.rb +1 -1
  201. data/app/models/spree/data_request.rb +98 -0
  202. data/app/models/spree/delivery.rb +169 -0
  203. data/app/models/spree/delivery_method.rb +566 -0
  204. data/app/models/spree/delivery_method_rule.rb +55 -0
  205. data/app/models/spree/delivery_method_rule_product.rb +8 -0
  206. data/app/models/spree/delivery_method_rules/channel_rule.rb +41 -0
  207. data/app/models/spree/delivery_method_rules/company_rule.rb +24 -0
  208. data/app/models/spree/delivery_method_rules/excluded_products_rule.rb +48 -0
  209. data/app/models/spree/delivery_method_rules/item_total_rule.rb +19 -0
  210. data/app/models/spree/delivery_method_rules/volume_rule.rb +35 -0
  211. data/app/models/spree/delivery_method_rules/weight_rule.rb +19 -0
  212. data/app/models/spree/delivery_method_service.rb +24 -0
  213. data/app/models/spree/delivery_method_stock_location.rb +11 -0
  214. data/app/models/spree/delivery_origin_group.rb +73 -0
  215. data/app/models/spree/delivery_origin_group_location.rb +9 -0
  216. data/app/models/spree/delivery_profile.rb +141 -0
  217. data/app/models/spree/delivery_profiles/digital.rb +20 -0
  218. data/app/models/spree/delivery_profiles/shipping.rb +12 -0
  219. data/app/models/spree/delivery_rate.rb +164 -0
  220. data/app/models/spree/delivery_rate_provider/base.rb +120 -0
  221. data/app/models/spree/delivery_rate_provider/estimate.rb +44 -0
  222. data/app/models/spree/delivery_rate_provider/freight.rb +41 -0
  223. data/app/models/spree/delivery_rate_provider/internal.rb +28 -0
  224. data/app/models/spree/delivery_rate_provider/service_catalog.rb +48 -0
  225. data/app/models/spree/delivery_zone.rb +64 -0
  226. data/app/models/spree/delivery_zone_member.rb +98 -0
  227. data/app/models/spree/digital.rb +12 -16
  228. data/app/models/spree/digital_asset.rb +144 -0
  229. data/app/models/spree/digital_asset_provider/base.rb +95 -0
  230. data/app/models/spree/digital_asset_provider/file.rb +20 -0
  231. data/app/models/spree/digital_delivery.rb +28 -0
  232. data/app/models/spree/digital_link.rb +31 -11
  233. data/app/models/spree/discount.rb +51 -0
  234. data/app/models/spree/event.rb +6 -6
  235. data/app/models/spree/exchange.rb +49 -44
  236. data/app/models/spree/exchange_line_item.rb +52 -0
  237. data/app/models/spree/export.rb +138 -23
  238. data/app/models/spree/exports/customers.rb +2 -2
  239. data/app/models/spree/exports/gift_cards.rb +2 -2
  240. data/app/models/spree/exports/newsletter_subscribers.rb +2 -2
  241. data/app/models/spree/exports/orders.rb +35 -5
  242. data/app/models/spree/exports/price_list_prices.rb +107 -0
  243. data/app/models/spree/exports/products.rb +4 -4
  244. data/app/models/spree/exports/purchase_orders.rb +39 -0
  245. data/app/models/spree/exports/report.rb +95 -0
  246. data/app/models/spree/external_reference.rb +77 -0
  247. data/app/models/spree/external_video.rb +117 -0
  248. data/app/models/spree/fee.rb +40 -0
  249. data/app/models/spree/freight_summary/line.rb +257 -0
  250. data/app/models/spree/freight_summary.rb +180 -0
  251. data/app/models/spree/fulfillment/custom_events.rb +96 -0
  252. data/app/models/spree/fulfillment.rb +973 -0
  253. data/app/models/spree/fulfillment_changer.rb +170 -0
  254. data/app/models/spree/fulfillment_item.rb +148 -0
  255. data/app/models/spree/fulfillment_provider/base.rb +130 -0
  256. data/app/models/spree/fulfillment_provider/digital.rb +44 -0
  257. data/app/models/spree/fulfillment_provider/manual.rb +15 -0
  258. data/app/models/spree/fulfillment_provider/pickup.rb +38 -0
  259. data/app/models/spree/fulfillment_provider/pickup_point.rb +24 -0
  260. data/app/models/spree/fulfilment_changer.rb +3 -164
  261. data/app/models/spree/gateway/bogus.rb +5 -4
  262. data/app/models/spree/gateway/custom_payment_source_method.rb +5 -5
  263. data/app/models/spree/gateway.rb +2 -2
  264. data/app/models/spree/gateway_customer.rb +12 -4
  265. data/app/models/spree/gift_card.rb +140 -48
  266. data/app/models/spree/gift_card_batch.rb +2 -2
  267. data/app/models/spree/import.rb +222 -92
  268. data/app/models/spree/import_mapping.rb +1 -1
  269. data/app/models/spree/import_row.rb +35 -31
  270. data/app/models/spree/import_schemas/price_list_prices.rb +13 -0
  271. data/app/models/spree/import_schemas/products.rb +8 -1
  272. data/app/models/spree/import_schemas/purchase_orders.rb +19 -0
  273. data/app/models/spree/imports/price_list_prices.rb +72 -0
  274. data/app/models/spree/imports/purchase_orders.rb +28 -0
  275. data/app/models/spree/integration.rb +128 -5
  276. data/app/models/spree/inventory_provider/base.rb +30 -0
  277. data/app/models/spree/inventory_provider/internal.rb +22 -0
  278. data/app/models/spree/inventory_unit.rb +3 -139
  279. data/app/models/spree/invitation.rb +53 -47
  280. data/app/models/spree/label_purchase.rb +29 -0
  281. data/app/models/spree/line_item.rb +239 -105
  282. data/app/models/spree/market.rb +106 -15
  283. data/app/models/spree/market_country.rb +10 -5
  284. data/app/models/spree/media.rb +497 -0
  285. data/app/models/spree/media_usage_reference.rb +27 -0
  286. data/app/models/spree/metafield.rb +14 -91
  287. data/app/models/spree/metafield_definition.rb +11 -127
  288. data/app/models/spree/metafields.rb +32 -0
  289. data/app/models/spree/newsletter_subscriber.rb +10 -9
  290. data/app/models/spree/number_generators/base.rb +56 -0
  291. data/app/models/spree/number_generators/random.rb +23 -0
  292. data/app/models/spree/number_generators/sequential.rb +88 -0
  293. data/app/models/spree/number_sequence.rb +86 -0
  294. data/app/models/spree/option_type.rb +18 -32
  295. data/app/models/spree/option_type_product_type.rb +8 -0
  296. data/app/models/spree/option_value.rb +19 -13
  297. data/app/models/spree/option_value_variant.rb +0 -1
  298. data/app/models/spree/order.rb +628 -571
  299. data/app/models/spree/order_cancellation_reason.rb +25 -0
  300. data/app/models/spree/order_group.rb +244 -0
  301. data/app/models/spree/order_inventory.rb +42 -33
  302. data/app/models/spree/order_merger.rb +11 -6
  303. data/app/models/spree/order_promotion.rb +32 -6
  304. data/app/models/spree/order_routing/has_strategy_preference.rb +1 -2
  305. data/app/models/spree/order_routing/rules/minimize_splits.rb +6 -6
  306. data/app/models/spree/order_routing/strategy/rules.rb +12 -8
  307. data/app/models/spree/order_routing_rule.rb +5 -15
  308. data/app/models/spree/order_updater.rb +131 -163
  309. data/app/models/spree/package_type.rb +191 -0
  310. data/app/models/spree/payment/custom_events.rb +52 -5
  311. data/app/models/spree/payment/gateway_options.rb +20 -5
  312. data/app/models/spree/payment/processing.rb +95 -116
  313. data/app/models/spree/payment.rb +299 -123
  314. data/app/models/spree/payment_method/check.rb +4 -3
  315. data/app/models/spree/payment_method/session_instrumentation.rb +34 -0
  316. data/app/models/spree/payment_method/store_credit.rb +4 -2
  317. data/app/models/spree/payment_method.rb +106 -9
  318. data/app/models/spree/payment_session.rb +150 -53
  319. data/app/models/spree/payment_setup_session.rb +4 -37
  320. data/app/models/spree/payment_source.rb +5 -4
  321. data/app/models/spree/payment_split.rb +90 -0
  322. data/app/models/spree/payout_provider/base.rb +218 -0
  323. data/app/models/spree/payout_provider/system.rb +36 -0
  324. data/app/models/spree/permission_sets.rb +17 -0
  325. data/app/models/spree/pickup_point_option.rb +28 -0
  326. data/app/models/spree/pickup_point_provider/base.rb +24 -0
  327. data/app/models/spree/policy.rb +12 -11
  328. data/app/models/spree/price.rb +91 -5
  329. data/app/models/spree/price_adjustment_tier.rb +63 -0
  330. data/app/models/spree/price_history.rb +1 -1
  331. data/app/models/spree/price_list.rb +266 -142
  332. data/app/models/spree/price_rule.rb +51 -7
  333. data/app/models/spree/price_rules/channel_rule.rb +3 -0
  334. data/app/models/spree/price_rules/customer_group_rule.rb +10 -1
  335. data/app/models/spree/price_rules/market_rule.rb +6 -0
  336. data/app/models/spree/price_rules/user_rule.rb +12 -3
  337. data/app/models/spree/price_rules/volume_rule.rb +6 -0
  338. data/app/models/spree/price_rules/zone_rule.rb +5 -13
  339. data/app/models/spree/pricing_provider/base.rb +51 -0
  340. data/app/models/spree/pricing_provider/internal.rb +255 -0
  341. data/app/models/spree/pricing_provider.rb +28 -0
  342. data/app/models/spree/product.rb +539 -537
  343. data/app/models/spree/product_category.rb +65 -0
  344. data/app/models/spree/product_collection.rb +20 -0
  345. data/app/models/spree/product_option_type.rb +0 -1
  346. data/app/models/spree/product_promotion_rule.rb +0 -1
  347. data/app/models/spree/product_publication.rb +0 -1
  348. data/app/models/spree/product_submission.rb +72 -0
  349. data/app/models/spree/product_type.rb +116 -0
  350. data/app/models/spree/product_type_category.rb +8 -0
  351. data/app/models/spree/product_type_custom_field_definition.rb +39 -0
  352. data/app/models/spree/promotion/actions/create_adjustment.rb +9 -7
  353. data/app/models/spree/promotion/actions/create_item_adjustments.rb +11 -16
  354. data/app/models/spree/promotion/actions/create_line_items.rb +19 -8
  355. data/app/models/spree/promotion/actions/free_shipping.rb +12 -18
  356. data/app/models/spree/promotion/rules/category.rb +181 -0
  357. data/app/models/spree/promotion/rules/channel.rb +3 -3
  358. data/app/models/spree/promotion/rules/country.rb +43 -17
  359. data/app/models/spree/promotion/rules/currency.rb +2 -2
  360. data/app/models/spree/promotion/rules/customer_group.rb +13 -5
  361. data/app/models/spree/promotion/rules/first_order.rb +3 -3
  362. data/app/models/spree/promotion/rules/item_total.rb +2 -2
  363. data/app/models/spree/promotion/rules/market.rb +3 -3
  364. data/app/models/spree/promotion/rules/one_use_per_user.rb +4 -4
  365. data/app/models/spree/promotion/rules/option_value.rb +34 -11
  366. data/app/models/spree/promotion/rules/product.rb +3 -5
  367. data/app/models/spree/promotion/rules/taxon.rb +10 -131
  368. data/app/models/spree/promotion/rules/user.rb +14 -22
  369. data/app/models/spree/promotion/rules/user_logged_in.rb +3 -3
  370. data/app/models/spree/promotion.rb +59 -21
  371. data/app/models/spree/promotion_action.rb +52 -11
  372. data/app/models/spree/promotion_action_line_item.rb +1 -1
  373. data/app/models/spree/promotion_handler/coupon.rb +44 -16
  374. data/app/models/spree/promotion_handler/free_shipping.rb +1 -1
  375. data/app/models/spree/promotion_handler/promotion_duplicator.rb +1 -1
  376. data/app/models/spree/promotion_rule.rb +2 -9
  377. data/app/models/spree/promotion_rule_category.rb +22 -0
  378. data/app/models/spree/promotion_rule_taxon.rb +7 -6
  379. data/app/models/spree/promotion_rule_user.rb +2 -2
  380. data/app/models/spree/prototype.rb +3 -13
  381. data/app/models/spree/purchase_order.rb +95 -0
  382. data/app/models/spree/purchase_order_item.rb +40 -0
  383. data/app/models/spree/quantity_rule.rb +114 -0
  384. data/app/models/spree/refresh_token.rb +20 -2
  385. data/app/models/spree/refund.rb +94 -41
  386. data/app/models/spree/refund_reason.rb +32 -11
  387. data/app/models/spree/return.rb +150 -0
  388. data/app/models/spree/return_authorization_reason.rb +11 -6
  389. data/app/models/spree/return_line_item.rb +42 -0
  390. data/app/models/spree/return_reason.rb +26 -0
  391. data/app/models/spree/rich_text_sanitizer.rb +99 -0
  392. data/app/models/spree/role.rb +179 -4
  393. data/app/models/spree/role_user.rb +5 -21
  394. data/app/models/spree/saved_report.rb +56 -0
  395. data/app/models/spree/search_provider/base.rb +11 -0
  396. data/app/models/spree/search_provider/database.rb +106 -9
  397. data/app/models/spree/search_provider.rb +29 -0
  398. data/app/models/spree/seller.rb +475 -0
  399. data/app/models/spree/seller_balance.rb +86 -0
  400. data/app/models/spree/seller_payout.rb +116 -0
  401. data/app/models/spree/seller_requirement.rb +274 -0
  402. data/app/models/spree/seller_requirement_custom_field.rb +38 -0
  403. data/app/models/spree/seller_requirement_status.rb +144 -0
  404. data/app/models/spree/seller_requirement_submission.rb +91 -0
  405. data/app/models/spree/seller_requirements/accept_terms.rb +104 -0
  406. data/app/models/spree/seller_requirements/attestation.rb +22 -0
  407. data/app/models/spree/seller_requirements/billing_address.rb +13 -0
  408. data/app/models/spree/seller_requirements/complete_profile.rb +26 -0
  409. data/app/models/spree/seller_requirements/delivery_method.rb +20 -0
  410. data/app/models/spree/seller_requirements/document.rb +62 -0
  411. data/app/models/spree/seller_requirements/minimum_products.rb +20 -0
  412. data/app/models/spree/seller_requirements/operator_review.rb +23 -0
  413. data/app/models/spree/seller_requirements/package_type.rb +40 -0
  414. data/app/models/spree/seller_requirements/payout_account.rb +55 -0
  415. data/app/models/spree/seller_requirements/policy.rb +43 -0
  416. data/app/models/spree/seller_requirements/required_custom_fields.rb +56 -0
  417. data/app/models/spree/seller_requirements/returns_address.rb +19 -0
  418. data/app/models/spree/seller_transfer.rb +166 -0
  419. data/app/models/spree/setup_tasks.rb +3 -6
  420. data/app/models/spree/shipment.rb +3 -560
  421. data/app/models/spree/shipping_calculator.rb +7 -0
  422. data/app/models/spree/shipping_document.rb +32 -0
  423. data/app/models/spree/shipping_label.rb +146 -0
  424. data/app/models/spree/shipping_method.rb +3 -146
  425. data/app/models/spree/shipping_rate.rb +3 -97
  426. data/app/models/spree/state.rb +57 -23
  427. data/app/models/spree/stock/availability_validator.rb +1 -1
  428. data/app/models/spree/stock/content_item.rb +1 -0
  429. data/app/models/spree/stock/coordinator.rb +69 -9
  430. data/app/models/spree/stock/estimator.rb +198 -33
  431. data/app/models/spree/stock/inventory_unit_builder.rb +6 -1
  432. data/app/models/spree/stock/package.rb +145 -14
  433. data/app/models/spree/stock/packer.rb +20 -3
  434. data/app/models/spree/stock/prioritizer.rb +27 -4
  435. data/app/models/spree/stock/quantifier.rb +63 -38
  436. data/app/models/spree/stock/splitter/base.rb +3 -1
  437. data/app/models/spree/stock/splitter/delivery_profile.rb +41 -0
  438. data/app/models/spree/stock_item.rb +3 -147
  439. data/app/models/spree/stock_level/custom_events.rb +48 -0
  440. data/app/models/spree/stock_level.rb +305 -0
  441. data/app/models/spree/stock_location.rb +165 -87
  442. data/app/models/spree/stock_movement/custom_events.rb +1 -1
  443. data/app/models/spree/stock_movement.rb +166 -22
  444. data/app/models/spree/stock_receipt.rb +56 -0
  445. data/app/models/spree/stock_receipt_item.rb +35 -0
  446. data/app/models/spree/stock_reservation.rb +114 -11
  447. data/app/models/spree/stock_transfer.rb +84 -59
  448. data/app/models/spree/stock_transfer_item.rb +25 -0
  449. data/app/models/spree/store.rb +427 -107
  450. data/app/models/spree/store_credit.rb +88 -21
  451. data/app/models/spree/store_credit_category.rb +21 -28
  452. data/app/models/spree/store_credit_event.rb +1 -1
  453. data/app/models/spree/store_credit_type.rb +10 -2
  454. data/app/models/spree/store_payment_method.rb +0 -1
  455. data/app/models/spree/store_product.rb +2 -2
  456. data/app/models/spree/store_promotion.rb +0 -1
  457. data/app/models/spree/storefront/access_denied.rb +22 -0
  458. data/app/models/spree/storefront/access_policy.rb +180 -0
  459. data/app/models/spree/subscriber.rb +6 -6
  460. data/app/models/spree/supplier.rb +76 -0
  461. data/app/models/spree/tax_category.rb +15 -5
  462. data/app/models/spree/tax_exemption/item_override.rb +22 -0
  463. data/app/models/spree/tax_exemption.rb +81 -0
  464. data/app/models/spree/tax_exemption_certificate.rb +95 -0
  465. data/app/models/spree/tax_identifier.rb +209 -0
  466. data/app/models/spree/tax_identifiers/validation_result.rb +41 -0
  467. data/app/models/spree/tax_identifiers/validator/base.rb +53 -0
  468. data/app/models/spree/tax_identifiers/validator/eu_vat.rb +76 -0
  469. data/app/models/spree/tax_line.rb +79 -0
  470. data/app/models/spree/tax_provider/base.rb +150 -0
  471. data/app/models/spree/tax_provider/internal.rb +227 -0
  472. data/app/models/spree/tax_rate.rb +63 -100
  473. data/app/models/spree/taxon.rb +13 -514
  474. data/app/models/spree/taxon_rule.rb +8 -9
  475. data/app/models/spree/taxonomy.rb +8 -42
  476. data/app/models/spree/user_identity.rb +2 -2
  477. data/app/models/spree/variant.rb +629 -150
  478. data/app/models/spree/variant_media.rb +6 -7
  479. data/app/models/spree/webhook_endpoint.rb +2 -1
  480. data/app/models/spree/wished_item.rb +3 -31
  481. data/app/models/spree/wishlist.rb +17 -10
  482. data/app/models/spree/wishlist_item/custom_events.rb +42 -0
  483. data/app/models/spree/wishlist_item.rb +37 -0
  484. data/app/models/spree/zone.rb +24 -182
  485. data/app/models/spree/zone_member.rb +5 -8
  486. data/app/presenters/spree/csv/custom_fields_helper.rb +25 -0
  487. data/app/presenters/spree/csv/customer_presenter.rb +7 -6
  488. data/app/presenters/spree/csv/gift_card_presenter.rb +9 -8
  489. data/app/presenters/spree/csv/newsletter_subscriber_presenter.rb +7 -6
  490. data/app/presenters/spree/csv/order_line_item_presenter.rb +53 -21
  491. data/app/presenters/spree/csv/price_list_price_presenter.rb +41 -0
  492. data/app/presenters/spree/csv/product_variant_presenter.rb +22 -21
  493. data/app/presenters/spree/csv/purchase_order_item_presenter.rb +50 -0
  494. data/app/presenters/spree/data_feeds/google_presenter.rb +24 -10
  495. data/app/presenters/spree/filters/options_presenter.rb +2 -2
  496. data/app/services/spree/addresses/create.rb +70 -27
  497. data/app/services/spree/addresses/helper.rb +17 -54
  498. data/app/services/spree/addresses/update.rb +53 -31
  499. data/app/services/spree/carts/associate.rb +46 -0
  500. data/app/services/spree/carts/check_availability.rb +72 -0
  501. data/app/services/spree/carts/create.rb +7 -1
  502. data/app/services/spree/carts/destroy.rb +71 -0
  503. data/app/services/spree/carts/empty.rb +42 -0
  504. data/app/services/spree/carts/partition_by_seller.rb +71 -0
  505. data/app/services/spree/carts/price_items.rb +119 -0
  506. data/app/services/spree/carts/remove_item.rb +42 -0
  507. data/app/services/spree/carts/remove_line_item.rb +42 -0
  508. data/app/services/spree/carts/remove_out_of_stock_items.rb +104 -0
  509. data/app/services/spree/carts/set_quantity.rb +39 -0
  510. data/app/services/spree/carts/split_by_seller.rb +475 -0
  511. data/app/services/spree/carts/update.rb +157 -51
  512. data/app/services/spree/catalogs/resolve_prices.rb +192 -0
  513. data/app/services/spree/catalogs/resolve_quantity_rules.rb +115 -0
  514. data/app/services/spree/catalogs/set_assignments.rb +59 -0
  515. data/app/services/spree/catalogs/set_order_minimums.rb +44 -0
  516. data/app/services/spree/catalogs/set_product_terms.rb +83 -0
  517. data/app/services/spree/categories/add_products.rb +51 -0
  518. data/app/services/spree/categories/remove_products.rb +72 -0
  519. data/app/services/spree/checkout/add_store_credit.rb +11 -79
  520. data/app/services/spree/checkout/advance.rb +38 -38
  521. data/app/services/spree/checkout/remove_store_credit.rb +7 -12
  522. data/app/services/spree/collections/add_products.rb +42 -0
  523. data/app/services/spree/collections/regenerate_products.rb +67 -0
  524. data/app/services/spree/collections/remove_products.rb +65 -0
  525. data/app/services/spree/commissions/calculate_line.rb +132 -0
  526. data/app/services/spree/commissions/commission_order.rb +185 -0
  527. data/app/services/spree/commissions/resolve_rate.rb +114 -0
  528. data/app/services/spree/commissions/resolve_tax_rate.rb +78 -0
  529. data/app/services/spree/companies/add_member.rb +38 -0
  530. data/app/services/spree/company_invitations/accept.rb +60 -0
  531. data/app/services/spree/coupon_codes/coupon_codes_handler.rb +14 -2
  532. data/app/services/spree/customers/data_export.rb +372 -0
  533. data/app/services/spree/data_requests/create.rb +77 -0
  534. data/app/services/spree/deliveries/create.rb +56 -0
  535. data/app/services/spree/deliveries/destroy.rb +39 -0
  536. data/app/services/spree/deliveries/upsert_primary.rb +43 -0
  537. data/app/services/spree/fulfillments/recalculate_delivery.rb +62 -0
  538. data/app/services/spree/fulfillments/stand_down_provider.rb +47 -0
  539. data/app/services/spree/imports/row_processors/customer.rb +8 -8
  540. data/app/services/spree/imports/row_processors/price_list_price.rb +164 -0
  541. data/app/services/spree/imports/row_processors/product_variant.rb +199 -58
  542. data/app/services/spree/imports/row_processors/purchase_order.rb +157 -0
  543. data/app/services/spree/media/destroy.rb +88 -0
  544. data/app/services/spree/media/usage.rb +175 -0
  545. data/app/services/spree/newsletter/link_user.rb +4 -3
  546. data/app/services/spree/newsletter/subscribe.rb +3 -3
  547. data/app/services/spree/newsletter/verify.rb +6 -2
  548. data/app/services/spree/order_groups/allocate_payments.rb +101 -0
  549. data/app/services/spree/orders/approve.rb +9 -23
  550. data/app/services/spree/orders/build_fulfillments.rb +29 -0
  551. data/app/services/spree/orders/create.rb +38 -17
  552. data/app/services/spree/orders/create_from_cart.rb +88 -0
  553. data/app/services/spree/orders/create_user_account.rb +14 -67
  554. data/app/services/spree/orders/discounts/create.rb +84 -0
  555. data/app/services/spree/orders/discounts/destroy.rb +25 -0
  556. data/app/services/spree/orders/discounts/update.rb +29 -0
  557. data/app/services/spree/orders/fees/create.rb +28 -0
  558. data/app/services/spree/orders/fees/destroy.rb +22 -0
  559. data/app/services/spree/orders/fees/update.rb +25 -0
  560. data/app/services/spree/orders/remove_item.rb +13 -0
  561. data/app/services/spree/orders/remove_line_item.rb +13 -0
  562. data/app/services/spree/orders/update.rb +56 -11
  563. data/app/services/spree/orders/update_item.rb +105 -0
  564. data/app/services/spree/orders/update_statuses.rb +109 -0
  565. data/app/services/spree/payments/create.rb +31 -5
  566. data/app/services/spree/prices/bulk_upsert.rb +156 -30
  567. data/app/services/spree/product_submissions/close.rb +46 -0
  568. data/app/services/spree/product_types/apply_to_products.rb +167 -0
  569. data/app/services/spree/products/auto_match_collections.rb +75 -0
  570. data/app/services/spree/products/auto_match_taxons.rb +7 -54
  571. data/app/services/spree/products/duplicator.rb +16 -22
  572. data/app/services/spree/products/for_context.rb +54 -0
  573. data/app/services/spree/products/select_buy_box.rb +98 -0
  574. data/app/services/spree/purchases/amount_due_at_checkout.rb +33 -0
  575. data/app/services/spree/returns/eligibility_validator.rb +53 -0
  576. data/app/services/spree/sample_data/helper.rb +55 -0
  577. data/app/services/spree/sample_data/import_builder.rb +36 -0
  578. data/app/services/spree/sample_data/import_runner.rb +25 -41
  579. data/app/services/spree/sample_data/loader.rb +21 -63
  580. data/app/services/spree/search_provider/custom_field_schema.rb +153 -0
  581. data/app/services/spree/seeds/admin_user.rb +72 -12
  582. data/app/services/spree/seeds/all.rb +24 -13
  583. data/app/services/spree/seeds/allowed_origins.rb +3 -4
  584. data/app/services/spree/seeds/commission_rates.rb +53 -0
  585. data/app/services/spree/seeds/digital_delivery.rb +18 -8
  586. data/app/services/spree/seeds/product_types.rb +23 -0
  587. data/app/services/spree/seeds/returns_environment.rb +44 -16
  588. data/app/services/spree/seeds/roles.rb +6 -1
  589. data/app/services/spree/seeds/saved_reports.rb +107 -0
  590. data/app/services/spree/seeds/seller_requirements.rb +19 -0
  591. data/app/services/spree/seeds/stores.rb +1 -1
  592. data/app/services/spree/seeds/tax_categories.rb +9 -2
  593. data/app/services/spree/sellers/requirements.rb +129 -0
  594. data/app/services/spree/shipments/update.rb +4 -33
  595. data/app/services/spree/shipping_labels/confirm_refund.rb +47 -0
  596. data/app/services/spree/shipping_labels/store_file.rb +68 -0
  597. data/app/services/spree/stock_levels/bulk_upsert.rb +67 -0
  598. data/app/services/spree/stock_levels/correct.rb +69 -0
  599. data/app/services/spree/stock_levels/recount.rb +103 -0
  600. data/app/services/spree/stock_locations/stock_items/create.rb +8 -13
  601. data/app/services/spree/stock_locations/stock_levels/create.rb +25 -0
  602. data/app/services/spree/stock_reservations/extend.rb +9 -5
  603. data/app/services/spree/stock_reservations/release.rb +4 -3
  604. data/app/services/spree/stock_reservations/reserve.rb +43 -32
  605. data/app/services/spree/store_credits/apply.rb +93 -0
  606. data/app/services/spree/store_credits/remove.rb +17 -0
  607. data/app/services/spree/stores/provision_defaults.rb +269 -0
  608. data/app/services/spree/tax/resolve_exemptions.rb +44 -0
  609. data/app/services/spree/tax/unusable_exemption_error.rb +8 -0
  610. data/app/services/spree/tax_identifiers/validate.rb +77 -0
  611. data/app/services/spree/taxons/add_products.rb +6 -39
  612. data/app/services/spree/taxons/regenerate_products.rb +8 -53
  613. data/app/services/spree/taxons/remove_products.rb +6 -60
  614. data/app/services/spree/variants/remove_line_items.rb +6 -1
  615. data/app/subscribers/spree/event_log_subscriber.rb +1 -1
  616. data/app/subscribers/spree/order_commission_subscriber.rb +23 -0
  617. data/app/subscribers/spree/order_placed_subscriber.rb +58 -0
  618. data/app/subscribers/spree/order_status_subscriber.rb +82 -0
  619. data/app/subscribers/spree/payment_split_subscriber.rb +71 -0
  620. data/app/subscribers/spree/product_metrics_subscriber.rb +2 -2
  621. data/app/subscribers/spree/seller_onboarding_subscriber.rb +32 -0
  622. data/app/subscribers/spree/seller_transfer_reversal_subscriber.rb +26 -0
  623. data/app/subscribers/spree/seller_transfer_subscriber.rb +26 -0
  624. data/app/subscribers/spree/seller_user_email_subscriber.rb +27 -0
  625. data/app/subscribers/spree/tax_identifier_validation_subscriber.rb +26 -0
  626. data/app/validators/spree/addresses/phone_validator.rb +2 -2
  627. data/app/validators/spree/attachment_content_type_validator.rb +183 -0
  628. data/app/validators/spree/password_length_validator.rb +23 -0
  629. data/app/views/spree/seller_user_mailer/password_reset_email.html.erb +8 -0
  630. data/app/views/spree/shared/_purchased_items_styles.html.erb +7 -0
  631. data/app/workflows/spree/carts/add_item.rb +234 -0
  632. data/app/workflows/spree/carts/complete.rb +516 -0
  633. data/app/workflows/spree/carts/merge.rb +90 -0
  634. data/app/workflows/spree/carts/recalculate.rb +54 -0
  635. data/app/workflows/spree/carts/recalculate_totals.rb +233 -0
  636. data/app/workflows/spree/carts/upsert_items.rb +368 -0
  637. data/app/workflows/spree/catalogs/activate.rb +51 -0
  638. data/app/workflows/spree/catalogs/create.rb +83 -0
  639. data/app/workflows/spree/catalogs/deactivate.rb +35 -0
  640. data/app/workflows/spree/catalogs/set_price_list.rb +130 -0
  641. data/app/workflows/spree/catalogs/update.rb +85 -0
  642. data/app/workflows/spree/claims/approve.rb +38 -0
  643. data/app/workflows/spree/claims/cancel.rb +37 -0
  644. data/app/workflows/spree/claims/create.rb +82 -0
  645. data/app/workflows/spree/claims/deny.rb +35 -0
  646. data/app/workflows/spree/claims/resolve.rb +166 -0
  647. data/app/workflows/spree/customers/anonymize.rb +502 -0
  648. data/app/workflows/spree/customers/create.rb +247 -0
  649. data/app/workflows/spree/data_requests/fulfill.rb +165 -0
  650. data/app/workflows/spree/deliveries/update_tracking.rb +96 -0
  651. data/app/workflows/spree/exchanges/approve.rb +38 -0
  652. data/app/workflows/spree/exchanges/cancel.rb +40 -0
  653. data/app/workflows/spree/exchanges/create.rb +90 -0
  654. data/app/workflows/spree/exchanges/fulfill.rb +146 -0
  655. data/app/workflows/spree/exchanges/receive.rb +86 -0
  656. data/app/workflows/spree/fulfillments/cancel.rb +87 -0
  657. data/app/workflows/spree/fulfillments/create.rb +346 -0
  658. data/app/workflows/spree/fulfillments/fulfill.rb +354 -0
  659. data/app/workflows/spree/fulfillments/mark_delivered.rb +67 -0
  660. data/app/workflows/spree/fulfillments/purchase_label.rb +40 -0
  661. data/app/workflows/spree/fulfillments/update.rb +123 -0
  662. data/app/workflows/spree/gift_cards/apply.rb +235 -0
  663. data/app/workflows/spree/gift_cards/cancel.rb +43 -0
  664. data/app/workflows/spree/gift_cards/redeem.rb +59 -0
  665. data/app/workflows/spree/gift_cards/remove.rb +78 -0
  666. data/app/workflows/spree/imports/complete.rb +45 -0
  667. data/app/workflows/spree/imports/complete_mapping.rb +50 -0
  668. data/app/workflows/spree/imports/retry_failed_rows.rb +46 -0
  669. data/app/workflows/spree/imports/start_mapping.rb +48 -0
  670. data/app/workflows/spree/imports/start_processing.rb +36 -0
  671. data/app/workflows/spree/invitations/accept.rb +50 -0
  672. data/app/workflows/spree/orders/add_item.rb +12 -0
  673. data/app/workflows/spree/orders/cancel.rb +260 -0
  674. data/app/workflows/spree/orders/complete.rb +169 -0
  675. data/app/workflows/spree/orders/recalculate.rb +11 -0
  676. data/app/workflows/spree/orders/recalculate_totals.rb +12 -0
  677. data/app/workflows/spree/orders/upsert_items.rb +28 -0
  678. data/app/workflows/spree/payment_sessions/complete.rb +44 -0
  679. data/app/workflows/spree/payments/capture.rb +109 -0
  680. data/app/workflows/spree/payments/handle_webhook.rb +100 -0
  681. data/app/workflows/spree/payments/process.rb +73 -0
  682. data/app/workflows/spree/payments/void.rb +72 -0
  683. data/app/workflows/spree/price_lists/activate.rb +49 -0
  684. data/app/workflows/spree/price_lists/create.rb +57 -0
  685. data/app/workflows/spree/price_lists/deactivate.rb +30 -0
  686. data/app/workflows/spree/price_lists/update.rb +117 -0
  687. data/app/workflows/spree/products/activate.rb +33 -0
  688. data/app/workflows/spree/products/approve.rb +52 -0
  689. data/app/workflows/spree/products/archive.rb +44 -0
  690. data/app/workflows/spree/products/create.rb +82 -0
  691. data/app/workflows/spree/products/destroy.rb +35 -0
  692. data/app/workflows/spree/products/draft.rb +49 -0
  693. data/app/workflows/spree/products/nested_attributes.rb +242 -0
  694. data/app/workflows/spree/products/propose.rb +62 -0
  695. data/app/workflows/spree/products/reject.rb +54 -0
  696. data/app/workflows/spree/products/update.rb +83 -0
  697. data/app/workflows/spree/purchase_orders/cancel.rb +57 -0
  698. data/app/workflows/spree/purchase_orders/close.rb +57 -0
  699. data/app/workflows/spree/purchase_orders/create.rb +68 -0
  700. data/app/workflows/spree/purchase_orders/mark_draft.rb +49 -0
  701. data/app/workflows/spree/purchase_orders/mark_ordered.rb +50 -0
  702. data/app/workflows/spree/purchase_orders/receive.rb +65 -0
  703. data/app/workflows/spree/purchase_orders/update.rb +56 -0
  704. data/app/workflows/spree/receivables/incoming_counter.rb +50 -0
  705. data/app/workflows/spree/refunds/create.rb +136 -0
  706. data/app/workflows/spree/refunds/order_payments.rb +129 -0
  707. data/app/workflows/spree/returns/approve.rb +47 -0
  708. data/app/workflows/spree/returns/cancel.rb +52 -0
  709. data/app/workflows/spree/returns/create.rb +135 -0
  710. data/app/workflows/spree/returns/purchase_label.rb +32 -0
  711. data/app/workflows/spree/returns/receive.rb +94 -0
  712. data/app/workflows/spree/returns/refund.rb +134 -0
  713. data/app/workflows/spree/seller_payouts/complete.rb +80 -0
  714. data/app/workflows/spree/seller_payouts/sweep.rb +192 -0
  715. data/app/workflows/spree/seller_requirement_submissions/accept.rb +40 -0
  716. data/app/workflows/spree/seller_requirement_submissions/create.rb +104 -0
  717. data/app/workflows/spree/seller_requirement_submissions/reject.rb +45 -0
  718. data/app/workflows/spree/seller_requirement_submissions/reviewable.rb +19 -0
  719. data/app/workflows/spree/seller_requirement_submissions/waive.rb +64 -0
  720. data/app/workflows/spree/seller_transfers/create.rb +131 -0
  721. data/app/workflows/spree/seller_transfers/reverse.rb +241 -0
  722. data/app/workflows/spree/sellers/approve.rb +88 -0
  723. data/app/workflows/spree/sellers/create.rb +72 -0
  724. data/app/workflows/spree/sellers/invite.rb +61 -0
  725. data/app/workflows/spree/sellers/reject.rb +52 -0
  726. data/app/workflows/spree/sellers/reopen_onboarding.rb +55 -0
  727. data/app/workflows/spree/sellers/start_onboarding.rb +46 -0
  728. data/app/workflows/spree/sellers/submit_for_review.rb +76 -0
  729. data/app/workflows/spree/sellers/suspend.rb +55 -0
  730. data/app/workflows/spree/shipping_labels/purchase.rb +154 -0
  731. data/app/workflows/spree/shipping_labels/record.rb +102 -0
  732. data/app/workflows/spree/shipping_labels/refund.rb +77 -0
  733. data/app/workflows/spree/stock_receipts/recording.rb +165 -0
  734. data/app/workflows/spree/stock_transfers/cancel.rb +103 -0
  735. data/app/workflows/spree/stock_transfers/close.rb +56 -0
  736. data/app/workflows/spree/stock_transfers/create.rb +63 -0
  737. data/app/workflows/spree/stock_transfers/mark_draft.rb +41 -0
  738. data/app/workflows/spree/stock_transfers/mark_in_transit.rb +91 -0
  739. data/app/workflows/spree/stock_transfers/mark_ready.rb +36 -0
  740. data/app/workflows/spree/stock_transfers/receive.rb +62 -0
  741. data/app/workflows/spree/stock_transfers/update.rb +55 -0
  742. data/app/workflows/spree/tax_exemption_certificates/verify.rb +48 -0
  743. data/app/workflows/spree/variants/create.rb +66 -0
  744. data/app/workflows/spree/variants/nested_attributes.rb +90 -0
  745. data/app/workflows/spree/variants/update.rb +55 -0
  746. data/config/brakeman.ignore +79 -79
  747. data/config/i18n-tasks.yml +4 -3
  748. data/config/initializers/mobility.rb +0 -4
  749. data/config/initializers/spree_store_setup_tasks.rb +4 -0
  750. data/config/locales/en.yml +955 -187
  751. data/config/routes.rb +11 -4
  752. data/db/migrate/20220201103922_add_first_name_and_last_name_to_spree_users.rb +7 -5
  753. data/db/migrate/20221215151408_add_selected_locale_to_spree_users.rb +6 -4
  754. data/db/migrate/20250127151258_add_phone_to_spree_users.rb +3 -1
  755. data/db/migrate/20250207084000_add_accepts_email_marketing_field_to_spree_users_table.rb +4 -2
  756. data/db/migrate/20250410061306_create_spree_invitations.rb +1 -1
  757. data/db/migrate/20250605131334_add_missing_fields_to_users.rb +24 -20
  758. data/db/migrate/20260315100000_add_product_media_support.rb +4 -1
  759. data/db/migrate/20260613000001_add_store_id_to_spree_role_users.rb +6 -3
  760. data/db/migrate/20260630000001_add_default_variant_id_to_spree_products.rb +9 -0
  761. data/db/migrate/20260708160054_create_spree_collections.rb +69 -0
  762. data/db/migrate/20260710000001_rename_taxons_to_categories.rb +28 -0
  763. data/db/migrate/20260722000001_add_searchable_sortable_to_spree_metafield_definitions.rb +6 -0
  764. data/db/migrate/20260727000001_add_unique_country_abbr_index_to_spree_states.rb +53 -0
  765. data/db/migrate/20260728000000_create_spree_customers_and_admin_users.rb +59 -0
  766. data/db/migrate/20260728000001_rename_prototypes_to_product_types.rb +59 -0
  767. data/db/migrate/20260728000002_create_spree_delivery_zones.rb +29 -0
  768. data/db/migrate/20260728000003_create_spree_carts.rb +58 -0
  769. data/db/migrate/20260728000003_rename_user_id_to_customer_id.rb +30 -0
  770. data/db/migrate/20260728000004_rename_shipping_to_fulfillment_and_delivery.rb +83 -0
  771. data/db/migrate/20260728000005_add_fulfillment_type_columns.rb +33 -0
  772. data/db/migrate/20260729000001_create_typed_adjustment_tables.rb +87 -0
  773. data/db/migrate/20260729100001_add_checkout_columns_to_spree_carts.rb +15 -0
  774. data/db/migrate/20260729100002_relax_owner_null_constraints.rb +7 -0
  775. data/db/migrate/20260729120001_rename_order_totals_to_standard_names.rb +7 -0
  776. data/db/migrate/20260729130001_create_spree_delivery_method_rules.rb +19 -0
  777. data/db/migrate/20260729140001_add_coupon_code_to_spree_orders.rb +6 -0
  778. data/db/migrate/20260729150001_add_store_to_delivery_methods_and_stock_locations.rb +6 -0
  779. data/db/migrate/20260802190001_create_spree_returns.rb +49 -0
  780. data/db/migrate/20260802210001_create_spree_exchanges_and_claims.rb +80 -0
  781. data/db/migrate/20260805100001_rename_return_authorization_reasons_to_return_reasons.rb +109 -0
  782. data/db/migrate/20260806000001_add_store_id_to_spree_tax_rates_and_categories.rb +16 -0
  783. data/db/migrate/20260806000001_create_spree_delivery_method_rule_products.rb +22 -0
  784. data/db/migrate/20260806000002_add_treatment_columns_to_spree_tax_lines.rb +19 -0
  785. data/db/migrate/20260806000003_create_spree_tax_identifiers.rb +41 -0
  786. data/db/migrate/20260806000004_add_tax_provider_to_spree_markets.rb +9 -0
  787. data/db/migrate/20260806000005_add_country_and_state_to_spree_tax_rates.rb +20 -0
  788. data/db/migrate/20260806100001_create_spree_product_type_custom_field_definitions.rb +17 -0
  789. data/db/migrate/20260806120001_add_rate_provider_to_delivery_methods.rb +7 -0
  790. data/db/migrate/20260806120002_add_carrier_columns_to_delivery_rates.rb +13 -0
  791. data/db/migrate/20260806130001_add_unique_store_type_index_to_spree_integrations.rb +9 -0
  792. data/db/migrate/20260807000001_add_permissions_to_spree_roles.rb +14 -0
  793. data/db/migrate/20260807000001_create_spree_companies.rb +66 -0
  794. data/db/migrate/20260807000003_create_spree_tax_exemption_certificates.rb +31 -0
  795. data/db/migrate/20260807120001_remove_claim_type_from_spree_claims.rb +5 -0
  796. data/db/migrate/20260807130001_add_country_state_codes_to_consumers.rb +28 -0
  797. data/db/migrate/20260807150001_reindex_spree_categories_by_store.rb +42 -0
  798. data/db/migrate/20260809000001_rename_metafields_to_custom_fields.rb +126 -0
  799. data/db/migrate/20260809100001_support_multi_rate_delivery_methods.rb +35 -0
  800. data/db/migrate/20260809120001_consolidate_metadata_columns.rb +120 -0
  801. data/db/migrate/20260809150001_promote_shipping_categories_to_delivery_profiles.rb +153 -0
  802. data/db/migrate/20260809170001_create_spree_channel_stock_locations.rb +17 -0
  803. data/db/migrate/20260809200001_add_rich_text_columns_for_action_text_removal.rb +11 -0
  804. data/db/migrate/20260810000001_rename_digitals_to_digital_assets.rb +38 -0
  805. data/db/migrate/20260811000001_add_delivery_tracking_to_fulfillments.rb +17 -0
  806. data/db/migrate/20260812000001_add_provider_type_to_spree_digital_assets.rb +7 -0
  807. data/db/migrate/20260812000002_add_metadata_to_spree_digital_assets.rb +11 -0
  808. data/db/migrate/20260813000001_create_spree_number_sequences.rb +13 -0
  809. data/db/migrate/20260813120001_add_setup_token_to_spree_stores.rb +11 -0
  810. data/db/migrate/20260813130001_add_capture_method_to_payment_methods.rb +17 -0
  811. data/db/migrate/20260813130001_add_unique_indexes_to_spree_data_feeds.rb +10 -0
  812. data/db/migrate/20260814000001_add_customs_fields_to_spree_variants.rb +7 -0
  813. data/db/migrate/20260814000001_rename_stock_items_to_stock_levels.rb +72 -0
  814. data/db/migrate/20260814000002_add_typed_stock_movements.rb +25 -0
  815. data/db/migrate/20260815000001_add_audience_to_spree_refresh_tokens.rb +14 -0
  816. data/db/migrate/20260815000002_add_resource_to_spree_roles.rb +190 -0
  817. data/db/migrate/20260816000001_create_spree_sellers.rb +59 -0
  818. data/db/migrate/20260816000002_add_seller_to_spree_products.rb +10 -0
  819. data/db/migrate/20260816210001_create_spree_commission_rates.rb +229 -0
  820. data/db/migrate/20260816210002_create_spree_commission_lines.rb +72 -0
  821. data/db/migrate/20260817000001_add_seller_to_spree_line_items.rb +15 -0
  822. data/db/migrate/20260817000002_add_seller_and_delivery_profile_to_spree_variants.rb +17 -0
  823. data/db/migrate/20260818000001_create_spree_external_references.rb +33 -0
  824. data/db/migrate/20260818000001_create_spree_seller_requirements.rb +60 -0
  825. data/db/migrate/20260818000001_rename_spree_payments_state_to_status.rb +5 -0
  826. data/db/migrate/20260818000002_add_price_source_to_spree_line_items.rb +9 -0
  827. data/db/migrate/20260818090001_rename_assets_to_media.rb +10 -0
  828. data/db/migrate/20260819000001_create_spree_seller_requirement_custom_fields.rb +15 -0
  829. data/db/migrate/20260819000001_replace_payment_method_display_on_with_storefront_visible.rb +25 -0
  830. data/db/migrate/20260819000002_rename_spree_gift_cards_state_to_status.rb +5 -0
  831. data/db/migrate/20260820000001_add_seller_business_identity_and_stock_locations.rb +17 -0
  832. data/db/migrate/20260820000001_create_spree_order_groups.rb +33 -0
  833. data/db/migrate/20260820000002_add_order_group_to_spree_orders_and_payments.rb +14 -0
  834. data/db/migrate/20260820000003_create_spree_payment_splits.rb +21 -0
  835. data/db/migrate/20260820000004_add_order_to_spree_refunds.rb +32 -0
  836. data/db/migrate/20260821000001_add_claimed_amount_to_spree_payment_splits.rb +14 -0
  837. data/db/migrate/20260822000001_create_spree_seller_transfers.rb +94 -0
  838. data/db/migrate/20260822000002_create_spree_seller_payouts.rb +48 -0
  839. data/db/migrate/20260822000003_add_payout_account_to_spree_sellers.rb +11 -0
  840. data/db/migrate/20260824000001_add_store_to_spree_media.rb +16 -0
  841. data/db/migrate/20260825000001_create_spree_catalogs.rb +40 -0
  842. data/db/migrate/20260826000001_add_owner_to_spree_addresses.rb +30 -0
  843. data/db/migrate/20260826000002_create_spree_product_submissions.rb +28 -0
  844. data/db/migrate/20260827000001_add_seller_to_spree_exports.rb +5 -0
  845. data/db/migrate/20260828100001_unify_import_and_export_tenancy.rb +79 -0
  846. data/db/migrate/20260830000001_add_catalog_to_spree_price_lists.rb +47 -0
  847. data/db/migrate/20260830000002_add_po_number_to_purchases.rb +16 -0
  848. data/db/migrate/20260830000002_add_price_adjustment_to_spree_price_lists.rb +14 -0
  849. data/db/migrate/20260831000001_add_description_to_spree_catalogs.rb +7 -0
  850. data/db/migrate/20260831000002_add_quantity_rules_to_spree_variants.rb +18 -0
  851. data/db/migrate/20260831000003_create_spree_catalog_terms.rb +35 -0
  852. data/db/migrate/20260831100001_create_spree_package_types.rb +38 -0
  853. data/db/migrate/20260831100002_add_carton_details_to_spree_variants.rb +10 -0
  854. data/db/migrate/20260831100003_add_unpriced_to_spree_delivery_rates.rb +8 -0
  855. data/db/migrate/20260901000001_add_seller_to_spree_delivery_methods.rb +11 -0
  856. data/db/migrate/20260902000001_add_store_and_filter_key_to_custom_field_definitions.rb +143 -0
  857. data/db/migrate/20260902000002_add_eu_legal_compliance.rb +68 -0
  858. data/db/migrate/20260902000002_replace_order_cancellation_tables_with_cancel_columns.rb +88 -0
  859. data/db/migrate/20260902100001_rename_wished_items_to_wishlist_items.rb +8 -0
  860. data/db/migrate/20260902100002_rename_promo_total_to_discount_total.rb +9 -0
  861. data/db/migrate/20260902100003_rename_address_name_and_postal_code_columns.rb +24 -0
  862. data/db/migrate/20260902100004_rename_option_presentation_to_label.rb +13 -0
  863. data/db/migrate/20260903000001_create_spree_shipping_labels_and_deliveries.rb +73 -0
  864. data/db/migrate/20260903120000_create_spree_saved_reports.rb +57 -0
  865. data/db/migrate/20260904000001_add_returns_enabled_to_stock_locations.rb +14 -0
  866. data/db/migrate/20260906000001_add_commission_total_to_orders.rb +22 -0
  867. data/db/migrate/20260907000001_add_inventory_operations.rb +113 -0
  868. data/db/migrate/20260907000001_add_min_quantity_to_spree_prices.rb +28 -0
  869. data/db/migrate/20260907000002_create_spree_price_adjustment_tiers.rb +19 -0
  870. data/db/migrate/20260908000001_add_seller_to_spree_package_types.rb +78 -0
  871. data/db/migrate/20260910000001_add_stock_receipts.rb +44 -0
  872. data/db/migrate/20260910000002_add_counters_to_spree_stock_levels.rb +6 -0
  873. data/db/migrate/20260910120000_index_reporting_time_columns.rb +12 -0
  874. data/db/migrate/20260912120000_index_reporting_lifetime_and_promotion_columns.rb +19 -0
  875. data/db/migrate/20260914000001_add_settlement_to_spree_seller_transfers.rb +18 -0
  876. data/db/migrate/20260914230000_add_store_to_spree_option_types.rb +46 -0
  877. data/db/sample_data/collections.rb +58 -0
  878. data/db/sample_data/custom_field_definitions.rb +9 -0
  879. data/db/sample_data/digital_products.rb +26 -0
  880. data/db/sample_data/fulfillment.rb +88 -0
  881. data/db/sample_data/options.rb +25 -1
  882. data/db/sample_data/orders.rb +53 -30
  883. data/db/sample_data/payment_methods.rb +2 -2
  884. data/db/sample_data/price_list_prices.csv +25 -0
  885. data/db/sample_data/product_type_categories.rb +27 -0
  886. data/db/sample_data/product_types.rb +83 -0
  887. data/db/sample_data/products.csv +39 -38
  888. data/db/sample_data/wholesale.rb +42 -3
  889. data/lib/generators/spree/api_resource/api_resource_generator.rb +1 -1
  890. data/lib/generators/spree/authentication/dummy/templates/create_spree_admin_users.rb.tt +1 -0
  891. data/lib/generators/spree/controller_decorator/controller_decorator_generator.rb +4 -4
  892. data/lib/generators/spree/dummy/dummy_generator.rb +5 -12
  893. data/lib/generators/spree/dummy/templates/rails/test.rb +5 -0
  894. data/lib/generators/spree/model/model_generator.rb +6 -6
  895. data/lib/generators/spree/model/templates/model.rb.tt +7 -3
  896. data/lib/spree/category_permalink_deduplicator.rb +328 -0
  897. data/lib/spree/core/configuration.rb +96 -47
  898. data/lib/spree/core/controller_helpers/store.rb +8 -9
  899. data/lib/spree/core/dependencies.rb +324 -71
  900. data/lib/spree/core/dependencies_helper.rb +4 -0
  901. data/lib/spree/core/engine.rb +333 -75
  902. data/lib/spree/core/number_generator.rb +37 -33
  903. data/lib/spree/core/permission_configuration.rb +183 -91
  904. data/lib/spree/core/permissions/default_catalog.rb +236 -0
  905. data/lib/spree/core/permissions/entry.rb +15 -0
  906. data/lib/spree/core/permissions/scope.rb +76 -0
  907. data/lib/spree/core/preferences/masking.rb +24 -2
  908. data/lib/spree/core/preferences/preferable.rb +59 -3
  909. data/lib/spree/core/preferences/preferable_class_methods.rb +41 -2
  910. data/lib/spree/core/preferences/runtime_configuration.rb +68 -9
  911. data/lib/spree/core/previews/admin_user_preview.rb +0 -8
  912. data/lib/spree/core/previews/invitation_preview.rb +1 -1
  913. data/lib/spree/core/previews/preview_data.rb +2 -2
  914. data/lib/spree/core/previews/seller_user_preview.rb +14 -0
  915. data/lib/spree/core/pricing/context.rb +28 -8
  916. data/lib/spree/core/pricing/price_resolution.rb +150 -0
  917. data/lib/spree/core/pricing/resolver.rb +17 -107
  918. data/lib/spree/core/ransack_configuration.rb +3 -3
  919. data/lib/spree/core/routes.rb +4 -6
  920. data/lib/spree/core/version.rb +1 -1
  921. data/lib/spree/core.rb +422 -62
  922. data/lib/spree/events/adapters/base.rb +42 -15
  923. data/lib/spree/hooks.rb +146 -0
  924. data/lib/spree/iso_data.rb +188 -0
  925. data/lib/spree/measurement.rb +113 -0
  926. data/lib/spree/money.rb +70 -0
  927. data/lib/spree/number_generators/registry.rb +80 -0
  928. data/lib/spree/reporting/adapters/base.rb +71 -0
  929. data/lib/spree/reporting/adapters/live.rb +677 -0
  930. data/lib/spree/reporting/counter_result.rb +19 -0
  931. data/lib/spree/reporting/counters.rb +33 -0
  932. data/lib/spree/reporting/default_vocabulary.rb +705 -0
  933. data/lib/spree/reporting/hydration.rb +64 -0
  934. data/lib/spree/reporting/query.rb +487 -0
  935. data/lib/spree/reporting/registry.rb +294 -0
  936. data/lib/spree/reporting/result.rb +10 -0
  937. data/lib/spree/reporting/schema.rb +124 -0
  938. data/lib/spree/reporting.rb +49 -0
  939. data/lib/spree/service_module.rb +6 -0
  940. data/lib/spree/store_scope_guard.rb +180 -0
  941. data/lib/spree/testing_support/action_text.rb +33 -0
  942. data/lib/spree/testing_support/common_rake.rb +4 -66
  943. data/lib/spree/testing_support/country_pool.rb +50 -0
  944. data/lib/spree/testing_support/extension_rake.rb +2 -6
  945. data/lib/spree/testing_support/factories/address_factory.rb +45 -15
  946. data/lib/spree/testing_support/factories/api_key_factory.rb +1 -1
  947. data/lib/spree/testing_support/factories/calculator_factory.rb +0 -3
  948. data/lib/spree/testing_support/factories/cart_factory.rb +60 -0
  949. data/lib/spree/testing_support/factories/catalog_factory.rb +37 -0
  950. data/lib/spree/testing_support/factories/category_factory.rb +21 -0
  951. data/lib/spree/testing_support/factories/claim_factory.rb +33 -0
  952. data/lib/spree/testing_support/factories/classification_factory.rb +3 -2
  953. data/lib/spree/testing_support/factories/collection_factory.rb +25 -0
  954. data/lib/spree/testing_support/factories/collection_rule_factory.rb +47 -0
  955. data/lib/spree/testing_support/factories/commission_rate_factory.rb +75 -0
  956. data/lib/spree/testing_support/factories/company_factory.rb +31 -0
  957. data/lib/spree/testing_support/factories/consent_record_factory.rb +10 -0
  958. data/lib/spree/testing_support/factories/country_factory.rb +28 -9
  959. data/lib/spree/testing_support/factories/custom_field_definition_factory.rb +79 -0
  960. data/lib/spree/testing_support/factories/custom_field_factory.rb +64 -0
  961. data/lib/spree/testing_support/factories/customer_group_user_factory.rb +1 -1
  962. data/lib/spree/testing_support/factories/data_request_factory.rb +17 -0
  963. data/lib/spree/testing_support/factories/delivery_factory.rb +13 -0
  964. data/lib/spree/testing_support/factories/delivery_method_factory.rb +47 -0
  965. data/lib/spree/testing_support/factories/delivery_origin_group_factory.rb +5 -0
  966. data/lib/spree/testing_support/factories/delivery_profile_factory.rb +9 -0
  967. data/lib/spree/testing_support/factories/delivery_rate_factory.rb +7 -0
  968. data/lib/spree/testing_support/factories/delivery_zone_factory.rb +34 -0
  969. data/lib/spree/testing_support/factories/digital_asset_factory.rb +13 -0
  970. data/lib/spree/testing_support/factories/digital_link_factory.rb +1 -1
  971. data/lib/spree/testing_support/factories/discount_factory.rb +9 -0
  972. data/lib/spree/testing_support/factories/exchange_factory.rb +50 -0
  973. data/lib/spree/testing_support/factories/external_reference_factory.rb +8 -0
  974. data/lib/spree/testing_support/factories/fee_factory.rb +8 -0
  975. data/lib/spree/testing_support/factories/fulfillment_factory.rb +32 -0
  976. data/lib/spree/testing_support/factories/fulfillment_item_factory.rb +17 -0
  977. data/lib/spree/testing_support/factories/gateway_customer_factory.rb +1 -1
  978. data/lib/spree/testing_support/factories/gift_card_factory.rb +2 -2
  979. data/lib/spree/testing_support/factories/import_factory.rb +33 -1
  980. data/lib/spree/testing_support/factories/line_item_factory.rb +10 -5
  981. data/lib/spree/testing_support/factories/market_factory.rb +5 -12
  982. data/lib/spree/testing_support/factories/media_factory.rb +36 -0
  983. data/lib/spree/testing_support/factories/newsletter_subscriber_factory.rb +1 -1
  984. data/lib/spree/testing_support/factories/number_sequence_factory.rb +7 -0
  985. data/lib/spree/testing_support/factories/options_factory.rb +5 -5
  986. data/lib/spree/testing_support/factories/order_factory.rb +39 -23
  987. data/lib/spree/testing_support/factories/order_group_factory.rb +29 -0
  988. data/lib/spree/testing_support/factories/package_type_factory.rb +36 -0
  989. data/lib/spree/testing_support/factories/payment_factory.rb +7 -7
  990. data/lib/spree/testing_support/factories/payment_method_factory.rb +5 -5
  991. data/lib/spree/testing_support/factories/payment_session_factory.rb +10 -6
  992. data/lib/spree/testing_support/factories/payment_setup_session_factory.rb +2 -2
  993. data/lib/spree/testing_support/factories/payment_split_factory.rb +10 -0
  994. data/lib/spree/testing_support/factories/price_adjustment_tier_factory.rb +7 -0
  995. data/lib/spree/testing_support/factories/price_factory.rb +6 -0
  996. data/lib/spree/testing_support/factories/price_rule_factory.rb +0 -10
  997. data/lib/spree/testing_support/factories/product_collection_factory.rb +8 -0
  998. data/lib/spree/testing_support/factories/product_factory.rb +35 -7
  999. data/lib/spree/testing_support/factories/product_type_custom_field_definition_factory.rb +10 -0
  1000. data/lib/spree/testing_support/factories/product_type_factory.rb +12 -0
  1001. data/lib/spree/testing_support/factories/promotion_factory.rb +4 -0
  1002. data/lib/spree/testing_support/factories/promotion_rule_factory.rb +1 -1
  1003. data/lib/spree/testing_support/factories/purchase_order_factory.rb +49 -0
  1004. data/lib/spree/testing_support/factories/refresh_token_factory.rb +2 -0
  1005. data/lib/spree/testing_support/factories/refund_factory.rb +1 -2
  1006. data/lib/spree/testing_support/factories/return_factory.rb +52 -0
  1007. data/lib/spree/testing_support/factories/return_reason_factory.rb +19 -0
  1008. data/lib/spree/testing_support/factories/role_factory.rb +1 -0
  1009. data/lib/spree/testing_support/factories/saved_report_factory.rb +7 -0
  1010. data/lib/spree/testing_support/factories/seller_factory.rb +34 -0
  1011. data/lib/spree/testing_support/factories/seller_payout_factory.rb +14 -0
  1012. data/lib/spree/testing_support/factories/seller_requirement_factory.rb +61 -0
  1013. data/lib/spree/testing_support/factories/seller_requirement_submission_factory.rb +32 -0
  1014. data/lib/spree/testing_support/factories/seller_transfer_factory.rb +21 -0
  1015. data/lib/spree/testing_support/factories/shipping_label_factory.rb +44 -0
  1016. data/lib/spree/testing_support/factories/state_factory.rb +18 -5
  1017. data/lib/spree/testing_support/factories/stock_level_factory.rb +24 -0
  1018. data/lib/spree/testing_support/factories/stock_location_factory.rb +12 -6
  1019. data/lib/spree/testing_support/factories/stock_movement_factory.rb +20 -3
  1020. data/lib/spree/testing_support/factories/stock_receipt_factory.rb +37 -0
  1021. data/lib/spree/testing_support/factories/stock_reservation_factory.rb +11 -8
  1022. data/lib/spree/testing_support/factories/stock_transfer_factory.rb +53 -6
  1023. data/lib/spree/testing_support/factories/store_credit_factory.rb +1 -3
  1024. data/lib/spree/testing_support/factories/supplier_factory.rb +17 -0
  1025. data/lib/spree/testing_support/factories/tax_exemption_certificate_factory.rb +18 -0
  1026. data/lib/spree/testing_support/factories/tax_identifier_factory.rb +33 -0
  1027. data/lib/spree/testing_support/factories/tax_line_factory.rb +19 -0
  1028. data/lib/spree/testing_support/factories/tax_rate_factory.rb +5 -2
  1029. data/lib/spree/testing_support/factories/taxon_factory.rb +6 -23
  1030. data/lib/spree/testing_support/factories/taxonomy_factory.rb +8 -0
  1031. data/lib/spree/testing_support/factories/user_factory.rb +8 -12
  1032. data/lib/spree/testing_support/factories/variant_factory.rb +1 -1
  1033. data/lib/spree/testing_support/factories/wishlist_factory.rb +1 -1
  1034. data/lib/spree/testing_support/factories/wishlist_item_factory.rb +10 -0
  1035. data/lib/spree/testing_support/factories/zone_factory.rb +2 -25
  1036. data/lib/spree/testing_support/factories/zone_member_factory.rb +2 -1
  1037. data/lib/spree/testing_support/factories.rb +1 -6
  1038. data/lib/spree/testing_support/imports.rb +16 -0
  1039. data/lib/spree/testing_support/label_provider.rb +49 -0
  1040. data/lib/spree/testing_support/lifecycle_events.rb +6 -1
  1041. data/lib/spree/testing_support/metadata.rb +38 -36
  1042. data/lib/spree/testing_support/order_walkthrough.rb +46 -36
  1043. data/lib/spree/testing_support/preferences.rb +39 -0
  1044. data/lib/spree/testing_support/purchase_order.rb +111 -0
  1045. data/lib/spree/testing_support/store.rb +6 -2
  1046. data/lib/spree/testing_support/tax_identifier_validators.rb +68 -0
  1047. data/lib/spree/translations.rb +139 -5
  1048. data/lib/spree/upgrades/5_4_to_5_5/manifest.yml +1 -1
  1049. data/lib/spree/upgrades/5_5_to_5_6/manifest.yml +17 -9
  1050. data/lib/spree/upgrades/5_6_to_6_0/manifest.yml +683 -0
  1051. data/lib/spree/validators.rb +74 -0
  1052. data/lib/spree/workflow.rb +335 -0
  1053. data/lib/tasks/backfill_custom_field_definition_stores.rake +82 -0
  1054. data/lib/tasks/backfill_import_export_tenancy.rake +93 -0
  1055. data/lib/tasks/backfill_library_media_placements.rake +29 -0
  1056. data/lib/tasks/backfill_media_store_ids.rake +70 -0
  1057. data/lib/tasks/backfill_reason_store_ids.rake +28 -0
  1058. data/lib/tasks/capture_methods_migration.rake +30 -0
  1059. data/lib/tasks/carts_migration.rake +113 -0
  1060. data/lib/tasks/categories_and_collections.rake +188 -0
  1061. data/lib/tasks/cli.rake +22 -3
  1062. data/lib/tasks/consolidate_metadata.rake +73 -0
  1063. data/lib/tasks/core.rake +1 -11
  1064. data/lib/tasks/deliveries_migration.rake +52 -0
  1065. data/lib/tasks/delivery_method_rules_migration.rake +51 -0
  1066. data/lib/tasks/delivery_migration.rake +213 -0
  1067. data/lib/tasks/delivery_profiles_migration.rake +109 -0
  1068. data/lib/tasks/fold_store_credit_categories.rake +40 -0
  1069. data/lib/tasks/fulfillment_statuses_migration.rake +59 -0
  1070. data/lib/tasks/inventory_operations_migration.rake +223 -0
  1071. data/lib/tasks/markets.rake +7 -2
  1072. data/lib/tasks/media.rake +2 -2
  1073. data/lib/tasks/media_class_rename.rake +56 -0
  1074. data/lib/tasks/migrate_country_state_codes.rake +228 -0
  1075. data/lib/tasks/migrate_promotion_option_value_rules.rake +124 -0
  1076. data/lib/tasks/migrate_returns.rake +322 -0
  1077. data/lib/tasks/migrate_rich_text_to_columns.rake +128 -0
  1078. data/lib/tasks/migrate_users_to_customers.rake +161 -0
  1079. data/lib/tasks/order_coupon_code_backfill.rake +32 -0
  1080. data/lib/tasks/order_market_backfill.rake +27 -0
  1081. data/lib/tasks/package_types.rake +62 -0
  1082. data/lib/tasks/price_history.rake +49 -6
  1083. data/lib/tasks/product_tag_tenants.rake +1 -3
  1084. data/lib/tasks/products.rake +21 -2
  1085. data/lib/tasks/remove_master_variant.rake +58 -0
  1086. data/lib/tasks/rich_text.rake +44 -0
  1087. data/lib/tasks/seller_sample_data.rake +142 -0
  1088. data/lib/tasks/setup.rake +18 -0
  1089. data/lib/tasks/single_store_associations.rake +11 -0
  1090. data/lib/tasks/stock.rake +15 -0
  1091. data/lib/tasks/store_binding_migration.rake +33 -0
  1092. data/lib/tasks/store_settings.rake +104 -0
  1093. data/lib/tasks/tax_zones_migration.rake +147 -0
  1094. data/lib/tasks/taxons.rake +9 -10
  1095. data/lib/tasks/typed_adjustments_migration.rake +189 -0
  1096. data/lib/tasks/typed_stock_movements_migration.rake +250 -0
  1097. data/lib/tasks/upgrade.rake +13 -8
  1098. data/spec/fixtures/files/eu_vat_numbers.txt +56 -0
  1099. data/spec/fixtures/files/price_list_prices_import.csv +4 -0
  1100. data/spec/fixtures/files/products_import.csv +1 -1
  1101. data/spec/fixtures/tiny-video.mp4 +0 -0
  1102. metadata +792 -538
  1103. data/app/assets/config/spree_core_manifest.js +0 -4
  1104. data/app/assets/images/google_on_white_hdpi.png +0 -0
  1105. data/app/assets/images/logo.png +0 -0
  1106. data/app/assets/images/payment_icons/ach.svg +0 -1
  1107. data/app/assets/images/payment_icons/achdirectdebit.svg +0 -1
  1108. data/app/assets/images/payment_icons/ada.svg +0 -1
  1109. data/app/assets/images/payment_icons/adyen.svg +0 -1
  1110. data/app/assets/images/payment_icons/affinbank.svg +0 -1
  1111. data/app/assets/images/payment_icons/affirm.svg +0 -1
  1112. data/app/assets/images/payment_icons/afterpay.svg +0 -1
  1113. data/app/assets/images/payment_icons/airtel_money.svg +0 -1
  1114. data/app/assets/images/payment_icons/airteltigo_mobile_money.svg +0 -1
  1115. data/app/assets/images/payment_icons/alandsbanken.svg +0 -1
  1116. data/app/assets/images/payment_icons/alipay.svg +0 -1
  1117. data/app/assets/images/payment_icons/alipay_hk.svg +0 -1
  1118. data/app/assets/images/payment_icons/alliancebank.svg +0 -1
  1119. data/app/assets/images/payment_icons/alma.svg +0 -1
  1120. data/app/assets/images/payment_icons/amazon.svg +0 -1
  1121. data/app/assets/images/payment_icons/ambank.svg +0 -1
  1122. data/app/assets/images/payment_icons/american_express.svg +0 -1
  1123. data/app/assets/images/payment_icons/apecoin.svg +0 -1
  1124. data/app/assets/images/payment_icons/apple_pay.svg +0 -1
  1125. data/app/assets/images/payment_icons/arbitrum.svg +0 -1
  1126. data/app/assets/images/payment_icons/atome.svg +0 -1
  1127. data/app/assets/images/payment_icons/authorizenet.svg +0 -1
  1128. data/app/assets/images/payment_icons/avalanche.svg +0 -1
  1129. data/app/assets/images/payment_icons/bacs.svg +0 -1
  1130. data/app/assets/images/payment_icons/bancontact.svg +0 -1
  1131. data/app/assets/images/payment_icons/bangkokbank.svg +0 -1
  1132. data/app/assets/images/payment_icons/bankislam.svg +0 -1
  1133. data/app/assets/images/payment_icons/bankmuamalat.svg +0 -1
  1134. data/app/assets/images/payment_icons/bankofamerica.svg +0 -1
  1135. data/app/assets/images/payment_icons/bankrakyat.svg +0 -1
  1136. data/app/assets/images/payment_icons/banktransfer.svg +0 -1
  1137. data/app/assets/images/payment_icons/base.svg +0 -1
  1138. data/app/assets/images/payment_icons/becs.svg +0 -1
  1139. data/app/assets/images/payment_icons/benefit.svg +0 -1
  1140. data/app/assets/images/payment_icons/billie.svg +0 -1
  1141. data/app/assets/images/payment_icons/bitcoin.svg +0 -1
  1142. data/app/assets/images/payment_icons/bitcoin_cash.svg +0 -1
  1143. data/app/assets/images/payment_icons/bizum.svg +0 -1
  1144. data/app/assets/images/payment_icons/blik.svg +0 -1
  1145. data/app/assets/images/payment_icons/bnbchain.svg +0 -1
  1146. data/app/assets/images/payment_icons/bogus.svg +0 -1
  1147. data/app/assets/images/payment_icons/bogus_app_coin.svg +0 -1
  1148. data/app/assets/images/payment_icons/boleto.svg +0 -1
  1149. data/app/assets/images/payment_icons/boost.svg +0 -1
  1150. data/app/assets/images/payment_icons/braintree.svg +0 -1
  1151. data/app/assets/images/payment_icons/buckaroopaybybank.svg +0 -1
  1152. data/app/assets/images/payment_icons/busd.svg +0 -1
  1153. data/app/assets/images/payment_icons/cartes_bancaires.svg +0 -1
  1154. data/app/assets/images/payment_icons/cash.svg +0 -1
  1155. data/app/assets/images/payment_icons/cashappafterpay.svg +0 -1
  1156. data/app/assets/images/payment_icons/cashapppay.svg +0 -1
  1157. data/app/assets/images/payment_icons/checkout_finance.svg +0 -1
  1158. data/app/assets/images/payment_icons/chinabank.svg +0 -1
  1159. data/app/assets/images/payment_icons/clearpay.svg +0 -1
  1160. data/app/assets/images/payment_icons/collector_bank.svg +0 -1
  1161. data/app/assets/images/payment_icons/dai.svg +0 -1
  1162. data/app/assets/images/payment_icons/dana.svg +0 -1
  1163. data/app/assets/images/payment_icons/dankort.svg +0 -1
  1164. data/app/assets/images/payment_icons/danske_bank.svg +0 -1
  1165. data/app/assets/images/payment_icons/deutschebank.svg +0 -1
  1166. data/app/assets/images/payment_icons/diners_club.svg +0 -1
  1167. data/app/assets/images/payment_icons/directbanktransferlatinamerica.svg +0 -1
  1168. data/app/assets/images/payment_icons/discover.svg +0 -1
  1169. data/app/assets/images/payment_icons/dogecoin.svg +0 -1
  1170. data/app/assets/images/payment_icons/duitnow.svg +0 -1
  1171. data/app/assets/images/payment_icons/eft_secure.svg +0 -1
  1172. data/app/assets/images/payment_icons/eftpos_au.svg +0 -1
  1173. data/app/assets/images/payment_icons/eftposau.svg +0 -1
  1174. data/app/assets/images/payment_icons/elo.svg +0 -1
  1175. data/app/assets/images/payment_icons/eos.svg +0 -1
  1176. data/app/assets/images/payment_icons/eps.svg +0 -1
  1177. data/app/assets/images/payment_icons/ethereum.svg +0 -1
  1178. data/app/assets/images/payment_icons/eurobonuscheckout.svg +0 -1
  1179. data/app/assets/images/payment_icons/ezcash.svg +0 -1
  1180. data/app/assets/images/payment_icons/fantom.svg +0 -1
  1181. data/app/assets/images/payment_icons/fpx.svg +0 -1
  1182. data/app/assets/images/payment_icons/gcash.svg +0 -1
  1183. data/app/assets/images/payment_icons/generic.svg +0 -1
  1184. data/app/assets/images/payment_icons/genericbank.svg +0 -1
  1185. data/app/assets/images/payment_icons/gift-card.svg +0 -1
  1186. data/app/assets/images/payment_icons/giropay.svg +0 -1
  1187. data/app/assets/images/payment_icons/glbepaypal.svg +0 -1
  1188. data/app/assets/images/payment_icons/gmobanktransfer.svg +0 -1
  1189. data/app/assets/images/payment_icons/gnosis.svg +0 -1
  1190. data/app/assets/images/payment_icons/google_pay.svg +0 -1
  1191. data/app/assets/images/payment_icons/google_wallet.svg +0 -1
  1192. data/app/assets/images/payment_icons/gopay.svg +0 -1
  1193. data/app/assets/images/payment_icons/grabpay.svg +0 -1
  1194. data/app/assets/images/payment_icons/gusd.svg +0 -1
  1195. data/app/assets/images/payment_icons/handelsbanken.svg +0 -1
  1196. data/app/assets/images/payment_icons/hongleongbank.svg +0 -1
  1197. data/app/assets/images/payment_icons/hypercard.svg +0 -1
  1198. data/app/assets/images/payment_icons/hypercash.svg +0 -1
  1199. data/app/assets/images/payment_icons/ideal.svg +0 -1
  1200. data/app/assets/images/payment_icons/in3viaideal.svg +0 -1
  1201. data/app/assets/images/payment_icons/inbank.svg +0 -1
  1202. data/app/assets/images/payment_icons/jcb.svg +0 -1
  1203. data/app/assets/images/payment_icons/kakao_pay.svg +0 -1
  1204. data/app/assets/images/payment_icons/kasikornbank.svg +0 -1
  1205. data/app/assets/images/payment_icons/klarna-pay-later.svg +0 -1
  1206. data/app/assets/images/payment_icons/klarna-pay-now.svg +0 -1
  1207. data/app/assets/images/payment_icons/klarna-slice-it.svg +0 -1
  1208. data/app/assets/images/payment_icons/klarna.svg +0 -1
  1209. data/app/assets/images/payment_icons/knet.svg +0 -1
  1210. data/app/assets/images/payment_icons/krungthaibank.svg +0 -1
  1211. data/app/assets/images/payment_icons/landbank.svg +0 -1
  1212. data/app/assets/images/payment_icons/laybuybyklarna.svg +0 -1
  1213. data/app/assets/images/payment_icons/litecoin.svg +0 -1
  1214. data/app/assets/images/payment_icons/lunchcheck.svg +0 -1
  1215. data/app/assets/images/payment_icons/mach.svg +0 -1
  1216. data/app/assets/images/payment_icons/mada.svg +0 -1
  1217. data/app/assets/images/payment_icons/maestro.svg +0 -1
  1218. data/app/assets/images/payment_icons/master.svg +0 -1
  1219. data/app/assets/images/payment_icons/mayabank.svg +0 -1
  1220. data/app/assets/images/payment_icons/maybank.svg +0 -1
  1221. data/app/assets/images/payment_icons/maybankm2u.svg +0 -1
  1222. data/app/assets/images/payment_icons/maybankqrpay.svg +0 -1
  1223. data/app/assets/images/payment_icons/mbway.svg +0 -1
  1224. data/app/assets/images/payment_icons/mcash.svg +0 -1
  1225. data/app/assets/images/payment_icons/medicinosbankas.svg +0 -1
  1226. data/app/assets/images/payment_icons/mercadopago.svg +0 -1
  1227. data/app/assets/images/payment_icons/metrobank.svg +0 -1
  1228. data/app/assets/images/payment_icons/mobilepay.svg +0 -1
  1229. data/app/assets/images/payment_icons/momopay.svg +0 -1
  1230. data/app/assets/images/payment_icons/monero.svg +0 -1
  1231. data/app/assets/images/payment_icons/mtn_mobile_money.svg +0 -1
  1232. data/app/assets/images/payment_icons/mybank.svg +0 -1
  1233. data/app/assets/images/payment_icons/naver_pay.svg +0 -1
  1234. data/app/assets/images/payment_icons/nelo.svg +0 -1
  1235. data/app/assets/images/payment_icons/netbanking.svg +0 -1
  1236. data/app/assets/images/payment_icons/novalnetdirectdebitach.svg +0 -1
  1237. data/app/assets/images/payment_icons/nubank.svg +0 -1
  1238. data/app/assets/images/payment_icons/ocbcbank.svg +0 -1
  1239. data/app/assets/images/payment_icons/offlinebanktransferlatinamerica.svg +0 -1
  1240. data/app/assets/images/payment_icons/ola_money.svg +0 -1
  1241. data/app/assets/images/payment_icons/oney.svg +0 -1
  1242. data/app/assets/images/payment_icons/onlinebanking.svg +0 -1
  1243. data/app/assets/images/payment_icons/onlinebanktransfer.svg +0 -1
  1244. data/app/assets/images/payment_icons/orangemobilemoney.svg +0 -1
  1245. data/app/assets/images/payment_icons/otpbank.svg +0 -1
  1246. data/app/assets/images/payment_icons/oxxo.svg +0 -1
  1247. data/app/assets/images/payment_icons/paybybank.svg +0 -1
  1248. data/app/assets/images/payment_icons/paybybankmollie.svg +0 -1
  1249. data/app/assets/images/payment_icons/paybybankus.svg +0 -1
  1250. data/app/assets/images/payment_icons/paycash.svg +0 -1
  1251. data/app/assets/images/payment_icons/payco.svg +0 -1
  1252. data/app/assets/images/payment_icons/payeverpaybybank.svg +0 -1
  1253. data/app/assets/images/payment_icons/payme.svg +0 -1
  1254. data/app/assets/images/payment_icons/paynow.svg +0 -1
  1255. data/app/assets/images/payment_icons/paynowmbank.svg +0 -1
  1256. data/app/assets/images/payment_icons/paypal.svg +0 -1
  1257. data/app/assets/images/payment_icons/paypo.svg +0 -1
  1258. data/app/assets/images/payment_icons/payrexxbanktransfer.svg +0 -1
  1259. data/app/assets/images/payment_icons/payrexxpaybybank.svg +0 -1
  1260. data/app/assets/images/payment_icons/paysafecash.svg +0 -1
  1261. data/app/assets/images/payment_icons/pix.svg +0 -1
  1262. data/app/assets/images/payment_icons/polygon.svg +0 -1
  1263. data/app/assets/images/payment_icons/przelewy24.svg +0 -1
  1264. data/app/assets/images/payment_icons/publicbank.svg +0 -1
  1265. data/app/assets/images/payment_icons/publicbank_pbe.svg +0 -1
  1266. data/app/assets/images/payment_icons/qr_promptpay.svg +0 -1
  1267. data/app/assets/images/payment_icons/rabobank.svg +0 -1
  1268. data/app/assets/images/payment_icons/revolut.svg +0 -1
  1269. data/app/assets/images/payment_icons/rhbbank.svg +0 -1
  1270. data/app/assets/images/payment_icons/riverty.svg +0 -1
  1271. data/app/assets/images/payment_icons/safetypaybanktransfer.svg +0 -1
  1272. data/app/assets/images/payment_icons/samsung_pay.svg +0 -1
  1273. data/app/assets/images/payment_icons/satispay.svg +0 -1
  1274. data/app/assets/images/payment_icons/scalapay.svg +0 -1
  1275. data/app/assets/images/payment_icons/scotiabank.svg +0 -1
  1276. data/app/assets/images/payment_icons/seabankid.svg +0 -1
  1277. data/app/assets/images/payment_icons/seabankph.svg +0 -1
  1278. data/app/assets/images/payment_icons/sepa_bank_transfer.svg +0 -1
  1279. data/app/assets/images/payment_icons/sepadebit.svg +0 -22
  1280. data/app/assets/images/payment_icons/sepadirectdebit.svg +0 -1
  1281. data/app/assets/images/payment_icons/seveneleven.svg +0 -1
  1282. data/app/assets/images/payment_icons/shib.svg +0 -1
  1283. data/app/assets/images/payment_icons/shopcash.svg +0 -1
  1284. data/app/assets/images/payment_icons/siauliubankas.svg +0 -1
  1285. data/app/assets/images/payment_icons/skeps.svg +0 -1
  1286. data/app/assets/images/payment_icons/snap_checkout.svg +0 -1
  1287. data/app/assets/images/payment_icons/sofort.svg +0 -1
  1288. data/app/assets/images/payment_icons/softbank.svg +0 -1
  1289. data/app/assets/images/payment_icons/spei.svg +0 -1
  1290. data/app/assets/images/payment_icons/storecredit.svg +0 -1
  1291. data/app/assets/images/payment_icons/stripe.svg +0 -1
  1292. data/app/assets/images/payment_icons/sveacheckout.svg +0 -1
  1293. data/app/assets/images/payment_icons/swedbank.svg +0 -1
  1294. data/app/assets/images/payment_icons/swish.svg +0 -1
  1295. data/app/assets/images/payment_icons/tbibank.svg +0 -1
  1296. data/app/assets/images/payment_icons/thanachartbank.svg +0 -1
  1297. data/app/assets/images/payment_icons/tnmmoney.svg +0 -1
  1298. data/app/assets/images/payment_icons/touchngo.svg +0 -1
  1299. data/app/assets/images/payment_icons/trustly.svg +0 -1
  1300. data/app/assets/images/payment_icons/twint.svg +0 -1
  1301. data/app/assets/images/payment_icons/uaevisa.svg +0 -1
  1302. data/app/assets/images/payment_icons/unionpay.svg +0 -1
  1303. data/app/assets/images/payment_icons/unzerbanktransfer.svg +0 -1
  1304. data/app/assets/images/payment_icons/upi.svg +0 -1
  1305. data/app/assets/images/payment_icons/usbank.svg +0 -1
  1306. data/app/assets/images/payment_icons/usdc.svg +0 -1
  1307. data/app/assets/images/payment_icons/usdt.svg +0 -1
  1308. data/app/assets/images/payment_icons/venmo.svg +0 -1
  1309. data/app/assets/images/payment_icons/vipps.svg +0 -1
  1310. data/app/assets/images/payment_icons/visa.svg +0 -1
  1311. data/app/assets/images/payment_icons/volksbank.svg +0 -1
  1312. data/app/assets/images/payment_icons/waavepaybybank.svg +0 -1
  1313. data/app/assets/images/payment_icons/walley.svg +0 -1
  1314. data/app/assets/images/payment_icons/wbtc.svg +0 -1
  1315. data/app/assets/images/payment_icons/wechatpay.svg +0 -1
  1316. data/app/assets/images/payment_icons/whishcheckout.svg +0 -1
  1317. data/app/assets/images/payment_icons/wingbank.svg +0 -1
  1318. data/app/assets/images/payment_icons/xrp.svg +0 -1
  1319. data/app/assets/images/payment_icons/zip.svg +0 -1
  1320. data/app/controllers/spree/base_controller.rb +0 -11
  1321. data/app/finders/concerns/spree/product_filterable.rb +0 -9
  1322. data/app/finders/spree/addresses/find.rb +0 -27
  1323. data/app/finders/spree/base_finder.rb +0 -14
  1324. data/app/finders/spree/countries/find.rb +0 -31
  1325. data/app/finders/spree/credit_cards/find.rb +0 -12
  1326. data/app/finders/spree/option_values/find_available.rb +0 -28
  1327. data/app/finders/spree/orders/find_complete.rb +0 -114
  1328. data/app/finders/spree/orders/find_current.rb +0 -24
  1329. data/app/finders/spree/orders/finder_helper.rb +0 -17
  1330. data/app/finders/spree/products/find.rb +0 -328
  1331. data/app/finders/spree/taxons/find.rb +0 -99
  1332. data/app/finders/spree/variants/find.rb +0 -30
  1333. data/app/finders/spree/variants/option_types_finder.rb +0 -21
  1334. data/app/helpers/spree/addresses_helper.rb +0 -97
  1335. data/app/helpers/spree/base_helper.rb +0 -132
  1336. data/app/helpers/spree/currency_helper.rb +0 -46
  1337. data/app/helpers/spree/integrations_helper.rb +0 -15
  1338. data/app/helpers/spree/locale_helper.rb +0 -44
  1339. data/app/helpers/spree/localized_names_helper.rb +0 -25
  1340. data/app/helpers/spree/products_helper.rb +0 -147
  1341. data/app/helpers/spree/shipment_helper.rb +0 -12
  1342. data/app/javascript/spree/core/controllers/address_autocomplete_controller.js +0 -230
  1343. data/app/javascript/spree/core/controllers/address_form_controller.js +0 -98
  1344. data/app/javascript/spree/core/controllers/disable_submit_button_controller.js +0 -19
  1345. data/app/javascript/spree/core/controllers/enable_button_controller.js +0 -29
  1346. data/app/javascript/spree/core/helpers/address_autocomplete/google_places_suggestions_provider.js +0 -161
  1347. data/app/javascript/spree/core/helpers/debounce.js +0 -9
  1348. data/app/javascript/spree/core/helpers/scroll_lock.js +0 -25
  1349. data/app/jobs/spree/media/migrate_product_assets_job.rb +0 -83
  1350. data/app/jobs/spree/reports/generate_job.rb +0 -23
  1351. data/app/mailers/spree/report_mailer.rb +0 -20
  1352. data/app/models/concerns/spree/adjustment_source.rb +0 -58
  1353. data/app/models/concerns/spree/default_price.rb +0 -138
  1354. data/app/models/concerns/spree/display_on.rb +0 -50
  1355. data/app/models/concerns/spree/image_methods.rb +0 -40
  1356. data/app/models/concerns/spree/legacy_multi_store_support.rb +0 -48
  1357. data/app/models/concerns/spree/metafields.rb +0 -256
  1358. data/app/models/concerns/spree/number_as_param.rb +0 -13
  1359. data/app/models/concerns/spree/store_scoped_resource.rb +0 -37
  1360. data/app/models/concerns/spree/unique_name.rb +0 -12
  1361. data/app/models/spree/adjustable/adjuster/base.rb +0 -25
  1362. data/app/models/spree/adjustable/adjuster/promotion.rb +0 -41
  1363. data/app/models/spree/adjustable/adjuster/tax.rb +0 -26
  1364. data/app/models/spree/adjustable/adjustments_updater.rb +0 -74
  1365. data/app/models/spree/adjustable/promotion_accumulator.rb +0 -78
  1366. data/app/models/spree/adjustment.rb +0 -130
  1367. data/app/models/spree/asset/support/active_storage.rb +0 -26
  1368. data/app/models/spree/calculator/default_tax.rb +0 -87
  1369. data/app/models/spree/calculator/returns/default_refund_amount.rb +0 -40
  1370. data/app/models/spree/customer_return.rb +0 -94
  1371. data/app/models/spree/image/configuration/active_storage.rb +0 -11
  1372. data/app/models/spree/image.rb +0 -6
  1373. data/app/models/spree/legacy_admin_user.rb +0 -31
  1374. data/app/models/spree/legacy_user.rb +0 -33
  1375. data/app/models/spree/log_entry.rb +0 -30
  1376. data/app/models/spree/metafields/boolean.rb +0 -15
  1377. data/app/models/spree/metafields/json.rb +0 -37
  1378. data/app/models/spree/metafields/long_text.rb +0 -7
  1379. data/app/models/spree/metafields/number.rb +0 -15
  1380. data/app/models/spree/metafields/rich_text.rb +0 -18
  1381. data/app/models/spree/metafields/short_text.rb +0 -7
  1382. data/app/models/spree/option_type_prototype.rb +0 -9
  1383. data/app/models/spree/order/address_book.rb +0 -100
  1384. data/app/models/spree/order/checkout.rb +0 -350
  1385. data/app/models/spree/order/currency_updater.rb +0 -37
  1386. data/app/models/spree/order/digital.rb +0 -60
  1387. data/app/models/spree/order/gift_card.rb +0 -71
  1388. data/app/models/spree/order/payments.rb +0 -64
  1389. data/app/models/spree/order/store_credit.rb +0 -110
  1390. data/app/models/spree/order/webhooks.rb +0 -19
  1391. data/app/models/spree/order_approval.rb +0 -19
  1392. data/app/models/spree/order_cancellation.rb +0 -19
  1393. data/app/models/spree/order_contents.rb +0 -31
  1394. data/app/models/spree/order_routing/strategy/legacy.rb +0 -33
  1395. data/app/models/spree/payment/webhooks.rb +0 -15
  1396. data/app/models/spree/permission_sets/base.rb +0 -81
  1397. data/app/models/spree/permission_sets/configuration_management.rb +0 -64
  1398. data/app/models/spree/permission_sets/dashboard_display.rb +0 -17
  1399. data/app/models/spree/permission_sets/default_customer.rb +0 -83
  1400. data/app/models/spree/permission_sets/order_display.rb +0 -27
  1401. data/app/models/spree/permission_sets/order_management.rb +0 -33
  1402. data/app/models/spree/permission_sets/product_display.rb +0 -27
  1403. data/app/models/spree/permission_sets/product_management.rb +0 -28
  1404. data/app/models/spree/permission_sets/promotion_management.rb +0 -22
  1405. data/app/models/spree/permission_sets/role_management.rb +0 -21
  1406. data/app/models/spree/permission_sets/stock_display.rb +0 -19
  1407. data/app/models/spree/permission_sets/stock_management.rb +0 -19
  1408. data/app/models/spree/permission_sets/super_user.rb +0 -28
  1409. data/app/models/spree/permission_sets/user_display.rb +0 -19
  1410. data/app/models/spree/permission_sets/user_management.rb +0 -20
  1411. data/app/models/spree/product/webhooks.rb +0 -17
  1412. data/app/models/spree/prototype_taxon.rb +0 -9
  1413. data/app/models/spree/reimbursement/credit.rb +0 -27
  1414. data/app/models/spree/reimbursement/reimbursement_type_engine.rb +0 -44
  1415. data/app/models/spree/reimbursement/reimbursement_type_validator.rb +0 -15
  1416. data/app/models/spree/reimbursement.rb +0 -167
  1417. data/app/models/spree/reimbursement_performer.rb +0 -34
  1418. data/app/models/spree/reimbursement_tax_calculator.rb +0 -37
  1419. data/app/models/spree/reimbursement_type/credit.rb +0 -13
  1420. data/app/models/spree/reimbursement_type/exchange.rb +0 -9
  1421. data/app/models/spree/reimbursement_type/original_payment.rb +0 -13
  1422. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +0 -64
  1423. data/app/models/spree/reimbursement_type/store_credit.rb +0 -20
  1424. data/app/models/spree/reimbursement_type.rb +0 -22
  1425. data/app/models/spree/report.rb +0 -130
  1426. data/app/models/spree/report_line_item.rb +0 -27
  1427. data/app/models/spree/report_line_items/products_performance.rb +0 -76
  1428. data/app/models/spree/report_line_items/sales_total.rb +0 -49
  1429. data/app/models/spree/reports/products_performance.rb +0 -44
  1430. data/app/models/spree/reports/sales_total.rb +0 -18
  1431. data/app/models/spree/return_authorization.rb +0 -109
  1432. data/app/models/spree/return_item/eligibility_validator/base_validator.rb +0 -24
  1433. data/app/models/spree/return_item/eligibility_validator/default.rb +0 -30
  1434. data/app/models/spree/return_item/eligibility_validator/inventory_shipped.rb +0 -16
  1435. data/app/models/spree/return_item/eligibility_validator/no_reimbursements.rb +0 -16
  1436. data/app/models/spree/return_item/eligibility_validator/order_completed.rb +0 -16
  1437. data/app/models/spree/return_item/eligibility_validator/rma_required.rb +0 -16
  1438. data/app/models/spree/return_item/eligibility_validator/time_since_purchase.rb +0 -16
  1439. data/app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb +0 -34
  1440. data/app/models/spree/return_item/exchange_variant_eligibility/same_product.rb +0 -9
  1441. data/app/models/spree/return_item.rb +0 -287
  1442. data/app/models/spree/returns_calculator.rb +0 -7
  1443. data/app/models/spree/search_provider/meilisearch.rb +0 -496
  1444. data/app/models/spree/shipment/custom_events.rb +0 -47
  1445. data/app/models/spree/shipment/webhooks.rb +0 -11
  1446. data/app/models/spree/shipment_handler.rb +0 -38
  1447. data/app/models/spree/shipping_category.rb +0 -25
  1448. data/app/models/spree/shipping_method_category.rb +0 -8
  1449. data/app/models/spree/shipping_method_zone.rb +0 -8
  1450. data/app/models/spree/state_change.rb +0 -12
  1451. data/app/models/spree/stock/splitter/digital.rb +0 -35
  1452. data/app/models/spree/stock/splitter/shipping_category.rb +0 -31
  1453. data/app/models/spree/stock_item/webhooks.rb +0 -6
  1454. data/app/models/spree/stock_movement/webhooks.rb +0 -6
  1455. data/app/models/spree/variant/webhooks.rb +0 -6
  1456. data/app/presenters/spree/csv/metafields_helper.rb +0 -17
  1457. data/app/presenters/spree/search_provider/product_presenter.rb +0 -138
  1458. data/app/presenters/spree/variant_presenter.rb +0 -81
  1459. data/app/presenters/spree/variants/option_types_presenter.rb +0 -87
  1460. data/app/services/spree/account/addresses/create.rb +0 -8
  1461. data/app/services/spree/account/addresses/update.rb +0 -8
  1462. data/app/services/spree/account/create.rb +0 -17
  1463. data/app/services/spree/account/update.rb +0 -15
  1464. data/app/services/spree/cart/add_item.rb +0 -63
  1465. data/app/services/spree/cart/associate.rb +0 -29
  1466. data/app/services/spree/cart/change_currency.rb +0 -27
  1467. data/app/services/spree/cart/create.rb +0 -26
  1468. data/app/services/spree/cart/destroy.rb +0 -50
  1469. data/app/services/spree/cart/empty.rb +0 -38
  1470. data/app/services/spree/cart/estimate_shipping_rates.rb +0 -39
  1471. data/app/services/spree/cart/recalculate.rb +0 -35
  1472. data/app/services/spree/cart/remove_item.rb +0 -39
  1473. data/app/services/spree/cart/remove_line_item.rb +0 -28
  1474. data/app/services/spree/cart/remove_out_of_stock_items.rb +0 -65
  1475. data/app/services/spree/cart/set_quantity.rb +0 -32
  1476. data/app/services/spree/cart/update.rb +0 -37
  1477. data/app/services/spree/carts/complete.rb +0 -50
  1478. data/app/services/spree/carts/upsert_items.rb +0 -76
  1479. data/app/services/spree/checkout/complete.rb +0 -23
  1480. data/app/services/spree/checkout/get_shipping_rates.rb +0 -52
  1481. data/app/services/spree/checkout/next.rb +0 -13
  1482. data/app/services/spree/checkout/select_shipping_method.rb +0 -63
  1483. data/app/services/spree/checkout/update.rb +0 -72
  1484. data/app/services/spree/credit_cards/destroy.rb +0 -25
  1485. data/app/services/spree/fulfillments/create.rb +0 -259
  1486. data/app/services/spree/gift_cards/apply.rb +0 -78
  1487. data/app/services/spree/gift_cards/redeem.rb +0 -17
  1488. data/app/services/spree/gift_cards/remove.rb +0 -39
  1489. data/app/services/spree/line_items/create.rb +0 -20
  1490. data/app/services/spree/line_items/destroy.rb +0 -18
  1491. data/app/services/spree/line_items/helper.rb +0 -11
  1492. data/app/services/spree/line_items/update.rb +0 -17
  1493. data/app/services/spree/orders/build_shipments.rb +0 -29
  1494. data/app/services/spree/orders/cancel.rb +0 -54
  1495. data/app/services/spree/orders/complete.rb +0 -53
  1496. data/app/services/spree/orders/update_contact_information.rb +0 -19
  1497. data/app/services/spree/orders/upsert_items.rb +0 -70
  1498. data/app/services/spree/payments/handle_webhook.rb +0 -57
  1499. data/app/services/spree/seeds/countries.rb +0 -35
  1500. data/app/services/spree/seeds/default_reimbursement_types.rb +0 -12
  1501. data/app/services/spree/seeds/shipping_categories.rb +0 -12
  1502. data/app/services/spree/seeds/states.rb +0 -63
  1503. data/app/services/spree/seeds/stock_locations.rb +0 -18
  1504. data/app/services/spree/seeds/store_credit_categories.rb +0 -14
  1505. data/app/services/spree/seeds/zones.rb +0 -52
  1506. data/app/services/spree/shipments/add_item.rb +0 -32
  1507. data/app/services/spree/shipments/change_state.rb +0 -14
  1508. data/app/services/spree/shipments/create.rb +0 -48
  1509. data/app/services/spree/shipments/helper.rb +0 -23
  1510. data/app/services/spree/shipments/remove_item.rb +0 -55
  1511. data/app/services/spree/stores/settings_defaults_by_country.rb +0 -38
  1512. data/app/services/spree/themes/duplicator.rb +0 -40
  1513. data/app/sorters/spree/base_sorter.rb +0 -47
  1514. data/app/sorters/spree/classifications/sort.rb +0 -68
  1515. data/app/sorters/spree/products/sort.rb +0 -73
  1516. data/app/subscribers/spree/report_subscriber.rb +0 -26
  1517. data/app/views/spree/addresses/_form.html.erb +0 -59
  1518. data/app/views/spree/addresses/_suggestions_box.erb +0 -14
  1519. data/app/views/spree/admin_user_mailer/confirmation_email.html.erb +0 -7
  1520. data/app/views/spree/report_mailer/report_done.html.erb +0 -7
  1521. data/app/views/spree/shared/_google_places_api_loader.html.erb +0 -7
  1522. data/app/views/spree/shared/_mailer_line_item.html.erb +0 -12
  1523. data/app/views/spree/shared/_payment.html.erb +0 -52
  1524. data/config/importmap.rb +0 -15
  1525. data/config/initializers/carmen.rb +0 -23
  1526. data/config/initializers/rails61_fixes.rb +0 -1
  1527. data/db/migrate/20250120152208_add_default_locale_to_action_text_rich_texts.rb +0 -7
  1528. data/db/migrate/20250122113708_add_first_and_last_name_to_spree_admin_class.rb +0 -9
  1529. data/db/migrate/20250204162453_create_spree_reports.rb +0 -13
  1530. data/db/migrate/20250217171018_create_action_text_video_embeds.rb +0 -11
  1531. data/db/migrate/20250508060800_add_selected_locale_to_spree_admin_users.rb +0 -8
  1532. data/db/migrate/20260429000001_create_spree_order_cancellations.rb +0 -25
  1533. data/db/migrate/20260429000002_create_spree_order_approvals.rb +0 -22
  1534. data/db/sample_data/markets.rb +0 -64
  1535. data/db/sample_data/metafield_definitions.rb +0 -7
  1536. data/db/sample_data/shipping_methods.rb +0 -61
  1537. data/lib/generators/spree/authentication/custom/custom_generator.rb +0 -49
  1538. data/lib/generators/spree/authentication/custom/templates/authentication_helpers.rb.tt +0 -50
  1539. data/lib/generators/spree/authentication/devise/devise_generator.rb +0 -84
  1540. data/lib/generators/spree/authentication/devise/templates/authentication_helpers.rb.tt +0 -50
  1541. data/lib/generators/spree/dummy/templates/app/assets/config/manifest.js +0 -0
  1542. data/lib/spree/core/components.rb +0 -31
  1543. data/lib/spree/core/controller_helpers/auth.rb +0 -52
  1544. data/lib/spree/core/controller_helpers/currency.rb +0 -59
  1545. data/lib/spree/core/controller_helpers/locale.rb +0 -99
  1546. data/lib/spree/core/controller_helpers/order.rb +0 -172
  1547. data/lib/spree/core/controller_helpers/strong_parameters.rb +0 -48
  1548. data/lib/spree/core/controller_helpers/turbo.rb +0 -19
  1549. data/lib/spree/core/partials.rb +0 -42
  1550. data/lib/spree/core/previews/report_preview.rb +0 -40
  1551. data/lib/spree/permitted_attributes.rb +0 -333
  1552. data/lib/spree/testing_support/authorization_helpers.rb +0 -72
  1553. data/lib/spree/testing_support/caching.rb +0 -47
  1554. data/lib/spree/testing_support/capybara_config.rb +0 -45
  1555. data/lib/spree/testing_support/capybara_ext.rb +0 -83
  1556. data/lib/spree/testing_support/controller_requests.rb +0 -11
  1557. data/lib/spree/testing_support/factories/adjustment_factory.rb +0 -28
  1558. data/lib/spree/testing_support/factories/asset_factory.rb +0 -12
  1559. data/lib/spree/testing_support/factories/customer_return_factory.rb +0 -36
  1560. data/lib/spree/testing_support/factories/digital_factory.rb +0 -10
  1561. data/lib/spree/testing_support/factories/image_factory.rb +0 -11
  1562. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +0 -18
  1563. data/lib/spree/testing_support/factories/log_entry_factory.rb +0 -6
  1564. data/lib/spree/testing_support/factories/metafield_definition_factory.rb +0 -72
  1565. data/lib/spree/testing_support/factories/metafield_factory.rb +0 -68
  1566. data/lib/spree/testing_support/factories/prototype_factory.rb +0 -9
  1567. data/lib/spree/testing_support/factories/reimbursement_credit_factory.rb +0 -7
  1568. data/lib/spree/testing_support/factories/reimbursement_factory.rb +0 -16
  1569. data/lib/spree/testing_support/factories/reimbursement_type_factory.rb +0 -7
  1570. data/lib/spree/testing_support/factories/report_factory.rb +0 -33
  1571. data/lib/spree/testing_support/factories/return_authorization_factory.rb +0 -21
  1572. data/lib/spree/testing_support/factories/return_item_factory.rb +0 -14
  1573. data/lib/spree/testing_support/factories/shipment_factory.rb +0 -21
  1574. data/lib/spree/testing_support/factories/shipping_category_factory.rb +0 -9
  1575. data/lib/spree/testing_support/factories/shipping_method_factory.rb +0 -31
  1576. data/lib/spree/testing_support/factories/shipping_rate_factory.rb +0 -7
  1577. data/lib/spree/testing_support/factories/state_change_factory.rb +0 -8
  1578. data/lib/spree/testing_support/factories/stock_item_factory.rb +0 -22
  1579. data/lib/spree/testing_support/factories/store_credit_category_factory.rb +0 -9
  1580. data/lib/spree/testing_support/factories/store_credit_type_factory.rb +0 -16
  1581. data/lib/spree/testing_support/factories/wished_variant_factory.rb +0 -6
  1582. data/lib/spree/webhooks.rb +0 -22
  1583. data/lib/tasks/role_users.rake +0 -21
  1584. data/vendor/javascript/@rails--request.js.js +0 -4
  1585. data/vendor/javascript/@stimulus-components--auto-submit.js +0 -4
  1586. data/vendor/javascript/stimulus-reveal-controller.js +0 -4
  1587. data/vendor/javascript/stimulus-textarea-autogrow.js +0 -4
  1588. data/vendor/javascript/tailwindcss-stimulus-components.js +0 -4
@@ -0,0 +1,86 @@
1
+ module Spree
2
+ # One seller's position in one currency, read off the fund ledger.
3
+ #
4
+ # Never persisted: every figure is a sum over {Spree::SellerTransfer} and
5
+ # {Spree::SellerPayout} rows, so the ledger stays the only record and this
6
+ # only presents it. One per currency — a marketplace paying a seller in two
7
+ # currencies has two ledgers, and adding them would answer a question nobody
8
+ # asked.
9
+ #
10
+ # A position has two sides when the seller's account settles in a currency
11
+ # other than the one they sold in: what the sale was worth, and what their
12
+ # account received once the provider converted it. Both are recorded figures.
13
+ # They are never added together, and Spree converts nothing itself.
14
+ class SellerBalance
15
+ include ActiveModel::Model
16
+ include ActiveModel::Attributes
17
+
18
+ attribute :seller
19
+ # What the sales were priced in.
20
+ attribute :currency, :string
21
+ # What the seller's account holds, and is paid in. The same as `currency`
22
+ # unless the provider converted on the way in.
23
+ attribute :settlement_currency, :string
24
+ # What the seller has earned: completed transfers, reversals included.
25
+ attribute :earned, :decimal, default: 0
26
+ # Earnings still with the provider — a transfer not yet confirmed, or one
27
+ # whose outcome is unknown. Shown so a shipped order does not read as
28
+ # unpaid while the money is in flight.
29
+ attribute :pending, :decimal, default: 0
30
+ # The same completed earnings, as their account received them.
31
+ attribute :payable, :decimal, default: 0
32
+ # How much of that has reached them, through settlements that completed.
33
+ attribute :paid, :decimal, default: 0
34
+
35
+ extend Spree::DisplayMoney
36
+ money_methods :earned, :pending
37
+
38
+ # @param seller [Spree::Seller]
39
+ # @param currency [String] what the sales were priced in
40
+ # @param settlement_currency [String] what the account settles in
41
+ # @return [Spree::SellerBalance]
42
+ def self.for(seller, currency, settlement_currency = currency)
43
+ transfers = seller.seller_transfers.where(currency: currency).settling_in(settlement_currency)
44
+
45
+ new(
46
+ seller: seller,
47
+ currency: currency,
48
+ settlement_currency: settlement_currency,
49
+ earned: transfers.completed.sum(:amount),
50
+ pending: transfers.with_status('pending', 'processing', 'unresolved').sum(:amount),
51
+ payable: transfers.completed.settlement_total,
52
+ # Read through the transfers a settlement claimed rather than off the
53
+ # settlement's own total: two sale currencies can settle into one, and
54
+ # the payout's figure would then count against both of them.
55
+ paid: transfers.completed.joins(:payout).
56
+ merge(Spree::SellerPayout.completed).settlement_total
57
+ )
58
+ end
59
+
60
+ # What the marketplace still owes, in the currency it can actually be sent
61
+ # in.
62
+ #
63
+ # A payout settles every position sharing that currency, so a seller who
64
+ # sells in two currencies that settle into one is paid the sum of both
65
+ # rather than either. The figures reconcile — both sides read the same
66
+ # transfer rows — but one position is not one deposit.
67
+ #
68
+ # @return [BigDecimal]
69
+ def balance
70
+ payable - paid
71
+ end
72
+
73
+ # @return [Boolean] whether the provider converted this seller's earnings
74
+ def converted?
75
+ settlement_currency != currency
76
+ end
77
+
78
+ # Formatted in the settlement currency rather than the sale's, since these
79
+ # are what the account holds.
80
+ %i[payable paid balance].each do |figure|
81
+ define_method(:"display_#{figure}") do
82
+ Spree::Money.new(public_send(figure), currency: settlement_currency)
83
+ end
84
+ end
85
+ end
86
+ end
@@ -0,0 +1,116 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ # One settlement to one seller: the earnings they had accrued, batched and
5
+ # sent on their own schedule.
6
+ #
7
+ # The second of the ledger's two levels. Transfers credit a seller as each
8
+ # order ships; a payout is the money actually leaving — daily, weekly,
9
+ # monthly, or whenever an operator says so. It names exactly which transfers
10
+ # it settled, so a seller asking "what is this deposit for" has an answer,
11
+ # and so a reversal arriving after a payout closed lands in the next period
12
+ # rather than rewriting a settlement that already happened.
13
+ #
14
+ # Core records both levels for every marketplace. Whether money actually
15
+ # moves is the {Spree::PayoutProvider}'s business: the built-in one records
16
+ # and leaves the operator to pay by bank, while a provider like Stripe
17
+ # Connect performs the transfer itself.
18
+ class SellerPayout < Spree.base_class
19
+ has_prefix_id :vpo
20
+
21
+ include Spree::Metadata
22
+ # Denormalized from the seller, which never changes store — so the copy
23
+ # cannot drift, and tenancy is structural rather than a subquery every
24
+ # consumer must remember. Always set explicitly from the seller: ledger
25
+ # rows are written by jobs and subscribers, where the request-scoped
26
+ # default store is absent or wrong.
27
+ include Spree::SingleStoreResource
28
+
29
+ #
30
+ # Associations
31
+ #
32
+ belongs_to :seller, class_name: 'Spree::Seller'
33
+ # What this payout settles. Deliberately nullify rather than destroy: a
34
+ # transfer is the record of an earning and outlives the settlement that
35
+ # paid it, so a deleted payout releases its transfers back to the next
36
+ # sweep instead of erasing what the seller earned.
37
+ has_many :transfers, class_name: 'Spree::SellerTransfer', foreign_key: :payout_id,
38
+ inverse_of: :payout, dependent: :nullify
39
+
40
+ #
41
+ # Validations
42
+ #
43
+ validates :amount, numericality: true
44
+ validates :currency, presence: true
45
+ validates :provider, presence: true
46
+
47
+ #
48
+ # Statuses. As with transfers, movement is through workflows rather than a
49
+ # transition graph.
50
+ #
51
+ include Spree::HasStatus
52
+ has_status :pending, :processing, :completed, :failed, :unresolved, default: :pending
53
+
54
+ #
55
+ # Scopes
56
+ #
57
+ # Money promised but not yet gone — what an operator's queue is for.
58
+ scope :owed, -> { where(status: %w[pending processing]) }
59
+
60
+ self.whitelisted_ransackable_attributes = %w[amount currency status provider reference period_start period_end created_at seller_id]
61
+ self.whitelisted_ransackable_associations = %w[seller transfers]
62
+
63
+ extend Spree::DisplayMoney
64
+ money_methods :amount
65
+
66
+ # @return [BigDecimal] what the transfers this payout holds actually come
67
+ # to, for checking a stored amount against its parts
68
+ # Summed on what the seller's account actually received, since that is
69
+ # what this payout moves.
70
+ def transfers_total
71
+ transfers.settlement_total
72
+ end
73
+
74
+ # Gives up on this settlement and puts its earnings back.
75
+ #
76
+ # Releasing them is what makes a failure recoverable, and it is the one
77
+ # thing a caller must not forget: a sweep only ever collects unstamped
78
+ # rows, so earnings left stamped to a failed payout are invisible to every
79
+ # later sweep while the balance still reports the seller as owed them.
80
+ # Released, they simply fall into the next one.
81
+ #
82
+ # Lives here rather than in the flows that call it — core's sweep and any
83
+ # provider's failure webhook — because the association and the status both
84
+ # belong to the payout, and a provider gem should not have to know the
85
+ # invariant to honour it.
86
+ def fail!
87
+ transaction do
88
+ release_transfers
89
+ # The amount stays: an operator investigating a failed settlement has
90
+ # to see what was attempted, and the `owed` scope already excludes it
91
+ # from what is still to be sent.
92
+ update!(status: 'failed')
93
+ end
94
+ end
95
+
96
+ # Records that nobody knows whether this settlement happened, and
97
+ # deliberately keeps its earnings claimed.
98
+ #
99
+ # The opposite of {#fail!} in the one way that matters. Releasing here
100
+ # would let the next sweep assemble the same earnings into a second
101
+ # payout, and a provider's idempotency key only protects a retry for as
102
+ # long as the provider keeps the record — Stripe prunes after a day, so a
103
+ # monthly sweep is well past it. Held instead, the earnings stay out of
104
+ # every later sweep until a person or a webhook settles what actually
105
+ # happened.
106
+ def unresolve!
107
+ update!(status: 'unresolved')
108
+ end
109
+
110
+ # Hands the earnings back to the next sweep without recording a failure —
111
+ # for a settlement that never had anything to send.
112
+ def release_transfers
113
+ transfers.update_all(payout_id: nil, updated_at: Time.current)
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,274 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ # One thing a marketplace asks of its sellers before it will let them
5
+ # trade — accepting the terms, giving a returns address, uploading a
6
+ # business registration (docs/plans/6.0-seller-onboarding-requirements.md).
7
+ #
8
+ # A row is a configured instance of a *kind* (an STI subclass registered in
9
+ # `Spree.seller_requirements`), so the operator composes the checklist from
10
+ # the dashboard and only a genuinely new kind of check needs code. Rows are
11
+ # configuration; what a particular seller has done about one is either
12
+ # computed from their own data or recorded as a
13
+ # {Spree::SellerRequirementSubmission}.
14
+ class SellerRequirement < Spree.base_class
15
+ include Spree::SingleStoreResource
16
+ include Spree::HasListPosition
17
+ include Spree::PreferenceSchema
18
+ include Spree::Metadata
19
+
20
+ has_prefix_id :selreq
21
+
22
+ acts_as_list scope: :store
23
+
24
+ #
25
+ # Associations
26
+ #
27
+ belongs_to :store, class_name: 'Spree::Store', inverse_of: :seller_requirements
28
+ has_many :submissions, class_name: 'Spree::SellerRequirementSubmission',
29
+ foreign_key: :seller_requirement_id, inverse_of: :requirement, dependent: :destroy
30
+
31
+ #
32
+ # Validations
33
+ #
34
+ validates :type, presence: true
35
+ validate :type_must_be_registered
36
+ # Most kinds answer one question, so a second row of the same kind would
37
+ # either repeat it or contradict it. The generic kinds — where the
38
+ # question is the operator's own words — opt out.
39
+ validates :type, uniqueness: { scope: [:store_id, *spree_base_uniqueness_scope] },
40
+ unless: -> { self.class.allow_multiple? }
41
+ # A kind that can appear more than once has nothing else to tell the
42
+ # seller apart by, so its label is the row's own.
43
+ validates :name, presence: true, if: -> { self.class.allow_multiple? }
44
+
45
+ registers_subclasses_via { Spree.seller_requirements }
46
+
47
+ #
48
+ # Scopes
49
+ #
50
+ scope :active, -> { where(active: true) }
51
+ scope :required, -> { where(required: true) }
52
+
53
+ # The kinds a marketplace starts with, in the order a seller meets them:
54
+ # agree to the terms, say who you are, tell us where to invoice and where
55
+ # returns go, have a way to ship, then list something.
56
+ #
57
+ # Only the kinds that ask a question core already knows how to answer.
58
+ # The generic ones (an attestation, a document, a manual check) are absent
59
+ # on purpose — they mean nothing until the operator has written what they
60
+ # are asking for.
61
+ DEFAULT_KINDS = %w[
62
+ Spree::SellerRequirements::AcceptTerms
63
+ Spree::SellerRequirements::CompleteProfile
64
+ Spree::SellerRequirements::BillingAddress
65
+ Spree::SellerRequirements::ReturnsAddress
66
+ Spree::SellerRequirements::DeliveryMethod
67
+ Spree::SellerRequirements::PackageType
68
+ Spree::SellerRequirements::MinimumProducts
69
+ ].freeze
70
+
71
+ # Writes the default checklist for a store, skipping kinds it already
72
+ # has. Idempotent, so a store seeded before a kind existed picks it up on
73
+ # the next run — but a requirement the operator deleted stays deleted
74
+ # only until then, which is the same bargain the seeded commission rate
75
+ # makes.
76
+ #
77
+ # @param store [Spree::Store]
78
+ # @return [Array<Spree::SellerRequirement>] the rows created
79
+ def self.provision_defaults(store)
80
+ registered = Spree.seller_requirements.map(&:to_s)
81
+ # `reorder(nil)`: the association orders by position, and PostgreSQL
82
+ # refuses SELECT DISTINCT with an ORDER BY on a column it does not select.
83
+ existing = store.seller_requirements.where(type: DEFAULT_KINDS).reorder(nil).distinct.pluck(:type)
84
+
85
+ ((DEFAULT_KINDS & registered) - existing).map do |kind|
86
+ store.seller_requirements.create!(type: kind)
87
+ end
88
+ end
89
+
90
+ # @return [String] the localized name of the kind, used by operator pickers
91
+ def self.human_name
92
+ Spree.t("seller_requirement_types.#{api_type}.name", default: api_type.titleize)
93
+ end
94
+
95
+ # @return [String] the localized description of the kind
96
+ def self.human_description
97
+ Spree.t("seller_requirement_types.#{api_type}.description", default: '')
98
+ end
99
+
100
+ # Whether the operator may configure this kind more than once per store.
101
+ # True for the kinds whose meaning comes from the operator's own copy.
102
+ #
103
+ # @return [Boolean]
104
+ def self.allow_multiple?
105
+ false
106
+ end
107
+
108
+ # Whether a seller can record having done this themselves. False for
109
+ # computed kinds, where a submission would be a second, disagreeing
110
+ # answer to a question the data already settles.
111
+ #
112
+ # @return [Boolean]
113
+ def self.accepts_submissions?
114
+ false
115
+ end
116
+
117
+ # Whether a seller's submission waits for someone to confirm it.
118
+ #
119
+ # @return [Boolean]
120
+ def self.reviewed_by_operator?
121
+ false
122
+ end
123
+
124
+ # Whether a submission has to carry a file to mean anything. Declared by
125
+ # the kind rather than tested for by class, so a gem shipping its own
126
+ # document-style kind gets the same enforcement.
127
+ #
128
+ # @return [Boolean]
129
+ def self.requires_file?
130
+ false
131
+ end
132
+
133
+ # Content types a submission's file may carry. Empty accepts anything.
134
+ # Declared beside {.requires_file?} so a kind that collects files gets
135
+ # both halves of the contract rather than only the one it remembered.
136
+ #
137
+ # @return [Array<String>]
138
+ def self.accepted_content_types
139
+ []
140
+ end
141
+
142
+ delegate :accepted_content_types, to: :class
143
+
144
+ # @return [String] what the seller sees; the kind's name unless the
145
+ # operator wrote their own
146
+ def display_name
147
+ name.presence || self.class.human_name
148
+ end
149
+
150
+ # @return [String, nil]
151
+ def display_description
152
+ description.presence || self.class.human_description.presence
153
+ end
154
+
155
+ # Whether this requirement applies to the given seller at all. A kind
156
+ # narrows itself here — a payout-account kind only applies once the store
157
+ # has a payout provider — and a requirement that does not apply is absent
158
+ # from the checklist rather than shown as unmet.
159
+ #
160
+ # @param _seller [Spree::Seller]
161
+ # @return [Boolean]
162
+ def applicable?(_seller)
163
+ true
164
+ end
165
+
166
+ # Whether this requirement stands met for the seller.
167
+ #
168
+ # A waiver settles it whatever the kind would otherwise say: the operator
169
+ # is recording that they dealt with this outside the marketplace, and a
170
+ # kind reading its own data — the terms column, the address — would
171
+ # never see that. Not overridable for exactly that reason; kinds
172
+ # override {#met_by_seller?} instead.
173
+ #
174
+ # Whether this evaluation may answer from what Spree already knows rather
175
+ # than asking the outside world. Set by `Spree::Sellers::Requirements` for
176
+ # a listing, where one network call per row is the difference between a
177
+ # page that loads and one that does not. A kind that never leaves the
178
+ # database can ignore it; one that calls a provider should read the value
179
+ # it last recorded instead.
180
+ #
181
+ # False everywhere it matters — the two approval gates and a seller's own
182
+ # page ask for the current answer.
183
+ attr_accessor :prefer_cached
184
+
185
+ # @param seller [Spree::Seller]
186
+ # @return [Boolean]
187
+ def satisfied?(seller)
188
+ return true if latest_submission(seller)&.waived?
189
+
190
+ met_by_seller?(seller)
191
+ end
192
+
193
+ # Whether the seller themselves has met this requirement. Computed kinds
194
+ # override this to read seller data; the default answers from the latest
195
+ # submission, which is what the attested and verified kinds need.
196
+ #
197
+ # @param seller [Spree::Seller]
198
+ # @return [Boolean]
199
+ def met_by_seller?(seller)
200
+ submission = latest_submission(seller)
201
+
202
+ submission.present? && submission.satisfies_requirement?
203
+ end
204
+
205
+ # The seller's standing on this requirement.
206
+ #
207
+ # `pending` means someone else has to act — an operator review, a
208
+ # provider still working through its own checks — which is worth telling
209
+ # the seller apart from "you have not done this yet".
210
+ #
211
+ # @param seller [Spree::Seller]
212
+ # @return [String] complete | incomplete | pending | rejected
213
+ def status_for(seller)
214
+ return Spree::SellerRequirementStatus::COMPLETE if satisfied?(seller)
215
+
216
+ case latest_submission(seller)&.status
217
+ when 'pending' then Spree::SellerRequirementStatus::PENDING
218
+ when 'rejected' then Spree::SellerRequirementStatus::REJECTED
219
+ else Spree::SellerRequirementStatus::INCOMPLETE
220
+ end
221
+ end
222
+
223
+ # Somewhere for the seller to go to get this done — a hosted onboarding
224
+ # link, for instance. Nil when the seller finishes it inside their own
225
+ # panel, which is the usual case.
226
+ #
227
+ # @param _seller [Spree::Seller]
228
+ # @return [String, nil]
229
+ def action_url(_seller)
230
+ nil
231
+ end
232
+
233
+ # Why this line is not done, when the answer is somewhere the seller
234
+ # cannot see. Nil for every kind whose own description already says what
235
+ # is wanted, which is nearly all of them — a requirement asking for an
236
+ # address explains itself.
237
+ #
238
+ # @param _seller [Spree::Seller]
239
+ # @return [Hash, nil] `{ state:, message: }`
240
+ def blocker(_seller)
241
+ nil
242
+ end
243
+
244
+ # The submission that decides this requirement's standing for a seller:
245
+ # the most recent one. Earlier rows are the audit trail.
246
+ #
247
+ # Read through the seller rather than through this requirement: a seller
248
+ # has a handful of submissions, a requirement has one per seller on the
249
+ # marketplace, and evaluating a checklist asks about one seller. The
250
+ # seller's association loads once and every requirement reads from it.
251
+ #
252
+ # @param seller [Spree::Seller]
253
+ # @return [Spree::SellerRequirementSubmission, nil]
254
+ def latest_submission(seller)
255
+ return nil if seller.nil?
256
+
257
+ seller.requirement_submissions
258
+ .select { |submission| submission.seller_requirement_id == id }
259
+ .max_by { |submission| [submission.created_at, submission.id] }
260
+ end
261
+
262
+ private
263
+
264
+ def type_must_be_registered
265
+ return if type.blank?
266
+ return if Spree.seller_requirements.any? { |kind| kind.to_s == type }
267
+
268
+ errors.add(
269
+ :type, :invalid_seller_requirement, message: Spree.t(:invalid_seller_requirement, scope: [:errors, :messages],
270
+ default: 'is not a registered seller requirement')
271
+ )
272
+ end
273
+ end
274
+ end
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ # Joins a requirement to a custom field definition it asks the seller to
5
+ # fill in. A concrete row rather than a key in preferences: a definition
6
+ # that is renamed keeps its id, and one that is deleted takes this row with
7
+ # it — a stored key would survive both and quietly satisfy every seller.
8
+ class SellerRequirementCustomField < Spree.base_class
9
+ belongs_to :seller_requirement, class_name: 'Spree::SellerRequirement'
10
+ belongs_to :custom_field_definition, class_name: 'Spree::CustomFieldDefinition'
11
+
12
+ validates :custom_field_definition_id, uniqueness: { scope: :seller_requirement_id }, allow_nil: true
13
+ validate :definition_must_describe_a_seller
14
+ validate :definition_must_belong_to_the_same_store
15
+
16
+ private
17
+
18
+ # A definition for products or orders asks the seller for something they
19
+ # have no field to answer with, so the requirement could never be met.
20
+ def definition_must_describe_a_seller
21
+ return if custom_field_definition.nil?
22
+ return if custom_field_definition.resource_type == Spree::Seller.to_s
23
+
24
+ errors.add(:custom_field_definition, :invalid,
25
+ message: Spree.t('seller_requirements.custom_field_not_for_sellers',
26
+ default: 'must be a custom field defined for sellers'))
27
+ end
28
+
29
+ # Both sides are store-owned, so a marketplace can only ask its sellers
30
+ # for fields it defined itself.
31
+ def definition_must_belong_to_the_same_store
32
+ return if custom_field_definition.nil? || seller_requirement.nil?
33
+ return if custom_field_definition.store_id == seller_requirement.store_id
34
+
35
+ errors.add(:custom_field_definition, :must_belong_to_same_store)
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,144 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Spree
4
+ # One line of a seller's onboarding checklist: a requirement evaluated
5
+ # against a seller. A value object — the answer is derived from the
6
+ # seller's own data and their submissions every time it is asked for, so
7
+ # there is nothing here worth storing and a stored copy would go stale the
8
+ # moment a product or an address changed.
9
+ #
10
+ # See {Spree::Sellers::Requirements}, which builds these.
11
+ class SellerRequirementStatus
12
+ include ActiveModel::Model
13
+ include ActiveModel::Attributes
14
+
15
+ COMPLETE = 'complete'
16
+ INCOMPLETE = 'incomplete'
17
+ PENDING = 'pending'
18
+ REJECTED = 'rejected'
19
+
20
+ STATUSES = [COMPLETE, INCOMPLETE, PENDING, REJECTED].freeze
21
+
22
+ # The requirement's prefixed id, so a client can act on it.
23
+ attribute :id, :string
24
+ # The kind, e.g. 'accept_terms' — what a frontend keys presentation off.
25
+ attribute :kind, :string
26
+ attribute :name, :string
27
+ attribute :description, :string
28
+ attribute :required, :boolean, default: true
29
+ attribute :position, :integer
30
+ attribute :status, :string
31
+ attribute :action_url, :string
32
+
33
+ # Why this line is stuck, when the reason lives somewhere the seller
34
+ # cannot see — a payout provider still checking their identity, say.
35
+ #
36
+ # `state` is one of `action` (they must do something), `pending` (the
37
+ # provider is looking, and nobody can hurry it) or `rejected`. `message`
38
+ # is the provider's own sentence when it wrote one: best-effort and
39
+ # unlocalized, so it is shown as detail beside translated copy rather
40
+ # than in place of it.
41
+ #
42
+ # @return [Hash, nil]
43
+ attr_accessor :blocker
44
+
45
+ # The submission behind the status, when there is one.
46
+ # @return [Spree::SellerRequirementSubmission, nil]
47
+ attr_accessor :submission
48
+
49
+ # The requirement this was evaluated from.
50
+ #
51
+ # Carried so a serializer can ask the kind its own questions — which
52
+ # custom fields it names, whether it takes a file — without re-fetching a
53
+ # row the evaluator has already loaded. Not serialized itself: what a
54
+ # client needs is the answers, not the configuration row.
55
+ #
56
+ # @return [Spree::SellerRequirement, nil]
57
+ attr_accessor :requirement
58
+
59
+ # The seller this was evaluated against, so kind-specific readers can ask
60
+ # about them without the caller passing them a second time.
61
+ #
62
+ # @return [Spree::Seller, nil]
63
+ attr_accessor :seller
64
+
65
+ # The custom fields this line asks for, each paired with the seller's
66
+ # current answer — empty for every kind that asks for none.
67
+ #
68
+ # Built here rather than in the serializer because it is the answer to
69
+ # "what does this requirement want", which is the value object's job; the
70
+ # serializer only decides how to render it.
71
+ #
72
+ # @return [Array<Hash>] `{ definition:, custom_field: }` pairs
73
+ def custom_fields
74
+ return @custom_fields if defined?(@custom_fields)
75
+ return @custom_fields = [] if seller.nil? || !requirement.respond_to?(:custom_field_definitions)
76
+
77
+ answered = seller.custom_fields.index_by(&:custom_field_definition_id)
78
+
79
+ @custom_fields = requirement.custom_field_definitions.map do |definition|
80
+ { definition: definition, custom_field: answered[definition.id] }
81
+ end
82
+ end
83
+
84
+ # The legal document this line asks for, when its kind asks for one —
85
+ # nil for every other kind.
86
+ #
87
+ # Same job as {#custom_fields}: the value object answers "what does this
88
+ # requirement want", so the seller panel can offer to create that exact
89
+ # document rather than making the seller retype its name.
90
+ #
91
+ # @return [String, nil]
92
+ def required_policy_name
93
+ return nil unless requirement.respond_to?(:required_policy_name)
94
+
95
+ requirement.required_policy_name.presence
96
+ end
97
+
98
+ # The marketplace terms this line asks the seller to accept, as
99
+ # sanitized markup. Nil for every other kind, and nil while the
100
+ # marketplace has not written any.
101
+ #
102
+ # @return [String, nil]
103
+ def terms_html
104
+ return nil unless requirement.respond_to?(:terms_html)
105
+
106
+ requirement.terms_html
107
+ end
108
+
109
+ # The policy the seller actually published against this line, when they
110
+ # have — nil for every other kind, and nil while the document is still
111
+ # owed.
112
+ #
113
+ # What the operator reads before approving: a line that says "Done"
114
+ # without showing what was written is not something anyone can approve on.
115
+ #
116
+ # @return [Spree::Policy, nil]
117
+ def published_policy
118
+ return @published_policy if defined?(@published_policy)
119
+
120
+ name = required_policy_name
121
+ return @published_policy = nil if name.nil? || seller.nil?
122
+
123
+ @published_policy = seller.policies.detect do |policy|
124
+ policy.name.to_s.strip.casecmp?(name) && policy.with_body?
125
+ end
126
+ end
127
+
128
+ # ActiveModel::Attributes gives readers, not predicates.
129
+ def required?
130
+ !!required
131
+ end
132
+
133
+ def complete?
134
+ status == COMPLETE
135
+ end
136
+
137
+ # Whether this is standing between the seller and approval.
138
+ #
139
+ # @return [Boolean]
140
+ def blocking?
141
+ required? && !complete?
142
+ end
143
+ end
144
+ end