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
@@ -10,65 +10,230 @@ module Spree
10
10
  @currency = order.currency
11
11
  end
12
12
 
13
- def shipping_rates(package, shipping_method_filter = ShippingMethod::DISPLAY_ON_FRONT_END)
14
- rates = calculate_shipping_rates(package, shipping_method_filter)
15
- choose_default_shipping_rate(rates)
16
- sort_shipping_rates(rates)
13
+ # @param package [Spree::Stock::Package]
14
+ # @param audience [Symbol] {Spree::DeliveryMethod::STOREFRONT} (default)
15
+ # or {Spree::DeliveryMethod::BACKOFFICE}
16
+ # @return [Array<Spree::DeliveryRate>]
17
+ def delivery_rates(package, audience = DeliveryMethod::STOREFRONT)
18
+ rates = calculate_delivery_rates(package, audience)
19
+ choose_default_delivery_rate(rates)
20
+ sort_delivery_rates(rates)
21
+ end
22
+
23
+ # Whether any delivery method is eligible to carry this package — the
24
+ # same eligibility a rate refresh applies, stopping short of asking any
25
+ # rate provider for a price. Allocation reads it to prefer an origin
26
+ # whose methods can actually reach the destination, so it must never
27
+ # cost a carrier API call.
28
+ #
29
+ # @param package [Spree::Stock::Package]
30
+ # @param audience [Symbol] {Spree::DeliveryMethod::STOREFRONT} (default)
31
+ # or {Spree::DeliveryMethod::BACKOFFICE}
32
+ # @return [Boolean]
33
+ def deliverable?(package, audience = DeliveryMethod::STOREFRONT)
34
+ delivery_methods(package, audience).any?
35
+ end
36
+
37
+ # @deprecated Use {#delivery_rates}; removed in 6.1.
38
+ def shipping_rates(package, audience = DeliveryMethod::STOREFRONT)
39
+ Spree::Deprecation.warn('Spree::Stock::Estimator#shipping_rates is deprecated and will be removed in Spree 6.1. Use #delivery_rates instead.')
40
+ delivery_rates(package, audience)
17
41
  end
18
42
 
19
43
  private
20
44
 
21
- def choose_default_shipping_rate(shipping_rates)
22
- unless shipping_rates.empty?
23
- shipping_rates.min_by(&:cost).selected = true
45
+ # Shipping is what "delivery" means unless someone chooses otherwise, so
46
+ # the cheapest *shipped* rate wins by default. Picking the cheapest of
47
+ # all rates handed every order to free store pickup the moment a pickup
48
+ # method existed. Profiles offering nothing shipped (pickup-only,
49
+ # digital) still get their cheapest rate.
50
+ def choose_default_delivery_rate(delivery_rates)
51
+ return if delivery_rates.empty?
52
+
53
+ shipped = delivery_rates.select { |rate| rate.delivery_method&.requires_address? }
54
+ candidates = shipped.presence || delivery_rates
55
+ # An unpriced rate costs zero, so preselecting on price alone would
56
+ # hand every mixed offering to freight. Prefer something actually
57
+ # priced; fall back to freight when that is all there is.
58
+ priced = candidates.reject(&:unpriced?)
59
+ (priced.presence || candidates).min_by(&:cost).selected = true
60
+ end
61
+
62
+ # Cheapest first, with unpriced rates after the priced ones — their zero
63
+ # cost is an absence of information, not a bargain.
64
+ def sort_delivery_rates(delivery_rates)
65
+ delivery_rates.sort_by! { |rate| [rate.unpriced? ? 1 : 0, rate.cost] }
66
+ end
67
+
68
+ # Quoting runs through the method's rate provider — Internal prices
69
+ # through the calculator, carrier providers call their API and may
70
+ # return several estimates (one per carrier service). An empty result
71
+ # suppresses the method, matching the calculator contract. Service
72
+ # filtering, markup, naming, VAT gross-up, tax resolution and sorting
73
+ # stay here so every provider gets them identically.
74
+ def calculate_delivery_rates(package, audience)
75
+ delivery_methods(package, audience).flat_map do |delivery_method|
76
+ provider = delivery_method.rate_provider_instance
77
+
78
+ provider.estimates(package).filter_map do |estimate|
79
+ next unless delivery_method.offers_service?(estimate)
80
+ # A quote in another currency (a USD carrier account under a EUR
81
+ # cart) is unusable — mislabeling it would misprice checkout.
82
+ if estimate.currency.present? && estimate.currency.casecmp(currency) != 0
83
+ Rails.logger.debug { "Spree::Stock::Estimator: dropping #{delivery_method.name} estimate quoted in #{estimate.currency} for a #{currency} order" }
84
+ next
85
+ end
86
+
87
+ service_row = delivery_method.service_for(estimate)
88
+
89
+ delivery_method.delivery_rates.new(
90
+ cost: rate_cost(estimate, delivery_method, service_row, provider),
91
+ tax_rate: (first_tax_rate_for(delivery_method.tax_category) unless estimate.unpriced),
92
+ unpriced: estimate.unpriced,
93
+ name: rate_name(estimate, service_row),
94
+ carrier: estimate.carrier,
95
+ service_level: estimate.service_level,
96
+ estimated_delivery_date: estimate.estimated_delivery_date,
97
+ # presence: rates are rewritten on every refresh, so calculator-
98
+ # priced methods store NULL rather than an empty hash each time.
99
+ metadata: estimate.metadata.presence
100
+ )
101
+ end
24
102
  end
25
103
  end
26
104
 
27
- def sort_shipping_rates(shipping_rates)
28
- shipping_rates.sort_by!(&:cost)
105
+ # An unpriced quote has no amount to mark up or tax — a percentage of an
106
+ # unknown price is still unknown, and rounding zero through the VAT
107
+ # gross-up would only invent a number. Its cost stays zero and every
108
+ # display surface reads +unpriced+ instead.
109
+ def rate_cost(estimate, delivery_method, service_row, provider)
110
+ return 0 if estimate.unpriced
111
+
112
+ cost = apply_markup(estimate.cost, delivery_method, service_row, provider)
113
+ gross_amount(cost, taxation_options_for(delivery_method))
29
114
  end
30
115
 
31
- def calculate_shipping_rates(package, ui_filter)
32
- shipping_methods(package, ui_filter).map do |shipping_method|
33
- cost = shipping_method.calculator.compute(package)
116
+ # Handling fee on top of provider quotes: the service row's values when
117
+ # set, else the method-level defaults. Calculator-priced methods are
118
+ # exempt — their calculator IS the price.
119
+ def apply_markup(cost, delivery_method, service_row, provider)
120
+ return cost if provider.class.uses_calculator?
34
121
 
35
- next unless cost
122
+ percent = service_row&.markup_percent || delivery_method.markup_percent || 0
123
+ flat = service_row&.markup_flat || delivery_method.markup_flat || 0
124
+ (cost * (1 + (percent / 100)) + flat).round(2)
125
+ end
36
126
 
37
- shipping_method.shipping_rates.new(
38
- cost: gross_amount(cost, taxation_options_for(shipping_method)),
39
- tax_rate: first_tax_rate_for(shipping_method.tax_category)
40
- )
41
- end.compact
127
+ # Display name for provider-priced rates: the merchant's label override,
128
+ # else carrier + service from the quote. Nil for calculator rates —
129
+ # DeliveryRate#name falls back to the method name.
130
+ def rate_name(estimate, service_row)
131
+ service_row&.label.presence || estimate.name.presence ||
132
+ [estimate.carrier, estimate.service_level].compact.join(' ').presence
42
133
  end
43
134
 
44
- # Override this if you need the prices for shipping methods to be handled just like the
135
+ # Override this if you need the prices for delivery methods to be handled just like the
45
136
  # prices for products in terms of included tax manipulation.
46
137
  #
47
- def taxation_options_for(shipping_method)
138
+ def taxation_options_for(delivery_method)
48
139
  {
49
- tax_category: shipping_method.tax_category,
50
- tax_zone: @order.tax_zone
140
+ tax_category: delivery_method.tax_category,
141
+ address: @order.tax_address,
142
+ country: @order.tax_country,
143
+ market: @order.market
51
144
  }
52
145
  end
53
146
 
54
147
  def first_tax_rate_for(tax_category)
55
- return unless @order.tax_zone && tax_category
148
+ return unless @order.tax_address && tax_category
56
149
 
57
- Spree::TaxRate.for_tax_category(tax_category).
58
- potential_rates_for_zone(@order.tax_zone).first
150
+ scope = Spree::TaxRate.for_tax_category(tax_category).for_address(@order.tax_address)
151
+ scope = scope.for_store(@order.store) if @order.store
152
+ scope.first
59
153
  end
60
154
 
61
- def shipping_methods(package, display_filter)
62
- package.shipping_methods.select do |ship_method|
63
- calculator = ship_method.calculator
155
+ # The eligibility seam: every rate consumer (checkout, routing, cart
156
+ # estimates) filters through here, and host apps override it to add
157
+ # their own rules.
158
+ #
159
+ # Dispatches through the legacy +shipping_methods+ name so overrides
160
+ # written against it keep running until 6.1 — without this, a host
161
+ # override would be silently skipped and checkout could quote rates
162
+ # the host meant to filter out.
163
+ def delivery_methods(package, audience)
164
+ return shipping_methods(package, audience) if overrides_legacy_seam?
64
165
 
65
- ship_method.available_to_display?(display_filter) &&
66
- ship_method.include?(order.ship_address) &&
67
- calculator.available?(package) &&
68
- (calculator.preferences[:currency].blank? ||
69
- calculator.preferences[:currency] == currency)
166
+ filter_delivery_methods(package, audience)
167
+ end
168
+
169
+ # @deprecated Call or override {#delivery_methods}; removed in 6.1.
170
+ # Only reached when a caller uses the old name directly — the override
171
+ # dispatch above goes straight to the override's own definition.
172
+ def shipping_methods(package, audience)
173
+ Spree::Deprecation.warn('Spree::Stock::Estimator#shipping_methods is deprecated and will be removed in Spree 6.1. Use #delivery_methods instead.')
174
+ filter_delivery_methods(package, audience)
175
+ end
176
+
177
+ def filter_delivery_methods(package, audience)
178
+ methods = package.eligible_delivery_methods
179
+ # Storeless orders exist only in specs; real orders always carry one.
180
+ methods = methods.merge(order.store.delivery_methods) if order.store
181
+
182
+ # On a marketplace, a package's seller is its stock location's, and it
183
+ # is quoted by that seller's own methods plus whatever the operator
184
+ # shares. This is the one place that decision is made
185
+ # (docs/plans/6.0-multi-vendor-marketplace.md, Decision 13).
186
+ package_seller_id = package.stock_location&.seller_id
187
+
188
+ methods.select do |delivery_method|
189
+ offered_to_seller?(delivery_method, package_seller_id) &&
190
+ delivery_method.available_to?(audience) &&
191
+ delivery_method.include?(order.ship_address) &&
192
+ delivery_method.serves_location?(package.stock_location) &&
193
+ delivery_method.eligible_for_package?(package) &&
194
+ calculator_offers?(delivery_method, package)
70
195
  end
71
196
  end
197
+
198
+ # A seller's package is quoted by that seller's own methods plus the
199
+ # marketplace ones the operator shares; a first-party package sees the
200
+ # marketplace's methods only.
201
+ def offered_to_seller?(delivery_method, package_seller_id)
202
+ return delivery_method.seller_id.nil? if package_seller_id.nil?
203
+ return true if delivery_method.seller_id == package_seller_id
204
+
205
+ delivery_method.seller_id.nil? && delivery_method.available_to_sellers?
206
+ end
207
+
208
+ # The calculator's say in eligibility.
209
+ #
210
+ # `available?` is a documented extension point — a host app overrides it
211
+ # to refuse a method for a package — so it applies to every method,
212
+ # however the method is priced.
213
+ #
214
+ # The currency check does not. A provider-priced method carries a
215
+ # calculator the admin hides and nothing reads an amount from, so its
216
+ # leftover currency would silence exactly the methods built for foreign
217
+ # trade: a freight method's default calculator speaks only the default
218
+ # store's currency, and international wholesale is what the freight
219
+ # provider exists for. Provider quotes get their currency check where it
220
+ # belongs, against the estimate itself.
221
+ def calculator_offers?(delivery_method, package)
222
+ calculator = delivery_method.calculator
223
+ return false unless calculator.available?(package)
224
+ return true unless delivery_method.rate_provider_instance.class.uses_calculator?
225
+
226
+ calculator.supports_currency?(currency)
227
+ end
228
+
229
+ # True when a subclass or decorator redefined the legacy seam, so its
230
+ # filtering still applies.
231
+ def overrides_legacy_seam?
232
+ return @overrides_legacy_seam if defined?(@overrides_legacy_seam)
233
+
234
+ @overrides_legacy_seam =
235
+ method(:shipping_methods).owner != Spree::Stock::Estimator
236
+ end
72
237
  end
73
238
  end
74
239
  end
@@ -6,6 +6,11 @@ module Spree
6
6
  end
7
7
 
8
8
  def units
9
+ # Same rule as Spree::Fulfillment#set_up_inventory: the item's order_id
10
+ # is a completion-time denormalization, so during checkout it stays nil
11
+ # rather than pointing at whatever order happens to share the cart's
12
+ # id — a stranger's order whose currency and ship address would then
13
+ # stand in for the customer's.
9
14
  @order.line_items.map do |line_item|
10
15
  # They go through multiple splits, avoid loading the
11
16
  # association to order until needed.
@@ -14,7 +19,7 @@ module Spree
14
19
  line_item_id: line_item.id,
15
20
  variant_id: line_item.variant_id,
16
21
  quantity: line_item.quantity,
17
- order_id: @order.id
22
+ order_id: @order.is_a?(Spree::Order) ? @order.id : nil
18
23
  )
19
24
  end
20
25
  end
@@ -2,17 +2,50 @@ module Spree
2
2
  module Stock
3
3
  class Package
4
4
  attr_reader :stock_location, :contents
5
- attr_accessor :shipping_rates
5
+ attr_accessor :delivery_rates
6
+ # The cart or order this package is being quoted for. Every builder sets
7
+ # it — a fulfillment, the allocator for a proposal — so the package takes
8
+ # its currency, store and destination from the real record instead of
9
+ # {#owner}'s fallback.
10
+ attr_writer :owner
6
11
 
7
12
  def initialize(stock_location, contents = [])
8
13
  @stock_location = stock_location
9
14
  @contents = contents
10
- @shipping_rates = []
15
+ @delivery_rates = []
16
+ end
17
+
18
+ # Who this package is for.
19
+ #
20
+ # Prefers the owner it was built with. The walk to `inventory_unit.order`
21
+ # is only a safety net for packages built by code that sets none, and it
22
+ # answers badly in both directions: a cart's units carry no order_id, so
23
+ # it returns nil and the package has no store or currency of its own,
24
+ # while a unit carrying an order_id from elsewhere returns a stranger's
25
+ # order — whose currency and ship address would stand in for the
26
+ # customer's.
27
+ #
28
+ # @return [Spree::Cart, Spree::Order, nil]
29
+ def owner
30
+ @owner || order
31
+ end
32
+
33
+ # @deprecated Use {#delivery_rates}; removed in 6.1.
34
+ def shipping_rates
35
+ Spree::Deprecation.warn('Spree::Stock::Package#shipping_rates is deprecated and will be removed in Spree 6.1. Use #delivery_rates instead.')
36
+ delivery_rates
37
+ end
38
+
39
+ # @deprecated Use {#delivery_rates=}; removed in 6.1.
40
+ def shipping_rates=(rates)
41
+ Spree::Deprecation.warn('Spree::Stock::Package#shipping_rates= is deprecated and will be removed in Spree 6.1. Use #delivery_rates= instead.')
42
+ self.delivery_rates = rates
11
43
  end
12
44
 
13
45
  def add(inventory_unit, state = :on_hand)
14
46
  # Remove find_item check as already taken care by prioritizer
15
47
  contents << ContentItem.new(inventory_unit, state)
48
+ @freight_summary = nil
16
49
  end
17
50
 
18
51
  def add_multiple(inventory_units, state = :on_hand)
@@ -26,6 +59,7 @@ module Spree
26
59
 
27
60
  def remove_item(item)
28
61
  @contents -= [item]
62
+ @freight_summary = nil
29
63
  end
30
64
 
31
65
  # Fix regression that removed package.order.
@@ -38,8 +72,34 @@ module Spree
38
72
  contents.sum(&:amount)
39
73
  end
40
74
 
75
+ # Content weight plus the tare of the store's default package (the box
76
+ # itself, plus filler). This is the single point every weight consumer
77
+ # reads — calculators, rate providers, weight rules and the weight
78
+ # splitter — so the tare applies everywhere without any of them knowing
79
+ # about it.
41
80
  def weight
42
- contents.sum(&:weight)
81
+ contents.sum(&:weight) + tare
82
+ end
83
+
84
+ # The store's default package dimensions (the box this package ships
85
+ # in), used verbatim by carrier rate providers for dimensional-weight
86
+ # pricing. Item dimensions are deliberately not summed — items don't
87
+ # stack into a box shape. Nil until the store records all three.
88
+ #
89
+ # @return [Hash{Symbol => Float}, nil]
90
+ def dimensions
91
+ default_package_type&.dimensions_in(store_dimensions_unit)
92
+ end
93
+
94
+ # How this package's contents roll up into freight logistics — cartons,
95
+ # pallets, cubic meters, gross weight. Computed live; an order's summary
96
+ # comes from the frozen copy on its selected delivery rate instead.
97
+ #
98
+ # @return [Spree::FreightSummary]
99
+ # Memoized because quoting reads it repeatedly, and dropped whenever the
100
+ # contents change — a stale volume would pick the wrong freight tier.
101
+ def freight_summary
102
+ @freight_summary ||= Spree::FreightSummary.build(contents)
43
103
  end
44
104
 
45
105
  def on_hand
@@ -67,16 +127,37 @@ module Spree
67
127
  end
68
128
 
69
129
  def currency
70
- order.currency
130
+ owner&.currency ||
131
+ contents.filter_map { |item| item.try(:inventory_unit)&.line_item&.currency }.first ||
132
+ Spree::Current.currency
71
133
  end
72
134
 
73
- def shipping_categories
74
- Spree::ShippingCategory.joins(products: :variants_including_master).
75
- where(spree_variants: { id: variant_ids }).distinct
135
+ # The delivery profile every item in this package belongs to.
136
+ # Splitters keep packages profile-homogeneous, so the first item's
137
+ # profile is the package's.
138
+ #
139
+ # @return [Spree::DeliveryProfile, nil]
140
+ def delivery_profile
141
+ contents.first&.variant&.resolved_delivery_profile
76
142
  end
77
143
 
144
+ # Delivery methods eligible to serve this package: exactly the
145
+ # package's profile's methods. Per-product exclusions are
146
+ # DeliveryMethodRules::ExcludedProductsRule, enforced with the other
147
+ # rules in the Estimator's method filter.
148
+ #
149
+ # @return [ActiveRecord::Relation<Spree::DeliveryMethod>]
150
+ def eligible_delivery_methods
151
+ profile = delivery_profile
152
+ return Spree::DeliveryMethod.none if profile.nil?
153
+
154
+ profile.delivery_methods
155
+ end
156
+
157
+ # @deprecated Use {#eligible_delivery_methods}; removed in 6.1.
78
158
  def shipping_methods
79
- shipping_categories.includes(:shipping_methods).map(&:shipping_methods).reduce(:&).to_a
159
+ Spree::Deprecation.warn('Spree::Stock::Package#shipping_methods is deprecated and will be removed in Spree 6.1. Use #eligible_delivery_methods instead.')
160
+ eligible_delivery_methods.to_a
80
161
  end
81
162
 
82
163
  def inspect
@@ -85,21 +166,32 @@ module Spree
85
166
  end.join(' / ')
86
167
  end
87
168
 
88
- def to_shipment
169
+ def to_fulfillment
89
170
  # At this point we should only have one content item per inventory unit
90
171
  # across the entire set of inventory units to be shipped, which has been
91
172
  # taken care of by the Prioritizer
92
- contents.each { |content_item| content_item.inventory_unit.state = content_item.state.to_s }
173
+ contents.each { |content_item| content_item.inventory_unit.status = content_item.state.to_s }
93
174
 
94
- Spree::Shipment.new(
175
+ Spree::Fulfillment.new(
95
176
  stock_location: stock_location,
96
- shipping_rates: shipping_rates,
97
- inventory_units: contents.map(&:inventory_unit)
177
+ delivery_rates: delivery_rates,
178
+ fulfillment_items: contents.map(&:inventory_unit)
98
179
  )
99
180
  end
100
181
 
182
+ # @deprecated Use {#to_fulfillment}; removed in 6.1.
183
+ def to_shipment
184
+ Spree::Deprecation.warn('Spree::Stock::Package#to_shipment is deprecated and will be removed in Spree 6.1. Use #to_fulfillment instead.')
185
+ to_fulfillment
186
+ end
187
+
188
+ # Cubic meters of packed goods — carton volume where the contents
189
+ # declare cartons, unit volume otherwise. Cartons stack, so unlike
190
+ # +dimensions+ this genuinely sums.
191
+ #
192
+ # @return [BigDecimal]
101
193
  def volume
102
- contents.sum(&:volume)
194
+ freight_summary.total_volume
103
195
  end
104
196
 
105
197
  def dimension
@@ -108,6 +200,45 @@ module Spree
108
200
 
109
201
  private
110
202
 
203
+ # The box this package is quoted with: the seller's own, falling back to
204
+ # the marketplace's.
205
+ #
206
+ # A package's seller is its stock location's — the derivation used
207
+ # everywhere else — so a parcel leaving a seller's warehouse takes that
208
+ # seller's tare and dimensions. The fallback keeps checkout whole for a
209
+ # seller who has not recorded a box yet; the `PackageType` onboarding
210
+ # requirement is what asks them to
211
+ # (docs/plans/6.0-seller-package-types.md).
212
+ #
213
+ # @return [Spree::PackageType, nil]
214
+ def default_package_type
215
+ return @default_package_type if defined?(@default_package_type)
216
+
217
+ @default_package_type = stock_location&.seller&.default_package_type ||
218
+ owner&.store&.default_package_type
219
+ end
220
+
221
+ # The box's own weight, converted into the unit the contents are
222
+ # measured in. A merchant may record a carton in kilograms while the
223
+ # store quotes in pounds, and adding those numbers together would
224
+ # understate the tare by more than half.
225
+ #
226
+ # @return [BigDecimal]
227
+ def tare
228
+ package_type = default_package_type
229
+ return 0 if package_type.nil?
230
+
231
+ package_type.weight_in(owner&.store&.preferred_weight_unit || Spree::Measurement::DEFAULT_WEIGHT_UNIT)
232
+ end
233
+
234
+ # What a dimension means to this store, matching the fallback a
235
+ # variant's own dimensions take.
236
+ #
237
+ # @return [String]
238
+ def store_dimensions_unit
239
+ Spree::Variant.store_dimensions_unit(owner&.store)
240
+ end
241
+
111
242
  def variant_ids
112
243
  contents.map { |item| item.inventory_unit.variant_id }.compact.uniq
113
244
  end
@@ -1,12 +1,19 @@
1
1
  module Spree
2
2
  module Stock
3
3
  class Packer
4
- attr_reader :stock_location, :inventory_units, :splitters
4
+ attr_reader :stock_location, :inventory_units, :splitters, :owner
5
5
 
6
- def initialize(stock_location, inventory_units, splitters = [Splitter::Base])
6
+ # @param owner [Spree::Cart, Spree::Order, nil] the purchase being
7
+ # packed. Every package it builds carries this, including the ones
8
+ # splitters derive, because a proposed package's inventory units
9
+ # belong to no order yet — so anything reading the buyer through the
10
+ # package (the packaging tare, the channel and company eligibility
11
+ # rules) would otherwise see nothing.
12
+ def initialize(stock_location, inventory_units, splitters = [Splitter::Base], owner: nil)
7
13
  @stock_location = stock_location
8
14
  @inventory_units = inventory_units
9
15
  @splitters = splitters
16
+ @owner = owner
10
17
  end
11
18
 
12
19
  def packages
@@ -18,7 +25,7 @@ module Spree
18
25
  end
19
26
 
20
27
  def default_package
21
- package = Package.new(stock_location)
28
+ package = build_package
22
29
 
23
30
  # Group by variant_id as grouping by variant fires cached query.
24
31
  inventory_units.index_by(&:variant_id).each do |variant_id, inventory_unit|
@@ -38,6 +45,16 @@ module Spree
38
45
  package
39
46
  end
40
47
 
48
+ # The single point every package this packer emits is born at, so the
49
+ # owner cannot be lost by a splitter that builds its own.
50
+ #
51
+ # @return [Spree::Stock::Package]
52
+ def build_package(contents = [])
53
+ package = Package.new(stock_location, contents)
54
+ package.owner = owner
55
+ package
56
+ end
57
+
41
58
  private
42
59
 
43
60
  def build_splitter
@@ -1,11 +1,18 @@
1
1
  module Spree
2
2
  module Stock
3
3
  class Prioritizer
4
- attr_reader :packages
4
+ attr_reader :packages, :estimator
5
5
 
6
- def initialize(packages, adjuster_class = Adjuster)
6
+ # @param packages [Array<Spree::Stock::Package>] candidate packages, in
7
+ # the order the caller prefers them (routing rank, location order)
8
+ # @param adjuster_class [Class]
9
+ # @param estimator [Spree::Stock::Estimator, nil] consulted for
10
+ # deliverability, so an origin that cannot serve the destination loses
11
+ # to one that can. Omitted, the caller's order stands as given.
12
+ def initialize(packages, adjuster_class = Adjuster, estimator: nil)
7
13
  @packages = packages
8
14
  @adjuster_class = adjuster_class
15
+ @estimator = estimator
9
16
  @adjusters = {}
10
17
  end
11
18
 
@@ -36,8 +43,24 @@ module Spree
36
43
  @adjusters[hash_item item]
37
44
  end
38
45
 
46
+ # Origins that can deliver go first, so the Adjuster fills each unit from
47
+ # one of them and the origins that cannot are left empty and pruned. A
48
+ # profile with per-region origin groups would otherwise allocate to
49
+ # whichever warehouse came first, and when that warehouse's group has no
50
+ # method for the destination the item is dropped as undeliverable even
51
+ # though another warehouse could have shipped it.
52
+ #
53
+ # The caller's order survives within each group, so routing rank and the
54
+ # store's location order still decide between origins that can both
55
+ # deliver.
39
56
  def sort_packages
40
- # order packages by preferred stock_locations
57
+ return if estimator.nil?
58
+
59
+ ranked = packages.each_with_index.sort_by do |package, index|
60
+ [estimator.deliverable?(package) ? 0 : 1, index]
61
+ end
62
+
63
+ packages.replace(ranked.map(&:first))
41
64
  end
42
65
 
43
66
  def prune_packages
@@ -45,7 +68,7 @@ module Spree
45
68
  end
46
69
 
47
70
  def hash_item(item)
48
- shipment = item.inventory_unit.shipment
71
+ shipment = item.inventory_unit.fulfillment
49
72
  variant = item.inventory_unit.variant
50
73
  if shipment.present?
51
74
  variant.hash ^ shipment.hash