spree_core 6.0.0.beta4 → 6.0.0.rc2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (575) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +5 -5
  3. data/app/helpers/spree/images_helper.rb +0 -57
  4. data/app/jobs/spree/base_job.rb +21 -0
  5. data/app/jobs/spree/carts/reap_expired_job.rb +2 -2
  6. data/app/jobs/spree/collections/regenerate_time_based_job.rb +6 -3
  7. data/app/jobs/spree/orders/finalize_stale_drafts_job.rb +8 -5
  8. data/app/jobs/spree/payments/cancel_unused_sessions_job.rb +61 -0
  9. data/app/jobs/spree/search_provider/index_job.rb +4 -0
  10. data/app/jobs/spree/seller_payouts/sweep_seller_job.rb +2 -0
  11. data/app/jobs/spree/uploads/purge_unattached_job.rb +49 -0
  12. data/app/mailers/spree/admin_user_mailer.rb +4 -19
  13. data/app/mailers/spree/base_mailer.rb +97 -13
  14. data/app/mailers/spree/email_template_mailer.rb +27 -0
  15. data/app/mailers/spree/export_mailer.rb +3 -4
  16. data/app/mailers/spree/import_mailer.rb +3 -4
  17. data/app/mailers/spree/invitation_mailer.rb +24 -7
  18. data/app/mailers/spree/seller_user_mailer.rb +4 -16
  19. data/app/mailers/spree/webhook_mailer.rb +2 -2
  20. data/app/models/concerns/spree/acted_by.rb +1 -1
  21. data/app/models/concerns/spree/admin_user_methods.rb +15 -1
  22. data/app/models/concerns/spree/api_typed.rb +91 -0
  23. data/app/models/concerns/spree/calculated_adjustments.rb +41 -13
  24. data/app/models/concerns/spree/calculator/currency_amounts.rb +1 -1
  25. data/app/models/concerns/spree/calculator/tiers.rb +63 -0
  26. data/app/models/concerns/spree/canonical_decimals.rb +61 -0
  27. data/app/models/concerns/spree/customer_methods.rb +23 -18
  28. data/app/models/concerns/spree/derived_number.rb +11 -13
  29. data/app/models/concerns/spree/email_template_identity.rb +52 -0
  30. data/app/models/concerns/spree/parameterizable_name.rb +2 -0
  31. data/app/models/concerns/spree/payment_session_transitions.rb +8 -2
  32. data/app/models/concerns/spree/post_sale/taxation.rb +54 -0
  33. data/app/models/concerns/spree/post_sale/taxed_line.rb +51 -0
  34. data/app/models/concerns/spree/preference_schema/json_schema.rb +139 -0
  35. data/app/models/concerns/spree/preference_schema.rb +62 -32
  36. data/app/models/concerns/spree/product_scopes.rb +16 -2
  37. data/app/models/concerns/spree/provider_listing.rb +41 -0
  38. data/app/models/concerns/spree/publishable.rb +82 -14
  39. data/app/models/concerns/spree/purchase/addresses.rb +23 -10
  40. data/app/models/concerns/spree/purchase/currency.rb +1 -1
  41. data/app/models/concerns/spree/purchase/deprecated_aliases.rb +87 -0
  42. data/app/models/concerns/spree/purchase/gift_cards.rb +10 -4
  43. data/app/models/concerns/spree/purchase/locale.rb +1 -1
  44. data/app/models/concerns/spree/purchase/payment_processing.rb +8 -4
  45. data/app/models/concerns/spree/purchase/purchase_order.rb +9 -4
  46. data/app/models/concerns/spree/purchase/store_credits.rb +36 -1
  47. data/app/models/concerns/spree/purchase/totals.rb +49 -8
  48. data/app/models/concerns/spree/ransackable_attributes.rb +46 -0
  49. data/app/models/concerns/spree/receivable.rb +1 -1
  50. data/app/models/concerns/spree/searchable.rb +0 -4
  51. data/app/models/concerns/spree/secret_preferences.rb +59 -0
  52. data/app/models/concerns/spree/signed_id_attachments.rb +54 -0
  53. data/app/models/concerns/spree/single_store_resource.rb +1 -1
  54. data/app/models/concerns/spree/stores/email_branding.rb +32 -0
  55. data/app/models/concerns/spree/stores/markets.rb +5 -2
  56. data/app/models/concerns/spree/type_labels.rb +38 -0
  57. data/app/models/concerns/spree/typed_adjustment_line.rb +5 -6
  58. data/app/models/concerns/spree/typed_associations.rb +12 -18
  59. data/app/models/concerns/spree/vat_price_calculation.rb +5 -6
  60. data/app/models/spree/address.rb +12 -2
  61. data/app/models/spree/adjusters/largest_remainder.rb +14 -1
  62. data/app/models/spree/adjusters/promotion.rb +4 -19
  63. data/app/models/spree/allowed_origin.rb +3 -1
  64. data/app/models/spree/api_key.rb +5 -6
  65. data/app/models/spree/authentication/strategies/oidc_strategy.rb +5 -5
  66. data/app/models/spree/base.rb +99 -22
  67. data/app/models/spree/calculator/flat_percent_item_total.rb +2 -4
  68. data/app/models/spree/calculator/flat_rate.rb +3 -5
  69. data/app/models/spree/calculator/flexi_rate.rb +4 -6
  70. data/app/models/spree/calculator/percent_on_line_item.rb +2 -2
  71. data/app/models/spree/calculator/price_sack.rb +5 -7
  72. data/app/models/spree/calculator/shipping/digital_delivery.rb +3 -5
  73. data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +7 -7
  74. data/app/models/spree/calculator/shipping/flat_rate.rb +5 -7
  75. data/app/models/spree/calculator/shipping/flexi_rate.rb +4 -6
  76. data/app/models/spree/calculator/shipping/per_item.rb +3 -5
  77. data/app/models/spree/calculator/shipping/price_sack.rb +5 -7
  78. data/app/models/spree/calculator/tiered_flat_rate.rb +7 -24
  79. data/app/models/spree/calculator/tiered_percent.rb +7 -25
  80. data/app/models/spree/cart.rb +78 -18
  81. data/app/models/spree/catalog.rb +1 -0
  82. data/app/models/spree/catalog_price.rb +0 -7
  83. data/app/models/spree/catalog_price_tier.rb +0 -8
  84. data/app/models/spree/category.rb +3 -1
  85. data/app/models/spree/channel/gating.rb +3 -2
  86. data/app/models/spree/channel.rb +6 -4
  87. data/app/models/spree/claim.rb +22 -1
  88. data/app/models/spree/claim_line_item.rb +41 -6
  89. data/app/models/spree/collection.rb +2 -1
  90. data/app/models/spree/collection_rule.rb +5 -21
  91. data/app/models/spree/commission_line.rb +1 -1
  92. data/app/models/spree/commission_rate.rb +7 -4
  93. data/app/models/spree/commission_rate_value.rb +1 -1
  94. data/app/models/spree/commission_rule.rb +4 -11
  95. data/app/models/spree/commission_rules/category_rule.rb +2 -5
  96. data/app/models/spree/commission_rules/item_total_rule.rb +2 -2
  97. data/app/models/spree/commission_rules/product_rule.rb +1 -1
  98. data/app/models/spree/commission_rules/seller_rule.rb +2 -5
  99. data/app/models/spree/company.rb +1 -0
  100. data/app/models/spree/company_invitation.rb +1 -0
  101. data/app/models/spree/consent_record.rb +0 -1
  102. data/app/models/spree/credit_card.rb +1 -1
  103. data/app/models/spree/current.rb +23 -0
  104. data/app/models/spree/custom_field.rb +2 -2
  105. data/app/models/spree/custom_field_definition.rb +20 -35
  106. data/app/models/spree/custom_fields/boolean.rb +1 -1
  107. data/app/models/spree/custom_fields/json.rb +1 -1
  108. data/app/models/spree/customer_group.rb +1 -0
  109. data/app/models/spree/data_feed/google.rb +0 -2
  110. data/app/models/spree/data_request.rb +2 -1
  111. data/app/models/spree/delivery_method.rb +36 -14
  112. data/app/models/spree/delivery_method_rule.rb +4 -11
  113. data/app/models/spree/delivery_method_rules/channel_rule.rb +2 -5
  114. data/app/models/spree/delivery_method_rules/item_total_rule.rb +2 -2
  115. data/app/models/spree/delivery_profile.rb +1 -0
  116. data/app/models/spree/delivery_rate.rb +7 -8
  117. data/app/models/spree/delivery_rate_provider/base.rb +1 -0
  118. data/app/models/spree/delivery_zone.rb +1 -2
  119. data/app/models/spree/delivery_zone_member.rb +4 -4
  120. data/app/models/spree/digital_asset.rb +7 -0
  121. data/app/models/spree/digital_asset_provider/base.rb +2 -0
  122. data/app/models/spree/digital_link.rb +2 -5
  123. data/app/models/spree/discount.rb +1 -1
  124. data/app/models/spree/email_template.rb +25 -0
  125. data/app/models/spree/email_template_draft.rb +13 -0
  126. data/app/models/spree/email_template_revision.rb +17 -0
  127. data/app/models/spree/email_templates/entry.rb +118 -0
  128. data/app/models/spree/email_templates/sample_record.rb +16 -0
  129. data/app/models/spree/emails/branding.rb +80 -0
  130. data/app/models/spree/exchange.rb +16 -1
  131. data/app/models/spree/exchange_line_item.rb +121 -5
  132. data/app/models/spree/export.rb +0 -1
  133. data/app/models/spree/exports/products.rb +10 -1
  134. data/app/models/spree/exports/report.rb +3 -3
  135. data/app/models/spree/fee.rb +4 -2
  136. data/app/models/spree/file_upload.rb +155 -0
  137. data/app/models/spree/fulfillment.rb +66 -30
  138. data/app/models/spree/fulfillment_changer.rb +2 -2
  139. data/app/models/spree/fulfillment_group.rb +6 -1
  140. data/app/models/spree/fulfillment_item.rb +0 -4
  141. data/app/models/spree/fulfillment_provider/base.rb +1 -0
  142. data/app/models/spree/gateway/bogus.rb +6 -0
  143. data/app/models/spree/gateway/custom_payment_source_method.rb +5 -0
  144. data/app/models/spree/gateway.rb +6 -2
  145. data/app/models/spree/gift_card.rb +18 -8
  146. data/app/models/spree/gift_card_batch.rb +3 -5
  147. data/app/models/spree/import.rb +5 -7
  148. data/app/models/spree/import_mapping.rb +1 -2
  149. data/app/models/spree/import_row.rb +2 -2
  150. data/app/models/spree/import_schemas/products.rb +1 -0
  151. data/app/models/spree/integration.rb +9 -19
  152. data/app/models/spree/invitation.rb +5 -5
  153. data/app/models/spree/line_item.rb +15 -4
  154. data/app/models/spree/locale.rb +11 -8
  155. data/app/models/spree/market.rb +8 -2
  156. data/app/models/spree/media.rb +1 -9
  157. data/app/models/spree/newsletter_subscriber.rb +4 -0
  158. data/app/models/spree/option_type.rb +2 -1
  159. data/app/models/spree/option_value.rb +2 -1
  160. data/app/models/spree/order.rb +60 -142
  161. data/app/models/spree/order_group.rb +18 -4
  162. data/app/models/spree/order_inventory.rb +10 -5
  163. data/app/models/spree/order_promotion.rb +1 -1
  164. data/app/models/spree/order_routing/has_strategy_preference.rb +1 -1
  165. data/app/models/spree/order_routing/strategy/base.rb +4 -2
  166. data/app/models/spree/order_routing/strategy/rules.rb +1 -1
  167. data/app/models/spree/order_routing_rule.rb +6 -22
  168. data/app/models/spree/package_type.rb +2 -2
  169. data/app/models/spree/payment/gateway_options.rb +15 -53
  170. data/app/models/spree/payment/processing.rb +2 -4
  171. data/app/models/spree/payment.rb +21 -13
  172. data/app/models/spree/payment_method/check.rb +2 -0
  173. data/app/models/spree/payment_method/session_instrumentation.rb +1 -0
  174. data/app/models/spree/payment_method/store_credit.rb +15 -13
  175. data/app/models/spree/payment_method.rb +78 -6
  176. data/app/models/spree/payment_session.rb +5 -1
  177. data/app/models/spree/payment_setup_session.rb +1 -0
  178. data/app/models/spree/payout_provider/base.rb +3 -1
  179. data/app/models/spree/pickup_point_provider/base.rb +2 -0
  180. data/app/models/spree/policy.rb +1 -0
  181. data/app/models/spree/price.rb +17 -14
  182. data/app/models/spree/price_adjustment_tier.rb +4 -0
  183. data/app/models/spree/price_list.rb +14 -9
  184. data/app/models/spree/price_rules/channel_rule.rb +3 -6
  185. data/app/models/spree/price_rules/customer_group_rule.rb +3 -6
  186. data/app/models/spree/price_rules/market_rule.rb +2 -5
  187. data/app/models/spree/price_rules/user_rule.rb +1 -3
  188. data/app/models/spree/product/channels.rb +9 -2
  189. data/app/models/spree/product.rb +54 -30
  190. data/app/models/spree/product_submission.rb +0 -12
  191. data/app/models/spree/product_type.rb +1 -1
  192. data/app/models/spree/promotion/actions/create_line_items.rb +28 -18
  193. data/app/models/spree/promotion/rules/category.rb +1 -5
  194. data/app/models/spree/promotion/rules/channel.rb +2 -9
  195. data/app/models/spree/promotion/rules/country.rb +3 -8
  196. data/app/models/spree/promotion/rules/currency.rb +1 -5
  197. data/app/models/spree/promotion/rules/customer_group.rb +2 -9
  198. data/app/models/spree/promotion/rules/first_order.rb +0 -4
  199. data/app/models/spree/promotion/rules/item_total.rb +6 -10
  200. data/app/models/spree/promotion/rules/market.rb +2 -9
  201. data/app/models/spree/promotion/rules/one_use_per_user.rb +0 -4
  202. data/app/models/spree/promotion/rules/option_value.rb +2 -6
  203. data/app/models/spree/promotion/rules/product.rb +1 -5
  204. data/app/models/spree/promotion/rules/user.rb +0 -4
  205. data/app/models/spree/promotion/rules/user_logged_in.rb +0 -4
  206. data/app/models/spree/promotion.rb +36 -6
  207. data/app/models/spree/promotion_action.rb +7 -14
  208. data/app/models/spree/promotion_action_line_item.rb +1 -1
  209. data/app/models/spree/promotion_handler/coupon.rb +59 -27
  210. data/app/models/spree/promotion_rule.rb +7 -14
  211. data/app/models/spree/purchase_order.rb +3 -0
  212. data/app/models/spree/quantity_rule.rb +1 -1
  213. data/app/models/spree/refund.rb +41 -18
  214. data/app/models/spree/return.rb +31 -2
  215. data/app/models/spree/return_line_item.rb +65 -14
  216. data/app/models/spree/role.rb +7 -7
  217. data/app/models/spree/saved_report.rb +2 -1
  218. data/app/models/spree/search_provider/base.rb +4 -0
  219. data/app/models/spree/seller.rb +10 -2
  220. data/app/models/spree/seller_payout.rb +8 -0
  221. data/app/models/spree/seller_requirement.rb +5 -12
  222. data/app/models/spree/seller_requirement_custom_field.rb +1 -2
  223. data/app/models/spree/seller_requirement_submission.rb +3 -2
  224. data/app/models/spree/seller_requirements/accept_terms.rb +2 -3
  225. data/app/models/spree/seller_transfer.rb +6 -0
  226. data/app/models/spree/shipping_label.rb +2 -0
  227. data/app/models/spree/stock/availability_validator.rb +2 -2
  228. data/app/models/spree/stock/estimator.rb +1 -1
  229. data/app/models/spree/stock/inventory_unit_builder.rb +1 -1
  230. data/app/models/spree/stock/packer.rb +2 -2
  231. data/app/models/spree/stock/splitter/weight.rb +1 -1
  232. data/app/models/spree/stock_level/custom_events.rb +6 -0
  233. data/app/models/spree/stock_level.rb +3 -1
  234. data/app/models/spree/stock_location.rb +1 -0
  235. data/app/models/spree/stock_movement.rb +1 -1
  236. data/app/models/spree/stock_receipt_item.rb +1 -1
  237. data/app/models/spree/stock_reservation.rb +2 -2
  238. data/app/models/spree/stock_transfer.rb +6 -2
  239. data/app/models/spree/store.rb +70 -19
  240. data/app/models/spree/store_credit.rb +13 -13
  241. data/app/models/spree/store_credit_event.rb +5 -5
  242. data/app/models/spree/supplier.rb +1 -0
  243. data/app/models/spree/tax_category.rb +1 -0
  244. data/app/models/spree/tax_exemption_certificate.rb +3 -0
  245. data/app/models/spree/tax_identifier.rb +3 -1
  246. data/app/models/spree/tax_line.rb +53 -3
  247. data/app/models/spree/tax_provider/base.rb +71 -14
  248. data/app/models/spree/tax_provider/internal.rb +70 -41
  249. data/app/models/spree/tax_provider/recorded_share.rb +114 -0
  250. data/app/models/spree/tax_rate.rb +30 -8
  251. data/app/models/spree/taxon.rb +1 -1
  252. data/app/models/spree/taxonomy.rb +0 -1
  253. data/app/models/spree/update_status.rb +25 -0
  254. data/app/models/spree/variant.rb +10 -12
  255. data/app/models/spree/variant_media.rb +1 -1
  256. data/app/models/spree/webhook_delivery.rb +1 -0
  257. data/app/models/spree/webhook_endpoint.rb +46 -13
  258. data/app/models/spree/wishlist.rb +1 -6
  259. data/app/models/spree/wishlist_item/custom_events.rb +6 -0
  260. data/app/presenters/spree/csv/customer_presenter.rb +1 -1
  261. data/app/presenters/spree/csv/newsletter_subscriber_presenter.rb +1 -1
  262. data/app/presenters/spree/csv/order_line_item_presenter.rb +10 -6
  263. data/app/presenters/spree/csv/price_list_price_presenter.rb +3 -8
  264. data/app/presenters/spree/csv/product_variant_presenter.rb +59 -20
  265. data/app/presenters/spree/csv/purchase_order_item_presenter.rb +1 -3
  266. data/app/serializers/spree/emails/base_serializer.rb +14 -0
  267. data/app/serializers/spree/emails/export_serializer.rb +13 -0
  268. data/app/serializers/spree/emails/import_serializer.rb +19 -0
  269. data/app/serializers/spree/emails/invitation_serializer.rb +28 -0
  270. data/app/serializers/spree/emails/store_serializer.rb +31 -0
  271. data/app/serializers/spree/emails/user_serializer.rb +12 -0
  272. data/app/serializers/spree/emails/webhook_endpoint_serializer.rb +16 -0
  273. data/app/services/spree/carts/create.rb +8 -2
  274. data/app/services/spree/carts/destroy.rb +2 -2
  275. data/app/services/spree/carts/remove_out_of_stock_items.rb +2 -2
  276. data/app/services/spree/carts/split_by_seller.rb +1 -1
  277. data/app/services/spree/carts/update.rb +22 -8
  278. data/app/services/spree/catalogs/set_product_terms.rb +1 -1
  279. data/app/services/spree/categories/add_products.rb +13 -31
  280. data/app/services/spree/categories/remove_products.rb +12 -51
  281. data/app/services/spree/checkout/advance.rb +1 -4
  282. data/app/services/spree/collections/add_products.rb +10 -23
  283. data/app/services/spree/collections/remove_products.rb +7 -43
  284. data/app/services/spree/coupon_codes/bulk_generate.rb +8 -14
  285. data/app/services/spree/data_requests/create.rb +1 -1
  286. data/app/services/spree/deliveries/destroy.rb +2 -2
  287. data/app/services/spree/email_templates/check.rb +58 -0
  288. data/app/services/spree/email_templates/no_sample_record.rb +7 -0
  289. data/app/services/spree/email_templates/preview.rb +99 -0
  290. data/app/services/spree/emails/file_system.rb +23 -0
  291. data/app/services/spree/emails/filters.rb +84 -0
  292. data/app/services/spree/emails/liquid_context.rb +48 -0
  293. data/app/services/spree/emails/rendered_email.rb +14 -0
  294. data/app/services/spree/emails/renderer.rb +125 -0
  295. data/app/services/spree/emails/template.rb +51 -0
  296. data/app/services/spree/emails/template_data.rb +23 -0
  297. data/app/services/spree/emails/template_resolver.rb +109 -0
  298. data/app/services/spree/emails/text_converter.rb +72 -0
  299. data/app/services/spree/emails/translation_inliner.rb +134 -0
  300. data/app/services/spree/imports/row_processors/price_list_price.rb +10 -10
  301. data/app/services/spree/imports/row_processors/product_variant.rb +77 -34
  302. data/app/services/spree/imports/row_processors/purchase_order.rb +13 -13
  303. data/app/services/spree/locales.rb +43 -10
  304. data/app/services/spree/newsletter/subscribe.rb +8 -12
  305. data/app/services/spree/orders/build_fulfillments.rb +3 -2
  306. data/app/services/spree/orders/create.rb +5 -4
  307. data/app/services/spree/orders/discounts/create.rb +14 -11
  308. data/app/services/spree/orders/discounts/destroy.rb +1 -0
  309. data/app/services/spree/orders/discounts/update.rb +1 -0
  310. data/app/services/spree/orders/fees/create.rb +1 -0
  311. data/app/services/spree/orders/fees/destroy.rb +1 -0
  312. data/app/services/spree/orders/fees/update.rb +1 -0
  313. data/app/services/spree/orders/remove_line_item.rb +13 -3
  314. data/app/services/spree/orders/update.rb +10 -6
  315. data/app/services/spree/orders/update_item.rb +6 -3
  316. data/app/services/spree/orders/update_statuses.rb +3 -1
  317. data/app/services/spree/prices/bulk_upsert.rb +32 -25
  318. data/app/services/spree/product_memberships.rb +61 -0
  319. data/app/services/spree/returns/eligibility_validator.rb +1 -1
  320. data/app/services/spree/search_provider/custom_field_schema.rb +2 -2
  321. data/app/services/spree/seeds/commission_rates.rb +1 -1
  322. data/app/services/spree/seeds/digital_delivery.rb +1 -1
  323. data/app/services/spree/seeds/payment_methods.rb +2 -2
  324. data/app/services/spree/seeds/saved_reports.rb +3 -3
  325. data/app/services/spree/seeds/stores.rb +1 -1
  326. data/app/services/spree/sellers/requirements.rb +1 -2
  327. data/app/services/spree/shipping_labels/confirm_refund.rb +1 -1
  328. data/app/services/spree/shipping_labels/store_file.rb +3 -3
  329. data/app/services/spree/stock_levels/correct.rb +3 -3
  330. data/app/services/spree/stock_reservations/reserve.rb +2 -3
  331. data/app/services/spree/store_credits/apply.rb +15 -13
  332. data/app/services/spree/stores/provision_defaults.rb +23 -25
  333. data/app/services/spree/update_check.rb +160 -0
  334. data/app/services/spree/uploads/assign_stores.rb +92 -0
  335. data/app/subscribers/spree/seller_onboarding_subscriber.rb +1 -1
  336. data/app/validators/spree/attachment_content_type_validator.rb +19 -2
  337. data/app/validators/spree/locale_codes_validator.rb +22 -0
  338. data/app/views/layouts/spree/base_mailer.html.erb +2 -43
  339. data/app/views/layouts/spree/base_mailer.liquid +79 -0
  340. data/app/views/spree/admin_user_mailer/password_reset_email.liquid +14 -0
  341. data/app/views/spree/export_mailer/export_done.liquid +12 -0
  342. data/app/views/spree/import_mailer/import_done.liquid +15 -0
  343. data/app/views/spree/invitation_mailer/invitation_accepted.liquid +9 -0
  344. data/app/views/spree/invitation_mailer/invitation_email.liquid +13 -0
  345. data/app/views/spree/seller_user_mailer/password_reset_email.liquid +14 -0
  346. data/app/views/spree/shared/_mailer_button.html.erb +4 -5
  347. data/app/views/spree/shared/_mailer_hero.html.erb +6 -5
  348. data/app/views/spree/shared/_summary_row.liquid +8 -0
  349. data/app/views/spree/webhook_mailer/endpoint_disabled.liquid +21 -0
  350. data/app/workflows/spree/carts/add_item.rb +4 -4
  351. data/app/workflows/spree/carts/complete.rb +13 -3
  352. data/app/workflows/spree/carts/merge.rb +1 -1
  353. data/app/workflows/spree/carts/recalculate_totals.rb +5 -0
  354. data/app/workflows/spree/carts/upsert_items.rb +18 -9
  355. data/app/workflows/spree/claims/approve.rb +5 -22
  356. data/app/workflows/spree/claims/cancel.rb +5 -21
  357. data/app/workflows/spree/claims/create.rb +15 -0
  358. data/app/workflows/spree/claims/deny.rb +7 -0
  359. data/app/workflows/spree/claims/resolve.rb +34 -31
  360. data/app/workflows/spree/customers/anonymize.rb +3 -4
  361. data/app/workflows/spree/customers/create.rb +1 -1
  362. data/app/workflows/spree/data_requests/fulfill.rb +2 -2
  363. data/app/workflows/spree/deliveries/update_tracking.rb +1 -1
  364. data/app/workflows/spree/email_templates/discard_draft.rb +20 -0
  365. data/app/workflows/spree/email_templates/publish.rb +70 -0
  366. data/app/workflows/spree/email_templates/restore_revision.rb +33 -0
  367. data/app/workflows/spree/email_templates/revert.rb +29 -0
  368. data/app/workflows/spree/email_templates/save_draft.rb +85 -0
  369. data/app/workflows/spree/exchanges/approve.rb +5 -22
  370. data/app/workflows/spree/exchanges/cancel.rb +5 -21
  371. data/app/workflows/spree/exchanges/create.rb +6 -0
  372. data/app/workflows/spree/exchanges/fulfill.rb +75 -51
  373. data/app/workflows/spree/exchanges/receive.rb +6 -65
  374. data/app/workflows/spree/fulfillments/cancel.rb +1 -1
  375. data/app/workflows/spree/fulfillments/create.rb +53 -49
  376. data/app/workflows/spree/fulfillments/fulfill.rb +23 -27
  377. data/app/workflows/spree/fulfillments/mark_delivered.rb +1 -1
  378. data/app/workflows/spree/fulfillments/replacements.rb +59 -0
  379. data/app/workflows/spree/gift_cards/apply.rb +2 -2
  380. data/app/workflows/spree/orders/add_item.rb +5 -1
  381. data/app/workflows/spree/orders/cancel.rb +3 -3
  382. data/app/workflows/spree/orders/complete.rb +16 -8
  383. data/app/workflows/spree/payments/capture.rb +20 -5
  384. data/app/workflows/spree/payments/process.rb +5 -3
  385. data/app/workflows/spree/post_sale/approval.rb +35 -0
  386. data/app/workflows/spree/post_sale/cancellation.rb +44 -0
  387. data/app/workflows/spree/post_sale/receipt.rb +92 -0
  388. data/app/workflows/spree/price_lists/update.rb +4 -4
  389. data/app/workflows/spree/products/nested_attributes.rb +1 -1
  390. data/app/workflows/spree/purchase_orders/cancel.rb +1 -1
  391. data/app/workflows/spree/purchase_orders/close.rb +3 -31
  392. data/app/workflows/spree/purchase_orders/create.rb +3 -1
  393. data/app/workflows/spree/purchase_orders/mark_draft.rb +2 -2
  394. data/app/workflows/spree/purchase_orders/mark_ordered.rb +2 -2
  395. data/app/workflows/spree/purchase_orders/receive.rb +1 -1
  396. data/app/workflows/spree/purchase_orders/update.rb +5 -34
  397. data/app/workflows/spree/receivables/closing_short.rb +46 -0
  398. data/app/workflows/spree/receivables/draft_editing.rb +48 -0
  399. data/app/workflows/spree/refunds/create.rb +5 -2
  400. data/app/workflows/spree/refunds/order_payments.rb +14 -2
  401. data/app/workflows/spree/refunds/tax_credit.rb +67 -0
  402. data/app/workflows/spree/returns/approve.rb +5 -22
  403. data/app/workflows/spree/returns/cancel.rb +5 -22
  404. data/app/workflows/spree/returns/create.rb +8 -0
  405. data/app/workflows/spree/returns/receive.rb +5 -76
  406. data/app/workflows/spree/returns/refund.rb +31 -8
  407. data/app/workflows/spree/seller_requirement_submissions/create.rb +1 -2
  408. data/app/workflows/spree/seller_transfers/reverse.rb +28 -1
  409. data/app/workflows/spree/shipping_labels/purchase.rb +8 -8
  410. data/app/workflows/spree/shipping_labels/record.rb +7 -7
  411. data/app/workflows/spree/shipping_labels/refund.rb +2 -2
  412. data/app/workflows/spree/stock_receipts/recording.rb +4 -4
  413. data/app/workflows/spree/stock_transfers/cancel.rb +2 -2
  414. data/app/workflows/spree/stock_transfers/close.rb +3 -30
  415. data/app/workflows/spree/stock_transfers/create.rb +3 -1
  416. data/app/workflows/spree/stock_transfers/mark_draft.rb +1 -1
  417. data/app/workflows/spree/stock_transfers/mark_in_transit.rb +3 -3
  418. data/app/workflows/spree/stock_transfers/mark_ready.rb +2 -2
  419. data/app/workflows/spree/stock_transfers/receive.rb +1 -1
  420. data/app/workflows/spree/stock_transfers/update.rb +5 -33
  421. data/config/currency_exponents.json +180 -0
  422. data/config/i18n-tasks.yml +32 -18
  423. data/config/initializers/alba.rb +7 -0
  424. data/config/language_names.csv +264 -0
  425. data/config/locales/ar.yml +811 -0
  426. data/config/locales/be.yml +855 -0
  427. data/config/locales/bg.yml +723 -0
  428. data/config/locales/ca.yml +689 -0
  429. data/config/locales/content_locales.rb +9 -0
  430. data/config/locales/cs.yml +855 -0
  431. data/config/locales/da.yml +771 -0
  432. data/config/locales/de-CH.yml +248 -0
  433. data/config/locales/de.yml +835 -0
  434. data/config/locales/el.yml +769 -0
  435. data/config/locales/en.yml +47 -505
  436. data/config/locales/es-CL.yml +301 -0
  437. data/config/locales/es-EC.yml +186 -0
  438. data/config/locales/es-MX.yml +334 -0
  439. data/config/locales/es.yml +831 -0
  440. data/config/locales/et.yml +644 -0
  441. data/config/locales/fa.yml +709 -0
  442. data/config/locales/fi.yml +771 -0
  443. data/config/locales/fr.yml +830 -0
  444. data/config/locales/hu.yml +751 -0
  445. data/config/locales/id.yml +756 -0
  446. data/config/locales/it.yml +833 -0
  447. data/config/locales/ja.yml +726 -0
  448. data/config/locales/km.yml +759 -0
  449. data/config/locales/ko.yml +575 -0
  450. data/config/locales/ku.yml +753 -0
  451. data/config/locales/lt.yml +821 -0
  452. data/config/locales/lv.yml +685 -0
  453. data/config/locales/nb.yml +824 -0
  454. data/config/locales/ne.yml +823 -0
  455. data/config/locales/nl.yml +826 -0
  456. data/config/locales/pl.yml +835 -0
  457. data/config/locales/pt-BR.yml +547 -0
  458. data/config/locales/pt.yml +636 -0
  459. data/config/locales/ro.yml +750 -0
  460. data/config/locales/ru.yml +834 -0
  461. data/config/locales/sk.yml +680 -0
  462. data/config/locales/sl-SI.yml +600 -0
  463. data/config/locales/sv.yml +827 -0
  464. data/config/locales/th.yml +745 -0
  465. data/config/locales/tr.yml +777 -0
  466. data/config/locales/uk.yml +836 -0
  467. data/config/locales/vi.yml +768 -0
  468. data/config/locales/zh-CN.yml +786 -0
  469. data/config/locales/zh-TW.yml +834 -0
  470. data/db/migrate/20260925000001_add_replacement_to_spree_fulfillment_items.rb +5 -0
  471. data/db/migrate/20261001000001_add_post_sale_tax.rb +30 -0
  472. data/db/migrate/20261001000001_convert_preferences_to_json.rb +166 -0
  473. data/db/migrate/20261001000001_create_spree_email_templates.rb +52 -0
  474. data/db/migrate/20261009000001_change_money_columns_to_decimal_19_4.rb +116 -0
  475. data/db/migrate/20261010000001_add_store_id_to_active_storage_blobs.rb +12 -0
  476. data/lib/generators/spree/dummy/dummy_generator.rb +0 -9
  477. data/lib/generators/spree/dummy/templates/rails/test.rb +26 -0
  478. data/lib/spree/checkout/default_requirements.rb +37 -13
  479. data/lib/spree/core/configuration.rb +19 -1
  480. data/lib/spree/core/controller_helpers/store.rb +1 -1
  481. data/lib/spree/core/dependencies.rb +5 -4
  482. data/lib/spree/core/emails/escaped_output.rb +60 -0
  483. data/lib/spree/core/engine.rb +72 -165
  484. data/lib/spree/core/permissions/default_catalog.rb +5 -0
  485. data/lib/spree/core/preferences/invalid_preferences.rb +18 -0
  486. data/lib/spree/core/preferences/json_conversion.rb +186 -0
  487. data/lib/spree/core/preferences/masking.rb +55 -2
  488. data/lib/spree/core/preferences/preferable.rb +343 -103
  489. data/lib/spree/core/preferences/preferable_class_methods.rb +188 -136
  490. data/lib/spree/core/previews/import_preview.rb +10 -0
  491. data/lib/spree/core/ransack_configuration.rb +13 -2
  492. data/lib/spree/core/tax/provider_error.rb +37 -0
  493. data/lib/spree/core/version.rb +1 -1
  494. data/lib/spree/core.rb +91 -373
  495. data/lib/spree/emails/editable_templates.rb +82 -0
  496. data/lib/spree/events/catalog.rb +189 -0
  497. data/lib/spree/events.rb +21 -1
  498. data/lib/spree/hooks.rb +0 -17
  499. data/lib/spree/i18n.rb +32 -15
  500. data/lib/spree/iso_data.rb +7 -0
  501. data/lib/spree/localized_number.rb +6 -0
  502. data/lib/spree/migrations.rb +4 -1
  503. data/lib/spree/money.rb +196 -15
  504. data/lib/spree/reporting/adapters/base.rb +7 -6
  505. data/lib/spree/reporting/adapters/live.rb +6 -6
  506. data/lib/spree/reporting/default_vocabulary.rb +22 -10
  507. data/lib/spree/reporting/hydration.rb +1 -1
  508. data/lib/spree/reporting/query.rb +8 -0
  509. data/lib/spree/reporting/registry.rb +13 -0
  510. data/lib/spree/reporting/schema.rb +10 -10
  511. data/lib/spree/testing_support/editable_email_templates.rb +61 -0
  512. data/lib/spree/testing_support/emails.rb +22 -0
  513. data/lib/spree/testing_support/factories/cart_factory.rb +1 -1
  514. data/lib/spree/testing_support/factories/email_template_factory.rb +28 -0
  515. data/lib/spree/testing_support/factories/order_factory.rb +2 -2
  516. data/lib/spree/testing_support/factories/product_factory.rb +9 -0
  517. data/lib/spree/testing_support/factories/refund_factory.rb +1 -1
  518. data/lib/spree/testing_support/factories/stock_factory.rb +1 -1
  519. data/lib/spree/testing_support/factories/variant_factory.rb +1 -1
  520. data/lib/spree/testing_support/i18n.rb +3 -94
  521. data/lib/spree/testing_support/lifecycle_events.rb +1 -1
  522. data/lib/spree/testing_support/order_walkthrough.rb +1 -1
  523. data/lib/spree/testing_support/preferences.rb +0 -5
  524. data/lib/spree/testing_support/store.rb +9 -1
  525. data/lib/spree/upgrades/5_6_to_6_0/manifest.yml +67 -1
  526. data/lib/spree/uploads.rb +101 -0
  527. data/lib/tasks/categories_and_collections.rake +3 -3
  528. data/lib/tasks/core.rake +6 -4
  529. data/lib/tasks/markets.rake +2 -1
  530. data/lib/tasks/media.rake +3 -3
  531. data/lib/tasks/migrate_users_to_customers.rake +23 -18
  532. data/lib/tasks/money.rake +46 -0
  533. data/lib/tasks/package_types.rake +1 -1
  534. data/lib/tasks/preferences_json.rake +101 -0
  535. data/lib/tasks/seller_sample_data.rake +2 -2
  536. data/lib/tasks/store_settings.rake +13 -6
  537. data/lib/tasks/typed_adjustments_migration.rake +1 -1
  538. data/lib/tasks/uploads.rake +19 -0
  539. data/spec/fixtures/mailer_views/custom_views_probe_mailer/welcome_email.html.erb +4 -0
  540. metadata +219 -46
  541. data/app/jobs/spree/products/touch_categories_job.rb +0 -15
  542. data/app/jobs/spree/products/touch_taxons_job.rb +0 -13
  543. data/app/models/acts_as_taggable_on/tag_decorator.rb +0 -10
  544. data/app/models/concerns/spree/has_image_alt_text.rb +0 -18
  545. data/app/models/spree/base_analytics_event_handler.rb +0 -54
  546. data/app/models/spree/invitations/store.rb +0 -6
  547. data/app/models/spree/preference.rb +0 -14
  548. data/app/models/spree/promotion_handler/page.rb +0 -25
  549. data/app/models/spree/promotion_handler/promotion_duplicator.rb +0 -60
  550. data/app/models/spree/stock/differentiator.rb +0 -45
  551. data/app/presenters/spree/filters/options_presenter.rb +0 -47
  552. data/app/services/spree/carts/empty.rb +0 -42
  553. data/app/services/spree/country_to_timezone.rb +0 -273
  554. data/app/services/spree/payments/create.rb +0 -92
  555. data/app/validators/spree/url_validator.rb +0 -23
  556. data/app/views/active_storage/blobs/_blob.html.erb +0 -14
  557. data/app/views/spree/admin_user_mailer/password_reset_email.html.erb +0 -8
  558. data/app/views/spree/export_mailer/export_done.html.erb +0 -7
  559. data/app/views/spree/import_mailer/import_done.html.erb +0 -12
  560. data/app/views/spree/invitation_mailer/invitation_accepted.html.erb +0 -4
  561. data/app/views/spree/invitation_mailer/invitation_email.html.erb +0 -12
  562. data/app/views/spree/seller_user_mailer/password_reset_email.html.erb +0 -8
  563. data/app/views/spree/shared/_base_mailer_footer.html.erb +0 -19
  564. data/app/views/spree/shared/_base_mailer_header.html.erb +0 -8
  565. data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +0 -399
  566. data/app/views/spree/shared/_mailer_logo.html.erb +0 -41
  567. data/app/views/spree/shared/_purchased_items_styles.html.erb +0 -119
  568. data/app/views/spree/webhook_mailer/endpoint_disabled.html.erb +0 -51
  569. data/app/views/spree/webhook_mailer/endpoint_disabled.text.erb +0 -10
  570. data/app/workflows/spree/fulfillments/purchase_label.rb +0 -40
  571. data/app/workflows/spree/returns/purchase_label.rb +0 -32
  572. data/lib/spree/analytics.rb +0 -11
  573. data/lib/spree/core/preferences/scoped_store.rb +0 -34
  574. data/lib/spree/core/preferences/store.rb +0 -105
  575. data/lib/spree/translation_migrations.rb +0 -52
data/lib/spree/core.rb CHANGED
@@ -1,4 +1,3 @@
1
- require 'ostruct'
2
1
  require 'action_controller/railtie'
3
2
  require 'action_view/railtie'
4
3
  require 'active_job/railtie'
@@ -12,17 +11,24 @@ require 'action_mailer/railtie'
12
11
 
13
12
 
14
13
  require 'acts_as_list'
14
+ require 'alba'
15
15
  require 'acts-as-taggable-on'
16
16
  require 'awesome_nested_set'
17
17
  require 'cancan'
18
18
  require 'countries/global'
19
19
  require 'friendly_id'
20
+ require 'json_schemer'
20
21
  require 'jwt'
22
+ require 'liquid'
23
+ require 'spree/core/emails/escaped_output'
21
24
  require 'monetize'
22
25
  require 'mobility'
26
+ require 'mrml'
23
27
  require 'name_of_person'
24
28
  require 'nokogiri'
29
+ require 'oj'
25
30
  require 'rails-html-sanitizer'
31
+ require 'rails-i18n'
26
32
  require 'paranoia'
27
33
  require 'request_store'
28
34
  require 'ransack'
@@ -53,21 +59,29 @@ module Spree
53
59
  ActiveRecord::Base.connection.adapter_name.match?(/mysql|trilogy/i)
54
60
  end
55
61
 
62
+ # Class settings hold a name rather than the class itself, so a reloaded
63
+ # class is never served stale.
64
+ def self.resolve_class_setting(name, value, constantize)
65
+ raise "Spree.#{name} MUST be a String or Symbol object, not a Class object." if value.is_a?(Class)
66
+ return unless value.is_a?(String) || value.is_a?(Symbol)
67
+
68
+ constantize ? value.to_s.constantize : value.to_s
69
+ end
70
+ private_class_method :resolve_class_setting
71
+
72
+ def self.storage_service_name(value)
73
+ return Rails.application.config.active_storage.service unless value
74
+
75
+ value.to_sym if value.is_a?(String) || value.is_a?(Symbol)
76
+ end
77
+ private_class_method :storage_service_name
78
+
56
79
  def self.base_class(constantize: true)
57
- @@base_class ||= 'Spree::Base'
58
- if @@base_class.is_a?(Class)
59
- raise 'Spree.base_class MUST be a String or Symbol object, not a Class object.'
60
- elsif @@base_class.is_a?(String) || @@base_class.is_a?(Symbol)
61
- constantize ? @@base_class.to_s.constantize : @@base_class.to_s
62
- end
80
+ resolve_class_setting(:base_class, @@base_class ||= 'Spree::Base', constantize)
63
81
  end
64
82
 
65
83
  def self.customer_class(constantize: true)
66
- if @@customer_class.is_a?(Class)
67
- raise 'Spree.customer_class MUST be a String or Symbol object, not a Class object.'
68
- elsif @@customer_class.is_a?(String) || @@customer_class.is_a?(Symbol)
69
- constantize ? @@customer_class.to_s.constantize : @@customer_class.to_s
70
- end
84
+ resolve_class_setting(:customer_class, @@customer_class, constantize)
71
85
  end
72
86
 
73
87
  # @deprecated Spree.user_class was renamed to Spree.customer_class in 6.0; removed in 6.1.
@@ -83,39 +97,19 @@ module Spree
83
97
  end
84
98
 
85
99
  def self.admin_user_class(constantize: true)
86
- if @@admin_user_class.is_a?(Class)
87
- raise 'Spree.admin_user_class MUST be a String or Symbol object, not a Class object.'
88
- elsif @@admin_user_class.is_a?(String) || @@admin_user_class.is_a?(Symbol)
89
- constantize ? @@admin_user_class.to_s.constantize : @@admin_user_class.to_s
90
- end
100
+ resolve_class_setting(:admin_user_class, @@admin_user_class, constantize)
91
101
  end
92
102
 
93
103
  def self.private_storage_service_name
94
- if @@private_storage_service_name
95
- if @@private_storage_service_name.is_a?(String) || @@private_storage_service_name.is_a?(Symbol)
96
- @@private_storage_service_name.to_sym
97
- end
98
- else
99
- Rails.application.config.active_storage.service
100
- end
104
+ storage_service_name(@@private_storage_service_name)
101
105
  end
102
106
 
103
107
  def self.public_storage_service_name
104
- if @@public_storage_service_name
105
- if @@public_storage_service_name.is_a?(String) || @@public_storage_service_name.is_a?(Symbol)
106
- @@public_storage_service_name.to_sym
107
- end
108
- else
109
- Rails.application.config.active_storage.service
110
- end
111
- end
112
-
113
- def self.root_domain
114
- @@root_domain
108
+ storage_service_name(@@public_storage_service_name)
115
109
  end
116
110
 
117
111
  def self.queues
118
- @@queues ||= OpenStruct.new(
112
+ @@queues ||= ActiveSupport::OrderedOptions.new.update(
119
113
  default: :default,
120
114
  events: :default,
121
115
  exports: :default,
@@ -147,7 +141,7 @@ module Spree
147
141
 
148
142
  # @deprecated Renamed with the stock level rename in 6.0; removed in 6.1.
149
143
  #
150
- # The writer matters as much as the reader here: this is an OpenStruct, so
144
+ # The writer matters as much as the reader here: these are ordered options, so
151
145
  # an existing initializer assigning the old name would quietly define a
152
146
  # field nobody reads and its jobs would fall back to the default queue.
153
147
  queues.define_singleton_method(:stock_location_stock_items) do
@@ -206,17 +200,7 @@ module Spree
206
200
  # @param constantize [Boolean] whether to return the class or the string
207
201
  # @return [Class, String] the adapter class or its name
208
202
  def self.events_adapter_class(constantize: true)
209
- @@events_adapter_class ||= 'Spree::Events::Adapters::ActiveSupportNotifications'
210
-
211
- if @@events_adapter_class.is_a?(Class)
212
- raise 'Spree.events_adapter_class MUST be a String or Symbol object, not a Class object.'
213
- elsif @@events_adapter_class.is_a?(String) || @@events_adapter_class.is_a?(Symbol)
214
- constantize ? @@events_adapter_class.to_s.constantize : @@events_adapter_class.to_s
215
- end
216
- end
217
-
218
- def self.google_places_api_key
219
- @@google_places_api_key
203
+ resolve_class_setting(:events_adapter_class, @@events_adapter_class ||= 'Spree::Events::Adapters::ActiveSupportNotifications', constantize)
220
204
  end
221
205
 
222
206
  def self.always_use_translations?
@@ -239,20 +223,12 @@ module Spree
239
223
  ->(locale) { locale.name == Spree::Current.content_locale }
240
224
  end
241
225
 
242
- # Stable anonymous identifier for this Spree installation. Generated once,
243
- # persisted in the preferences store and reused afterwards. It identifies the
244
- # installation only
226
+ # Stable anonymous identifier for this Spree installation, kept on the
227
+ # default store, which generates it when it is first saved.
245
228
  #
246
- # Deliberately not memoized: the persisted preference is the single source
247
- # of truth, so processes that race to generate the first value converge on
248
- # the winning row at the next read instead of each holding a different id
249
- # for their lifetime.
250
- #
251
- # @return [String] UUID
229
+ # @return [String, nil] UUID, or nil before the default store exists
252
230
  def self.install_id
253
- store = Spree::Preferences::Store.instance
254
- store.get('spree/install_id') { nil }.presence ||
255
- SecureRandom.uuid.tap { |id| store.set('spree/install_id', id) }
231
+ Spree::Store.default&.preferred_install_id
256
232
  end
257
233
 
258
234
  # Used to configure Spree.
@@ -276,7 +252,7 @@ module Spree
276
252
  # Example:
277
253
  #
278
254
  # Spree.dependencies do |dependency|
279
- # dependency.cart_add_item_service = MyCustomAddToCart
255
+ # dependency.cart_add_item_workflow = MyCustomAddToCart
280
256
  # end
281
257
  #
282
258
  # This method is defined within the core gem on purpose.
@@ -285,41 +261,24 @@ module Spree
285
261
  yield(Spree::Dependencies)
286
262
  end
287
263
 
264
+ def self.spree_config
265
+ Rails.application.config.spree
266
+ end
267
+ private_class_method :spree_config
268
+
288
269
  # Environment accessors for easier configuration access
289
270
  # Instead of Rails.application.config.spree.payment_methods
290
271
  # you can use Spree.payment_methods
291
272
 
292
- def self.calculators
293
- Rails.application.config.spree.calculators
294
- end
295
-
296
- def self.calculators=(value)
297
- Rails.application.config.spree.calculators = value
298
- end
299
-
300
- def self.validators
301
- Rails.application.config.spree.validators
302
- end
303
-
304
- def self.validators=(value)
305
- Rails.application.config.spree.validators = value
306
- end
307
-
308
- def self.payment_methods
309
- Rails.application.config.spree.payment_methods
310
- end
311
-
312
- def self.payment_methods=(value)
313
- Rails.application.config.spree.payment_methods = value
314
- end
315
-
316
- def self.adjusters
317
- Rails.application.config.spree.adjusters
318
- end
319
-
320
- def self.adjusters=(value)
321
- Rails.application.config.spree.adjusters = value
322
- end
273
+ singleton_class.delegate :calculators, :calculators=, :validators, :validators=, :payment_methods, :payment_methods=,
274
+ :adjusters, :adjusters=, :fulfillment_providers, :fulfillment_providers=, :tracking_carriers,
275
+ :tracking_carriers=, :stock_splitters, :stock_splitters=, :delivery_method_rules,
276
+ :delivery_method_rules=, :order_routing, :order_routing=, :promotions, :promotions=,
277
+ :line_item_comparison_hooks, :line_item_comparison_hooks=, :data_feed_types, :data_feed_types=,
278
+ :export_types, :export_types=, :import_types, :import_types=, :taxon_rules, :taxon_rules=,
279
+ :translatable_resources, :translatable_resources=, :custom_fields, :integrations, :integrations=,
280
+ :pricing, :pricing=,
281
+ to: :spree_config
323
282
 
324
283
  # Model names a {Spree::Media} row may be placed on — where a file *lives*.
325
284
  # The viewable column is polymorphic, so this is what keeps it from accepting
@@ -331,13 +290,7 @@ module Spree
331
290
  # Spree.media_viewable_types += ['MyApp::Lookbook']
332
291
  #
333
292
  # @return [Array<String>]
334
- def self.media_viewable_types
335
- Rails.application.config.spree.media_viewable_types
336
- end
337
-
338
- def self.media_viewable_types=(value)
339
- Rails.application.config.spree.media_viewable_types = value
340
- end
293
+ singleton_class.delegate :media_viewable_types, :media_viewable_types=, to: :spree_config
341
294
 
342
295
  # The tax engine used when a market names none — the fallback behind
343
296
  # {Spree::Purchase::Taxation#tax_provider}, which is what call sites actually
@@ -366,60 +319,30 @@ module Spree
366
319
  # name and finding out at checkout.
367
320
  #
368
321
  # @return [Array<Class>]
369
- def self.tax_providers
370
- Rails.application.config.spree.tax_providers
371
- end
372
-
373
- def self.tax_providers=(value)
374
- Rails.application.config.spree.tax_providers = value
375
- end
322
+ singleton_class.delegate :tax_providers, :tax_providers=, to: :spree_config
376
323
 
377
324
  # Pricing engines a store can be pointed at. Connector gems append their own,
378
325
  # so a merchant picks from what is actually installed.
379
326
  #
380
327
  # @return [Array<Class>]
381
- def self.pricing_providers
382
- Rails.application.config.spree.pricing_providers
383
- end
384
-
385
- def self.pricing_providers=(value)
386
- Rails.application.config.spree.pricing_providers = value
387
- end
328
+ singleton_class.delegate :pricing_providers, :pricing_providers=, to: :spree_config
388
329
 
389
330
  # Inventory sources a store can be pointed at.
390
331
  #
391
332
  # @return [Array<Class>]
392
- def self.inventory_providers
393
- Rails.application.config.spree.inventory_providers
394
- end
395
-
396
- def self.inventory_providers=(value)
397
- Rails.application.config.spree.inventory_providers = value
398
- end
333
+ singleton_class.delegate :inventory_providers, :inventory_providers=, to: :spree_config
399
334
 
400
335
  # How sellers get paid. Core ships {Spree::PayoutProvider::System}, which
401
336
  # keeps the books and leaves the operator to settle; a provider gem appends
402
337
  # one that moves the money itself.
403
338
  #
404
339
  # @return [Array<Class>]
405
- def self.payout_providers
406
- Rails.application.config.spree.payout_providers
407
- end
408
-
409
- def self.payout_providers=(value)
410
- Rails.application.config.spree.payout_providers = value
411
- end
340
+ singleton_class.delegate :payout_providers, :payout_providers=, to: :spree_config
412
341
 
413
342
  # The provider a store pays through when it has named none.
414
343
  #
415
344
  # @return [Class]
416
- def self.default_payout_provider
417
- Rails.application.config.spree.default_payout_provider
418
- end
419
-
420
- def self.default_payout_provider=(value)
421
- Rails.application.config.spree.default_payout_provider = value
422
- end
345
+ singleton_class.delegate :default_payout_provider, :default_payout_provider=, to: :spree_config
423
346
 
424
347
  # Validator enforcing the password policy on the default auth models
425
348
  # ({Spree::Customer}, {Spree::AdminUser}). Defaults to
@@ -433,80 +356,30 @@ module Spree
433
356
  # Spree.password_validator = MyApp::PasswordValidator
434
357
  #
435
358
  # @return [Class]
436
- def self.password_validator
437
- Rails.application.config.spree.password_validator
438
- end
439
-
440
- def self.password_validator=(value)
441
- Rails.application.config.spree.password_validator = value
442
- end
359
+ singleton_class.delegate :password_validator, :password_validator=, to: :spree_config
443
360
 
444
- def self.fulfillment_providers
445
- Rails.application.config.spree.fulfillment_providers
446
- end
447
-
448
- def self.fulfillment_providers=(value)
449
- Rails.application.config.spree.fulfillment_providers = value
450
- end
451
-
452
- def self.tracking_carriers
453
- Rails.application.config.spree.tracking_carriers
454
- end
455
-
456
- def self.tracking_carriers=(value)
457
- Rails.application.config.spree.tracking_carriers = value
458
- end
459
-
460
-
461
- def self.stock_splitters
462
- Rails.application.config.spree.stock_splitters
463
- end
464
-
465
- def self.stock_splitters=(value)
466
- Rails.application.config.spree.stock_splitters = value
467
- end
468
361
 
469
362
  # Commission rule kinds selectable on a commission rate.
470
363
  #
471
364
  # @return [Array<Class>]
472
- def self.commission_rules
473
- Rails.application.config.spree.commission_rules
474
- end
475
-
476
- def self.commission_rules=(value)
477
- Rails.application.config.spree.commission_rules = value
478
- end
365
+ singleton_class.delegate :commission_rules, :commission_rules=, to: :spree_config
479
366
 
480
367
  # Seller onboarding requirement kinds an operator can configure
481
368
  # (docs/plans/6.0-seller-onboarding-requirements.md).
482
369
  #
483
370
  # @return [Array<Class>]
484
- def self.seller_requirements
485
- Rails.application.config.spree.seller_requirements
486
- end
487
-
488
- def self.seller_requirements=(value)
489
- Rails.application.config.spree.seller_requirements = value
490
- end
491
-
492
- def self.delivery_method_rules
493
- Rails.application.config.spree.delivery_method_rules
494
- end
495
-
496
- def self.delivery_method_rules=(value)
497
- Rails.application.config.spree.delivery_method_rules = value
498
- end
371
+ singleton_class.delegate :seller_requirements, :seller_requirements=, to: :spree_config
499
372
 
500
373
  # Quoting strategies selectable on a delivery method.
501
374
  #
502
375
  # @return [Array<Class>]
503
- def self.delivery_rate_providers
504
- Rails.application.config.spree.delivery_rate_providers
505
- end
376
+ singleton_class.delegate :delivery_rate_providers, :delivery_rate_providers=, to: :spree_config
506
377
 
507
- def self.delivery_rate_providers=(value)
508
- Rails.application.config.spree.delivery_rate_providers = value
509
- end
378
+ # Third-party pickup point networks selectable on a pickup-point delivery
379
+ # method. Empty in core; carrier gems append theirs.
380
+ #
381
+ # @return [Array<Class>]
382
+ singleton_class.delegate :pickup_point_providers, :pickup_point_providers=, to: :spree_config
510
383
 
511
384
  # Re-resolves every provider registry entry by name, in place.
512
385
  #
@@ -525,7 +398,8 @@ module Spree
525
398
  # @return [void]
526
399
  def self.refresh_provider_registries!
527
400
  [Rails.application.config.spree.delivery_rate_providers,
528
- Rails.application.config.spree.fulfillment_providers].compact.each do |registry|
401
+ Rails.application.config.spree.fulfillment_providers,
402
+ Rails.application.config.spree.pickup_point_providers].compact.each do |registry|
529
403
  registry.map! { |entry| entry.is_a?(Module) && entry.name ? entry.name.constantize : entry }
530
404
  end
531
405
  end
@@ -535,80 +409,12 @@ module Spree
535
409
  # deliverable elsewhere (a licensing system, a code pool).
536
410
  #
537
411
  # @return [Array<Class>]
538
- def self.digital_asset_providers
539
- Rails.application.config.spree.digital_asset_providers
540
- end
541
-
542
- def self.digital_asset_providers=(value)
543
- Rails.application.config.spree.digital_asset_providers = value
544
- end
412
+ singleton_class.delegate :digital_asset_providers, :digital_asset_providers=, to: :spree_config
545
413
 
546
414
  # Fulfillment profile kinds selectable when creating a profile.
547
415
  #
548
416
  # @return [Array<Class>]
549
- def self.delivery_profile_types
550
- Rails.application.config.spree.delivery_profile_types
551
- end
552
-
553
- def self.delivery_profile_types=(value)
554
- Rails.application.config.spree.delivery_profile_types = value
555
- end
556
-
557
- def self.order_routing
558
- Rails.application.config.spree.order_routing
559
- end
560
-
561
- def self.order_routing=(value)
562
- Rails.application.config.spree.order_routing = value
563
- end
564
-
565
- def self.promotions
566
- Rails.application.config.spree.promotions
567
- end
568
-
569
- def self.promotions=(value)
570
- Rails.application.config.spree.promotions = value
571
- end
572
-
573
- def self.line_item_comparison_hooks
574
- Rails.application.config.spree.line_item_comparison_hooks
575
- end
576
-
577
- def self.line_item_comparison_hooks=(value)
578
- Rails.application.config.spree.line_item_comparison_hooks = value
579
- end
580
-
581
- def self.data_feed_types
582
- Rails.application.config.spree.data_feed_types
583
- end
584
-
585
- def self.data_feed_types=(value)
586
- Rails.application.config.spree.data_feed_types = value
587
- end
588
-
589
- def self.export_types
590
- Rails.application.config.spree.export_types
591
- end
592
-
593
- def self.export_types=(value)
594
- Rails.application.config.spree.export_types = value
595
- end
596
-
597
- def self.import_types
598
- Rails.application.config.spree.import_types
599
- end
600
-
601
- def self.import_types=(value)
602
- Rails.application.config.spree.import_types = value
603
- end
604
-
605
- def self.taxon_rules
606
- Rails.application.config.spree.taxon_rules
607
- end
608
-
609
- def self.taxon_rules=(value)
610
- Rails.application.config.spree.taxon_rules = value
611
- end
417
+ singleton_class.delegate :delivery_profile_types, :delivery_profile_types=, to: :spree_config
612
418
 
613
419
  # Class-name strings (`'Spree::Product'`, `'Spree::Order'`,
614
420
  # `Spree.customer_class.to_s`, plus any registered by apps) for resources that
@@ -617,13 +423,7 @@ module Spree
617
423
  # the list in an initializer:
618
424
  #
619
425
  # Spree.taggable_types << 'MyApp::Seller'
620
- def self.taggable_types
621
- Rails.application.config.spree.taggable_types
622
- end
623
-
624
- def self.taggable_types=(value)
625
- Rails.application.config.spree.taggable_types = value
626
- end
426
+ singleton_class.delegate :taggable_types, :taggable_types=, to: :spree_config
627
427
 
628
428
  # Class-name strings for the models that may be recorded as having performed
629
429
  # an action — what an `acted_by` association's `*_type` column is allowed to
@@ -636,13 +436,7 @@ module Spree
636
436
  # See docs/plans/6.0-action-actors.md.
637
437
  #
638
438
  # @return [Array<String>]
639
- def self.actor_classes
640
- Rails.application.config.spree.actor_classes
641
- end
642
-
643
- def self.actor_classes=(value)
644
- Rails.application.config.spree.actor_classes = value
645
- end
439
+ singleton_class.delegate :actor_classes, :actor_classes=, to: :spree_config
646
440
 
647
441
 
648
442
  # Registry of the Getting Started onboarding tasks shown on the admin
@@ -653,31 +447,11 @@ module Spree
653
447
  @store_setup_tasks ||= Spree::SetupTasks.new
654
448
  end
655
449
 
656
- def self.translatable_resources
657
- Rails.application.config.spree.translatable_resources
658
- end
659
-
660
- def self.translatable_resources=(value)
661
- Rails.application.config.spree.translatable_resources = value
662
- end
663
-
664
- def self.custom_fields
665
- Rails.application.config.spree.custom_fields
666
- end
667
-
668
450
  def self.metafields
669
451
  Spree::Deprecation.warn('Spree.metafields is deprecated and will be removed in Spree 6.1. Use Spree.custom_fields instead.') if defined?(Spree::Deprecation)
670
452
  custom_fields
671
453
  end
672
454
 
673
- def self.integrations
674
- Rails.application.config.spree.integrations
675
- end
676
-
677
- def self.integrations=(value)
678
- Rails.application.config.spree.integrations = value
679
- end
680
-
681
455
  # Registry mapping a numbered resource to the generator that produces its
682
456
  # document numbers. With no entry, the store's `document_number_format`
683
457
  # preference picks between the sequential and random strategies.
@@ -685,8 +459,13 @@ module Spree
685
459
  # @return [Spree::NumberGenerators::Registry]
686
460
  # @example Custom order numbers
687
461
  # Spree.number_generators[:order] = 'MyApp::BranchOrderNumbers'
688
- def self.number_generators
689
- Rails.application.config.spree.number_generators
462
+ singleton_class.delegate :number_generators, to: :spree_config
463
+
464
+ # The email templates merchants may edit in the dashboard.
465
+ #
466
+ # @return [Spree::Emails::EditableTemplates]
467
+ def self.editable_email_templates
468
+ @editable_email_templates ||= Spree::Emails::EditableTemplates.new
690
469
  end
691
470
 
692
471
  # Event subscribers that handle lifecycle and custom events
@@ -694,21 +473,7 @@ module Spree
694
473
  # Spree.subscribers << MyApp::OrderNotificationSubscriber
695
474
  # @example Removing a built-in subscriber
696
475
  # Spree.subscribers.delete(Spree::ExportSubscriber)
697
- def self.subscribers
698
- Rails.application.config.spree.subscribers
699
- end
700
-
701
- def self.subscribers=(value)
702
- Rails.application.config.spree.subscribers = value
703
- end
704
-
705
- def self.pricing
706
- Rails.application.config.spree.pricing
707
- end
708
-
709
- def self.pricing=(value)
710
- Rails.application.config.spree.pricing = value
711
- end
476
+ singleton_class.delegate :subscribers, :subscribers=, to: :spree_config
712
477
 
713
478
  # Registry of authentication strategy classes for the Store API.
714
479
  # @return [Spree::Authentication::StrategyRegistry]
@@ -716,29 +481,17 @@ module Spree
716
481
  # Spree.store_authentication_strategies.add(:auth0, MyApp::Auth::Auth0Strategy)
717
482
  # @example Removing a strategy
718
483
  # Spree.store_authentication_strategies.remove(:email)
719
- def self.store_authentication_strategies
720
- Rails.application.config.spree.store_authentication_strategies
721
- end
722
-
723
484
  # @param value [Spree::Authentication::StrategyRegistry] the registry to use for Store API authentication dispatch
724
485
  # @return [Spree::Authentication::StrategyRegistry] the assigned registry
725
- def self.store_authentication_strategies=(value)
726
- Rails.application.config.spree.store_authentication_strategies = value
727
- end
486
+ singleton_class.delegate :store_authentication_strategies, :store_authentication_strategies=, to: :spree_config
728
487
 
729
488
  # Registry of authentication strategy classes for the Admin API.
730
489
  # @return [Spree::Authentication::StrategyRegistry]
731
490
  # @example Registering an SSO strategy for admin users
732
491
  # Spree.admin_authentication_strategies.add(:okta, MyApp::Auth::OktaStrategy)
733
- def self.admin_authentication_strategies
734
- Rails.application.config.spree.admin_authentication_strategies
735
- end
736
-
737
492
  # @param value [Spree::Authentication::StrategyRegistry] the registry to use for Admin API authentication dispatch
738
493
  # @return [Spree::Authentication::StrategyRegistry] the assigned registry
739
- def self.admin_authentication_strategies=(value)
740
- Rails.application.config.spree.admin_authentication_strategies = value
741
- end
494
+ singleton_class.delegate :admin_authentication_strategies, :admin_authentication_strategies=, to: :spree_config
742
495
 
743
496
  # Registry of authentication strategy classes for the Seller API.
744
497
  #
@@ -750,50 +503,14 @@ module Spree
750
503
  # @return [Spree::Authentication::StrategyRegistry]
751
504
  # @example Registering an SSO strategy for seller users
752
505
  # Spree.seller_authentication_strategies.add(:okta, MyApp::Auth::OktaStrategy)
753
- def self.seller_authentication_strategies
754
- Rails.application.config.spree.seller_authentication_strategies
755
- end
756
-
757
506
  # @param value [Spree::Authentication::StrategyRegistry] the registry to use for Seller API authentication dispatch
758
507
  # @return [Spree::Authentication::StrategyRegistry] the assigned registry
759
- def self.seller_authentication_strategies=(value)
760
- Rails.application.config.spree.seller_authentication_strategies = value
761
- end
508
+ singleton_class.delegate :seller_authentication_strategies, :seller_authentication_strategies=, to: :spree_config
762
509
 
763
510
  # Semantic reporting registry — the queryable metric/dimension vocabulary.
764
- # Not to be confused with +Spree.analytics+ (storefront event tracking).
765
511
  #
766
512
  # @return [Spree::Reporting::Registry]
767
- def self.reporting
768
- Rails.application.config.spree.reporting
769
- end
770
-
771
- def self.reporting=(value)
772
- Rails.application.config.spree.reporting = value
773
- end
774
-
775
- def self.analytics
776
- @analytics ||= AnalyticsConfig.new
777
- end
778
-
779
- # Group analytics configuration options together, but still make it backwards compatible.
780
- class AnalyticsConfig
781
- def events
782
- Rails.application.config.spree.analytics_events
783
- end
784
-
785
- def events=(value)
786
- Rails.application.config.spree.analytics_events = value
787
- end
788
-
789
- def handlers
790
- Rails.application.config.spree.analytics_event_handlers
791
- end
792
-
793
- def handlers=(value)
794
- Rails.application.config.spree.analytics_event_handlers = value
795
- end
796
- end
513
+ singleton_class.delegate :reporting, :reporting=, to: :spree_config
797
514
 
798
515
  # The permission catalog — the grant vocabulary shared by staff roles and
799
516
  # secret API key scopes. Roles themselves are data (Spree::Role#permissions);
@@ -826,10 +543,10 @@ module Spree
826
543
  # Dynamic methods for core dependencies
827
544
  #
828
545
  # @example Getting a dependency (returns resolved class)
829
- # Spree.cart_add_item_service.call(order: order, variant: variant)
546
+ # Spree.cart_add_item_workflow.call(cart: cart, variant: variant)
830
547
  #
831
548
  # @example Setting a dependency
832
- # Spree.cart_add_item_service = MyApp::CartAddItem
549
+ # Spree.cart_add_item_workflow = MyApp::CartAddItem
833
550
  def method_missing(method_name, *args, &block)
834
551
  base_name = method_name.to_s.chomp('=').to_sym
835
552
 
@@ -905,7 +622,6 @@ require 'spree/core/version'
905
622
  require 'spree/core/number_generator'
906
623
  require 'spree/number_generators/registry'
907
624
  require 'spree/migrations'
908
- require 'spree/translation_migrations'
909
625
  require 'spree/validators'
910
626
  require 'spree/core/engine'
911
627
 
@@ -917,28 +633,30 @@ require 'spree/translations'
917
633
  require 'spree/money'
918
634
  require 'spree/service_module'
919
635
  require 'spree/workflow'
920
- require 'spree/analytics'
921
636
  require 'spree/reporting'
922
637
  require 'spree/events'
923
638
  require 'spree/store_scope_guard'
639
+ require 'spree/uploads'
924
640
 
925
641
  # Not autoloaded from app/: the registry keeps registered steps in
926
642
  # class-level state, which a reload would discard.
927
643
  require 'spree/checkout/step'
928
644
  require 'spree/checkout/requirement'
929
645
  require 'spree/checkout/registry'
646
+ require 'spree/emails/editable_templates'
930
647
  require 'spree/checkout/default_requirements'
931
648
  require 'spree/checkout/requirements'
932
649
 
933
650
  require 'spree/core/controller_helpers/store'
934
651
 
935
- require 'spree/core/preferences/store'
936
- require 'spree/core/preferences/scoped_store'
937
652
  require 'spree/core/preferences/runtime_configuration'
938
653
  require 'spree/core/preferences/masking'
654
+ require 'spree/core/preferences/invalid_preferences'
655
+ require 'spree/core/preferences/json_conversion'
939
656
 
940
657
  require 'spree/core/permission_configuration'
941
658
  require 'spree/core/ransack_configuration'
942
659
  require 'spree/core/pricing/context'
943
660
  require 'spree/core/pricing/price_resolution'
944
661
  require 'spree/core/pricing/resolver'
662
+ require 'spree/core/tax/provider_error'