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,247 @@
1
+ module Spree
2
+ module Customers
3
+ # Creates a customer account — the single storefront registration flow
4
+ # (docs/plans/6.0-service-workflows.md decision 13).
5
+ #
6
+ # Two callers today: store self-registration and the checkout "create an
7
+ # account" box, which passes `order:` — the customer is built from the
8
+ # order without a password (the account is claimed via password reset,
9
+ # like an admin-created one), the order's addresses become the account's
10
+ # defaults and the order is linked to the new account.
11
+ #
12
+ # The `validate` hook is the veto seam for registration policy —
13
+ # bot/disposable-email screening, fraud checks, B2B approval. Handlers
14
+ # read the built (unsaved) `customer` plus `order`/`created_by`; staff
15
+ # bypass is a handler decision via `created_by`, the same pattern as
16
+ # return eligibility. Core sends no welcome email — signup email is
17
+ # host-app code on the `user.created` event or the `after_create` hook.
18
+ class Create < Spree::Workflow
19
+ hooks :validate, :after_create
20
+
21
+ # The customer record — built (unsaved) while :validate runs.
22
+ attr_reader :customer
23
+
24
+ # @param store [Spree::Store] the store the registration happens on;
25
+ # exposed to hook handlers and scopes the newsletter-subscriber link
26
+ # @param email [String, nil] defaults to the order email with `order:`
27
+ # @param password [String, nil]
28
+ # @param password_confirmation [String, nil]
29
+ # @param first_name [String, nil] defaults from the order addresses
30
+ # with `order:`, as do last_name and phone
31
+ # @param last_name [String, nil]
32
+ # @param phone [String, nil]
33
+ # @param accepts_email_marketing [Boolean, nil] defaults from the
34
+ # order's marketing opt-in with `order:`
35
+ # @param metadata [Hash, nil]
36
+ # @param order [Spree::Order, nil] a placed order adopting the new
37
+ # account; when its email already belongs to a customer, the order is
38
+ # linked to that account and no new customer is created
39
+ # @param password_required [Boolean, nil] whether a missing password
40
+ # fails the registration (the account is created password-less
41
+ # otherwise and claimed via password reset). Defaults to true except
42
+ # with `order:` — guest checkout collects no password, while
43
+ # self-registration must, because the caller issues a JWT on success
44
+ # @param terms_of_service [Boolean, nil] whether the person ticked the
45
+ # storefront's terms box. Only a true value records a terms consent
46
+ # row — absent means "not asked", which is not agreement
47
+ # @param created_by [Object, nil] the staff actor; nil for storefront
48
+ # self-registration
49
+ def perform(store:, email: nil, password: nil, password_confirmation: nil,
50
+ first_name: nil, last_name: nil, phone: nil,
51
+ accepts_email_marketing: nil, metadata: nil,
52
+ order: nil, password_required: nil, created_by: nil,
53
+ terms_of_service: nil, ip_address: nil, user_agent: nil)
54
+ super
55
+
56
+ step :adopt_existing_customer
57
+ step :build_customer
58
+ step :ensure_password
59
+
60
+ # Veto point — registration policy. The customer is built but not
61
+ # yet persisted.
62
+ run_hooks :validate
63
+
64
+ ApplicationRecord.transaction do
65
+ step :create_customer
66
+ step :link_order
67
+ step :record_consent
68
+ end
69
+
70
+ step :link_newsletter_subscriber
71
+ run_hooks :after_create
72
+ success(order ? customer.reload : customer)
73
+ end
74
+
75
+ private
76
+
77
+ # Checkout only: an account with the order's email already exists, so
78
+ # the order joins it instead of registering a duplicate. Registration
79
+ # policy hooks don't run — nothing is being registered.
80
+ def adopt_existing_customer
81
+ return unless order
82
+
83
+ existing_customer = Spree.customer_class.find_by(email: order.email)
84
+ return unless existing_customer
85
+
86
+ assign_order_to(existing_customer)
87
+ halt!(existing_customer)
88
+ end
89
+
90
+ def build_customer
91
+ @customer = Spree.customer_class.new(customer_attributes)
92
+ end
93
+
94
+ def customer_attributes
95
+ order_address = order && (order.bill_address || order.ship_address)
96
+
97
+ {
98
+ email: email || order&.email,
99
+ password: password,
100
+ password_confirmation: password_confirmation,
101
+ first_name: first_name || order_address&.first_name,
102
+ last_name: last_name || order_address&.last_name,
103
+ phone: phone || order_address&.phone,
104
+ accepts_email_marketing: accepts_email_marketing.nil? ? order&.accept_marketing? : accepts_email_marketing,
105
+ metadata: metadata
106
+ }.compact
107
+ end
108
+
109
+ # The model itself allows a blank password — a password-less account
110
+ # cannot log in (Customer#valid_password? guards the blank digest) and
111
+ # is claimed via password reset; whether registration accepts that
112
+ # state is the password_required policy. No password is generated:
113
+ # blank is the one unclaimed-account state everywhere, and a generated
114
+ # value could fail a host's swapped-in Spree.password_validator.
115
+ def ensure_password
116
+ return if customer.password.present? || !password_required?
117
+
118
+ customer.errors.add(:password, :blank)
119
+ failure(customer)
120
+ end
121
+
122
+ def password_required?
123
+ password_required.nil? ? order.nil? : password_required
124
+ end
125
+
126
+ def create_customer
127
+ # Keeps the stamped column agreeing with the consent row written below
128
+ # — otherwise a registration records 'registration' in one place and
129
+ # 'account' in the other, for the same instant.
130
+ customer.consent_source = consent_source
131
+ failure(customer) unless customer.save
132
+ end
133
+
134
+ # Records what the person actually agreed to.
135
+ #
136
+ # Terms are recorded only when the caller says the box was ticked. A row
137
+ # written for every registration would be fabricated evidence: the
138
+ # checkout account box presents no terms checkbox at all, and a consent
139
+ # record is worth having precisely because it is not assumed.
140
+ #
141
+ # Inside the transaction: a customer that exists without the record of
142
+ # what they agreed to is exactly the gap these rows are meant to close.
143
+ def record_consent
144
+ if accepted_terms?
145
+ Spree::ConsentRecord.record!(
146
+ store: store,
147
+ owner: customer,
148
+ purpose: Spree::ConsentRecord::TERMS_OF_SERVICE,
149
+ source: consent_source,
150
+ email: customer.email,
151
+ ip_address: ip_address,
152
+ user_agent: user_agent,
153
+ policies: consent_policies
154
+ )
155
+ end
156
+
157
+ # Checkout already recorded the marketing opt-in against the order
158
+ # before this workflow ran (OrderPlacedSubscriber), so writing one here
159
+ # too would make a single tick look like two separate agreements.
160
+ return if order
161
+ return unless customer.accepts_email_marketing?
162
+
163
+ Spree::ConsentRecord.record!(
164
+ store: store,
165
+ owner: customer,
166
+ purpose: Spree::ConsentRecord::EMAIL_MARKETING,
167
+ source: consent_source,
168
+ email: customer.email,
169
+ ip_address: ip_address,
170
+ user_agent: user_agent
171
+ )
172
+ end
173
+
174
+ # The storefront passes `terms_of_service` when its consent box is
175
+ # ticked. Absent means "not asked", which is not the same as agreed.
176
+ def accepted_terms?
177
+ ActiveModel::Type::Boolean.new.cast(terms_of_service).present?
178
+ end
179
+
180
+ # An account created from a placed order was agreed to at checkout; one
181
+ # created directly was agreed to at registration.
182
+ def consent_source
183
+ order ? Spree::ConsentRecord::CHECKOUT : Spree::ConsentRecord::REGISTRATION
184
+ end
185
+
186
+ # The documents as they read at the moment of agreement, so a merchant
187
+ # who later edits their terms can still show which text this person saw.
188
+ # The document the tick was next to, not every policy the store keeps.
189
+ # A consent row exists to prove which text somebody accepted, so naming
190
+ # the returns and shipping policies beside it — which no checkbox showed
191
+ # — is the same fabricated evidence as recording a terms agreement for
192
+ # an account that was never asked for one.
193
+ #
194
+ # Matched by name because policies are an open set with no fixed
195
+ # vocabulary: a store may not have one called "Terms of Service", and
196
+ # then there is nothing to snapshot rather than something to guess at.
197
+ def consent_policies
198
+ store.policies.with_matching_name(Spree.t(:terms_of_service)).to_a
199
+ end
200
+
201
+ def link_order
202
+ return unless order
203
+
204
+ adopt_addresses
205
+ assign_order_to(customer)
206
+ end
207
+
208
+ # The order's addresses become the new account's defaults — but only
209
+ # unowned ones: an address already in another customer's address book
210
+ # must not be re-homed onto the new account.
211
+ # update_columns because the order is already placed and the address
212
+ # already validated — re-running validations here could reject a
213
+ # linkage the checkout accepted.
214
+ def adopt_addresses
215
+ addresses = { bill_address_id: order.bill_address, ship_address_id: order.ship_address }.
216
+ select { |_, address| address.present? && address.owner_id.nil? }
217
+ return if addresses.empty?
218
+
219
+ addresses.values.uniq.each do |address|
220
+ address.update_columns(owner_type: Spree.customer_class.to_s, owner_id: customer.id, updated_at: Time.current)
221
+ end
222
+
223
+ customer.update_columns(addresses.transform_values(&:id).merge(updated_at: Time.current))
224
+ end
225
+
226
+ # Only the customer link is written. Deliberately NOT
227
+ # Order#associate_customer! — that backfills the cart's missing
228
+ # addresses from the customer's address book, which on an order the
229
+ # buyer already placed would rewrite historical data. The event is
230
+ # published by hand for the same reason Carts::Associate does it:
231
+ # update_columns bypasses callbacks.
232
+ def assign_order_to(account)
233
+ order.update_columns(customer_id: account.id, updated_at: Time.current)
234
+ order.customer = account
235
+ order.publish_event("#{order.event_prefix}.updated")
236
+ end
237
+
238
+ # Someone who subscribed to the newsletter before registering gets their
239
+ # subscription linked to the new account, with verified opt-in carried
240
+ # over. Best-effort by design — see Spree::Newsletter::LinkUser.
241
+ def link_newsletter_subscriber
242
+ subscriber = Spree::NewsletterSubscriber.find_by(email: customer.email, store: store)
243
+ Spree::Newsletter::LinkUser.new(subscriber: subscriber, user: customer).call
244
+ end
245
+ end
246
+ end
247
+ end
@@ -0,0 +1,165 @@
1
+ module Spree
2
+ module DataRequests
3
+ # Carries out a data subject request: builds and attaches the export for
4
+ # an access request, runs the anonymizer for an erasure request.
5
+ #
6
+ # In the workflow tier for its hooks — a host app that must include data
7
+ # Spree does not model (a loyalty ledger, a support-ticket history) adds
8
+ # it to the payload here, and that is the only place where the shape of a
9
+ # subject access response can be completed.
10
+ #
11
+ # Marking a request `failed` is the caller's job, not this flow's: see
12
+ # {Spree::DataRequests::ProcessJob}. A workflow cannot rescue around its
13
+ # own steps, because FailureSignal and Halted descend from Exception and
14
+ # rescuing swallows the result the caller is waiting for.
15
+ class Fulfill < Spree::Workflow
16
+ hooks :before_fulfill, :extend_payload, :after_fulfill
17
+
18
+ # Builds the payload for a request, hook included.
19
+ #
20
+ # Exposed as a class method because the admin export renders inline for a
21
+ # staffer who is waiting, rather than going through the queued flow — and
22
+ # an Art. 15 response assembled without the extension point would omit
23
+ # exactly the host-app data the hook exists to attach. Both paths build
24
+ # the same document.
25
+ #
26
+ # @param data_request [Spree::DataRequest]
27
+ # @return [Hash]
28
+ def self.payload_for(data_request)
29
+ new.send(:export_payload, data_request)
30
+ end
31
+
32
+
33
+ # @param data_request [Spree::DataRequest]
34
+ # @return [Spree::ServiceModule::Result] the fulfilled request
35
+ def perform(data_request:)
36
+ super
37
+
38
+ step :ensure_pending
39
+ step :mark_processing
40
+
41
+ run_hooks :before_fulfill
42
+
43
+ step :fulfill_request
44
+ step :mark_completed
45
+
46
+ run_hooks :after_fulfill
47
+
48
+ success(data_request.reload)
49
+ end
50
+
51
+ private
52
+
53
+ def ensure_pending
54
+ return if data_request.pending?
55
+
56
+ failure(data_request, Spree.t('data_request_errors.not_pending'))
57
+ end
58
+
59
+ def mark_processing
60
+ data_request.update!(status: 'processing')
61
+ end
62
+
63
+ def fulfill_request
64
+ data_request.access? ? build_export : erase_customer
65
+ end
66
+
67
+ def build_export
68
+ customer = data_request.customer
69
+
70
+ # An erasure can land while this sits in the queue. Answering now would
71
+ # write a file into private storage for someone who asked to be
72
+ # forgotten — redacted, and behind a token the erasure already cleared,
73
+ # so nobody could open it, but a file about them all the same and a
74
+ # request they can never collect. Refusing says what happened.
75
+ #
76
+ # Read and attach under the customer's row lock, which is the same lock
77
+ # the erasure takes: checking without it leaves a window where the
78
+ # anonymizer starts after the check and finishes its attachment scan
79
+ # before this attaches, stranding a full personal-data file it will
80
+ # never see.
81
+ return attach_export unless customer
82
+
83
+ refused = false
84
+
85
+ customer.with_lock do
86
+ if customer.reload.anonymized?
87
+ refused = true
88
+ else
89
+ attach_export
90
+ end
91
+ end
92
+
93
+ return unless refused
94
+
95
+ failure(data_request, Spree.t('data_request_errors.already_anonymized'))
96
+ end
97
+
98
+ def attach_export
99
+ payload = export_payload(data_request)
100
+
101
+ data_request.export_file.attach(
102
+ io: StringIO.new(JSON.pretty_generate(payload)),
103
+ filename: "#{data_request.number.downcase}.json",
104
+ content_type: 'application/json'
105
+ )
106
+ data_request.expires_at = Spree::DataRequest::DEFAULT_EXPIRY.from_now
107
+ end
108
+
109
+ # The document itself.
110
+ #
111
+ # Binds `data_request` through the workflow's own argument mechanism, so
112
+ # a hook handler reads the same `workflow.data_request` it does in the
113
+ # queued flow rather than a reader that happens to exist.
114
+ #
115
+ # @param request [Spree::DataRequest]
116
+ # @return [Hash]
117
+ def export_payload(request)
118
+ @data_request = request
119
+ self.class.define_argument_readers([:data_request])
120
+
121
+ payload = Spree.customer_data_export_service.new(
122
+ customer: request.customer,
123
+ store: request.store
124
+ ).call
125
+
126
+ # The extension point for data Spree does not model. Handlers return a
127
+ # hash, which run_hooks deep-merges — so a host app adds its own keys
128
+ # without being able to silently drop Spree's.
129
+ payload.deep_merge(run_hooks(:extend_payload).presence || {})
130
+ end
131
+
132
+ def erase_customer
133
+ customer = data_request.customer
134
+
135
+ # Already erased is the outcome this request asked for, however it came
136
+ # about — staff may have run it while this job sat in the queue, or the
137
+ # person may have asked twice. Recording that as a failure would leave
138
+ # someone whose data IS gone holding a failed request, and a failed
139
+ # request is what stops them opening another.
140
+ return if customer.anonymized?
141
+
142
+ result = Spree.customer_anonymize_workflow.call(
143
+ customer: customer,
144
+ store: data_request.store,
145
+ requested_by: data_request.requested_by
146
+ )
147
+
148
+ return if result.success?
149
+
150
+ # The erasure can also be refused because a concurrent one claimed the
151
+ # account after the check above — the two are not distinguishable from
152
+ # the refusal itself, so the state is what answers. Only a person who
153
+ # is still identified represents a request this flow failed to serve.
154
+ return if customer.reload.anonymized?
155
+
156
+ failure(data_request, result.error.to_s)
157
+ end
158
+
159
+ def mark_completed
160
+ data_request.update!(status: 'completed', completed_at: Time.current)
161
+ data_request.publish_event('data_request.completed')
162
+ end
163
+ end
164
+ end
165
+ end
@@ -0,0 +1,96 @@
1
+ module Spree
2
+ module Deliveries
3
+ # Records what the carrier says about one consignment in flight.
4
+ #
5
+ # This is the carrier axis: it never moves the owner backwards and never
6
+ # contradicts the merchant. A parcel that bounces or is damaged shows up
7
+ # here as `return_to_sender` or `failure` while the fulfillment still
8
+ # says `fulfilled` — the merchant did hand it over. The one status that
9
+ # crosses over is `delivered`: when every delivery of a fulfillment has
10
+ # arrived, the fulfillment is marked delivered through
11
+ # Spree::Fulfillments::MarkDelivered. A Return owner never transitions —
12
+ # goods arriving is not goods inspected, and Spree::Returns::Receive stays
13
+ # a staff act; anything that wants to react hangs on
14
+ # +after_update_tracking+.
15
+ #
16
+ # Providers call this from their webhook handlers, so it accepts the
17
+ # already-normalized vocabulary rather than any carrier's raw payload:
18
+ # translating a provider's status names is the provider gem's job.
19
+ class UpdateTracking < Spree::Workflow
20
+ hooks :validate, :after_update_tracking
21
+
22
+ # @param delivery [Spree::Delivery] the consignment being tracked
23
+ # @param tracking_status [String, nil] one of {Spree::Delivery::STATUSES}
24
+ # @param estimated_delivery_at [Time, nil] carrier's current estimate
25
+ # @param delivered_at [Time, nil] when the carrier says it arrived; used
26
+ # only when +tracking_status+ is `delivered`, defaulting to now
27
+ # @param details [Hash, nil] provider payload worth keeping — scan events,
28
+ # the signature, the failure reason
29
+ # @param notify_customer [Boolean] passed through to MarkDelivered when
30
+ # this update completes the fulfillment's delivery
31
+ # @return [Spree::ServiceModule::Result] the updated delivery on success
32
+ def perform(delivery:, tracking_status: nil, estimated_delivery_at: nil, delivered_at: nil,
33
+ details: nil, notify_customer: true)
34
+ super
35
+
36
+ run_hooks :validate
37
+
38
+ step :ensure_known_status
39
+ step :apply_carrier_report
40
+ step :roll_up_owner_delivery
41
+
42
+ run_hooks :after_update_tracking
43
+ success(delivery.reload)
44
+ end
45
+
46
+ private
47
+
48
+ def ensure_known_status
49
+ return if tracking_status.blank?
50
+ return if Spree::Delivery::STATUSES.include?(tracking_status.to_s)
51
+
52
+ failure(delivery, Spree.t('fulfillments.errors.unknown_tracking_status', status: tracking_status))
53
+ end
54
+
55
+ # Overwrite rather than accumulate: this axis answers "where is it now",
56
+ # and carriers resend the whole picture on every update. Only attributes
57
+ # the caller actually supplied are touched, so a webhook carrying just a
58
+ # scan does not wipe an estimate from an earlier one.
59
+ def apply_carrier_report
60
+ attributes = {}
61
+ attributes[:status] = tracking_status.to_s if tracking_status.present?
62
+ attributes[:estimated_delivery_at] = estimated_delivery_at unless estimated_delivery_at.nil?
63
+ attributes[:details] = details unless details.nil?
64
+ attributes[:delivered_at] = delivered_at || delivery.delivered_at || Time.current if reported_delivered?
65
+
66
+ return if attributes.empty?
67
+
68
+ # update_columns, deliberately: carrier scans arrive many times per
69
+ # parcel, and a lifecycle event per scan would run the full order
70
+ # status rollup for writes that cannot change any status. The
71
+ # after_update_tracking hook and the fulfillment.delivered event are
72
+ # the notification surface for this axis.
73
+ delivery.update_columns(attributes.merge(updated_at: Time.current))
74
+ end
75
+
76
+ # Arrival is the one carrier report that is also a merchant fact, so it
77
+ # crosses over to the fulfillment's status — once every consignment has
78
+ # arrived. A Return owner never transitions: goods coming back is not
79
+ # goods inspected.
80
+ def roll_up_owner_delivery
81
+ owner = delivery.owner
82
+ return unless owner.is_a?(Spree::Fulfillment)
83
+
84
+ result = Spree.fulfillment_recalculate_delivery_service.call(
85
+ fulfillment: owner, notify_customer: notify_customer
86
+ )
87
+
88
+ failure(delivery, result.error.to_s) if result.failure?
89
+ end
90
+
91
+ def reported_delivered?
92
+ tracking_status.to_s == 'delivered'
93
+ end
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,38 @@
1
+ module Spree
2
+ module Exchanges
3
+ class Approve < Spree::Workflow
4
+ hooks :validate, :after_approve
5
+
6
+ # @param exchange [Spree::Exchange]
7
+ # @param approver [Object, nil]
8
+ def perform(exchange:, approver: nil)
9
+ super
10
+
11
+ step :ensure_approvable
12
+ run_hooks :validate
13
+
14
+ ApplicationRecord.transaction do
15
+ step :mark_approved
16
+ end
17
+
18
+ run_hooks :after_approve
19
+ exchange.publish_event('exchange.approved')
20
+ success(exchange.reload)
21
+ end
22
+
23
+ private
24
+
25
+ def ensure_approvable
26
+ failure(exchange, :not_requested) unless exchange.requested?
27
+ end
28
+
29
+ def mark_approved
30
+ exchange.update!(
31
+ status: 'approved',
32
+ approved_at: Time.current,
33
+ created_by: exchange.created_by || approver
34
+ )
35
+ end
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,40 @@
1
+ module Spree
2
+ module Exchanges
3
+ # Withdraws an exchange before the goods arrive. Once received, the
4
+ # merchant holds the customer's items and must either fulfill the
5
+ # replacement or refund.
6
+ class Cancel < Spree::Workflow
7
+ hooks :validate, :after_cancel
8
+
9
+ # @param exchange [Spree::Exchange]
10
+ # @param reason [String, nil]
11
+ def perform(exchange:, reason: nil)
12
+ super
13
+
14
+ step :ensure_cancellable
15
+ run_hooks :validate
16
+
17
+ ApplicationRecord.transaction do
18
+ step :mark_canceled
19
+ end
20
+
21
+ run_hooks :after_cancel
22
+ exchange.publish_event('exchange.canceled')
23
+ success(exchange.reload)
24
+ end
25
+
26
+ private
27
+
28
+ def ensure_cancellable
29
+ return if exchange.requested? || exchange.approved?
30
+
31
+ failure(exchange, :not_cancellable)
32
+ end
33
+
34
+ def mark_canceled
35
+ memo = [exchange.memo, reason].compact_blank.join("\n")
36
+ exchange.update!(status: 'canceled', canceled_at: Time.current, memo: memo.presence)
37
+ end
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,90 @@
1
+ module Spree
2
+ module Exchanges
3
+ # Opens an exchange request: items coming back, and what should go out
4
+ # in their place.
5
+ class Create < Spree::Workflow
6
+ hooks :validate, :after_create
7
+
8
+ attr_reader :exchange
9
+
10
+ # @param order [Spree::Order]
11
+ # @param items [Array<Hash>] `[{ fulfillment_item:, new_variant:, quantity: }]`
12
+ # @param stock_location [Spree::StockLocation, nil]
13
+ # @param reason [Spree::ReturnReason, nil]
14
+ # @param memo [String, nil]
15
+ # @param created_by [Object, nil] nil for customer self-service
16
+ def perform(order:, items:, stock_location: nil, reason: nil, memo: nil, created_by: nil)
17
+ super
18
+
19
+ step :ensure_exchangeable
20
+ step :normalize_items
21
+ run_hooks :validate
22
+
23
+ ApplicationRecord.transaction do
24
+ step :build_exchange
25
+ end
26
+
27
+ run_hooks :after_create
28
+ exchange.publish_event('exchange.requested')
29
+ success(exchange.reload)
30
+ end
31
+
32
+ private
33
+
34
+ def ensure_exchangeable
35
+ failure(order, :order_not_completed) unless order.completed?
36
+ failure(order, :order_canceled) if order.canceled?
37
+ failure(order, :no_items_to_exchange) if items.blank?
38
+ end
39
+
40
+ def normalize_items
41
+ @normalized_items = items.map do |item|
42
+ fulfillment_item = item[:fulfillment_item]
43
+ new_variant = item[:new_variant]
44
+ quantity = item[:quantity].to_i
45
+
46
+ failure(order, :invalid_quantity) unless quantity.positive?
47
+ failure(order, :item_not_on_order) unless fulfillment_item&.order_id == order.id
48
+ failure(order, :replacement_required) if new_variant.blank?
49
+
50
+ # A replacement nobody can ship is not an exchange the merchant can
51
+ # honour — catch it now rather than at fulfillment time.
52
+ unless new_variant.purchasable?
53
+ failure(order, "#{new_variant.name} is not available")
54
+ end
55
+
56
+ { fulfillment_item: fulfillment_item, new_variant: new_variant, quantity: quantity }
57
+ end
58
+ end
59
+
60
+ def build_exchange
61
+ @exchange = order.exchanges.new(
62
+ store: order.store,
63
+ stock_location: stock_location || default_stock_location,
64
+ reason: reason,
65
+ memo: memo,
66
+ created_by: created_by,
67
+ status: Spree::Exchange.default_status
68
+ )
69
+
70
+ @normalized_items.each do |item|
71
+ fulfillment_item = item[:fulfillment_item]
72
+ @exchange.exchange_line_items.build(
73
+ fulfillment_item: fulfillment_item,
74
+ line_item: fulfillment_item.line_item,
75
+ original_variant: fulfillment_item.variant,
76
+ new_variant: item[:new_variant],
77
+ quantity: item[:quantity]
78
+ )
79
+ end
80
+
81
+ failure(@exchange) unless @exchange.save
82
+ end
83
+
84
+ def default_stock_location
85
+ @normalized_items.first[:fulfillment_item].fulfillment&.stock_location ||
86
+ order.store.stock_locations.first
87
+ end
88
+ end
89
+ end
90
+ end