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
@@ -1,15 +0,0 @@
1
- module Spree
2
- module Products
3
- class TouchCategoriesJob < ::Spree::BaseJob
4
- queue_as Spree.queues.categories
5
-
6
- # @param category_ids [Array<Integer>]
7
- # @param _legacy_taxonomy_ids [Array<Integer>] ignored; accepted so jobs
8
- # enqueued before 6.0 stopped touching taxonomies still deserialize.
9
- # Removed in 6.1.
10
- def perform(category_ids, _legacy_taxonomy_ids = nil)
11
- Spree::Category.where(id: category_ids).update_all(updated_at: Time.current)
12
- end
13
- end
14
- end
15
- end
@@ -1,13 +0,0 @@
1
- module Spree
2
- module Products
3
- # @deprecated Renamed to Spree::Products::TouchCategoriesJob in 6.0. Subclasses it
4
- # so jobs enqueued under the old class name before the deploy still deserialize
5
- # and run; removed in 6.1.
6
- class TouchTaxonsJob < TouchCategoriesJob
7
- def perform(*args)
8
- Spree::Deprecation.warn('Spree::Products::TouchTaxonsJob is deprecated and will be removed in Spree 6.1. Use Spree::Products::TouchCategoriesJob instead.')
9
- super
10
- end
11
- end
12
- end
13
- end
@@ -1,10 +0,0 @@
1
- module ActsAsTaggableOn
2
- module TagDecorator
3
- def self.prepended(base)
4
- base.include ::Spree::RansackableAttributes
5
- base.whitelisted_ransackable_attributes = %w[id name]
6
- end
7
- end
8
-
9
- Tag.prepend(TagDecorator)
10
- end
@@ -1,18 +0,0 @@
1
- module Spree
2
- module HasImageAltText
3
- extend ActiveSupport::Concern
4
-
5
- # @return [String] Alt text resolved from preference, asset filename, or i18n fallback.
6
- def image_alt
7
- return preferred_image_alt if respond_to?(:preferred_image_alt) && preferred_image_alt.present?
8
-
9
- if respond_to?(:asset) && asset&.filename.present?
10
- filename = asset.filename.to_s
11
- base = File.basename(filename, File.extname(filename))
12
- return base.tr('-_.', ' ').squeeze(' ').strip
13
- end
14
-
15
- Spree.t(:image, default: 'Image')
16
- end
17
- end
18
- end
@@ -1,54 +0,0 @@
1
- module Spree
2
- class BaseAnalyticsEventHandler
3
- # Initializes the event handler
4
- # @param client [Object] The client object
5
- # @param opts [Hash] The options
6
- # @option opts [User] :user
7
- # @option opts [String] :session_id
8
- # @option opts [Spree::Store] :store
9
- def initialize(opts = {})
10
- @user = opts[:user]
11
- @session = opts[:session]
12
- @request = opts[:request]
13
- @store = opts[:store]
14
- @visitor_id = opts[:visitor_id]
15
- end
16
-
17
- attr_reader :user, :session, :request, :store, :visitor_id
18
-
19
- # Returns the client
20
- # @return [Object] The client object
21
- def client
22
- raise NotImplementedError, 'Subclasses must implement the client method'
23
- end
24
-
25
- # Handles the event
26
- # @param event_name [String] eg. 'order_completed'
27
- # @param properties [Hash] eg. { product: Spree::Product, taxon: Spree::Category, query: String }
28
- # rubocop:disable Lint/UnusedMethodArgument
29
- def handle_event(event_name, properties = {})
30
- raise NotImplementedError, 'Subclasses must implement the handle method'
31
- end
32
- # rubocop:enable Lint/UnusedMethodArgument
33
-
34
- # Returns the human name for the event
35
- # @param event_name [String] eg. 'order_completed'
36
- # @return [String] eg. 'Order Completed'
37
- def event_human_name(event_name)
38
- Analytics.events[event_name.to_sym]
39
- end
40
-
41
- protected
42
-
43
- # Returns the identity hash for the event
44
- # @return [Hash] eg. { user_id: 1, session_id: '123' }
45
- def identity_hash
46
- {
47
- user_id: user&.id,
48
- # session.id is a custom class (not a string), which has overridden the `to_json` method, we have to convert it to a string first so it does not send garbage to the analytics service
49
- session_id: session&.id&.to_s,
50
- visitor_id: visitor_id
51
- }
52
- end
53
- end
54
- end
@@ -1,6 +0,0 @@
1
- module Spree
2
- module Invitations
3
- class Store < Base
4
- end
5
- end
6
- end
@@ -1,14 +0,0 @@
1
- class Spree::Preference < Spree.base_class
2
- if Rails::VERSION::STRING >= '7.1.0'
3
- serialize :value, coder: YAML
4
- else
5
- serialize :value
6
- end
7
-
8
- validates :key, presence: true,
9
- uniqueness: { case_sensitive: false, allow_blank: true, scope: spree_base_uniqueness_scope }
10
-
11
- if defined?(Spree::Security::Preferences)
12
- include Spree::Security::Preferences
13
- end
14
- end
@@ -1,25 +0,0 @@
1
- module Spree
2
- module PromotionHandler
3
- class Page
4
- attr_reader :order, :path, :store
5
-
6
- def initialize(order, path)
7
- @order = order
8
- @store = order.store
9
- @path = path.gsub(/\A\//, '')
10
- end
11
-
12
- def activate
13
- if promotion&.eligible?(order)
14
- promotion.activate(order: order)
15
- end
16
- end
17
-
18
- private
19
-
20
- def promotion
21
- @promotion ||= store.promotions.active.find_by(path: path)
22
- end
23
- end
24
- end
25
- end
@@ -1,60 +0,0 @@
1
- module Spree
2
- module PromotionHandler
3
- class PromotionDuplicator
4
- def initialize(promotion, random_string: nil)
5
- @promotion = promotion.reload
6
- @random_string = random_string || generate_random_string(4)
7
- end
8
-
9
- def duplicate
10
- @new_promotion = @promotion.dup
11
- @new_promotion.path = "#{@promotion.path}_#{@random_string}"
12
- @new_promotion.name = "New #{@promotion.name}"
13
- @new_promotion.code = "#{@promotion.code}_#{@random_string}"
14
- @new_promotion.store = @promotion.store
15
-
16
- ActiveRecord::Base.transaction do
17
- @new_promotion.save
18
- copy_rules
19
- copy_actions
20
- end
21
-
22
- @new_promotion.reload
23
- end
24
-
25
- private
26
-
27
- def copy_rules
28
- @promotion.promotion_rules.each do |rule|
29
- new_rule = rule.dup
30
- new_rule.promotion = @new_promotion
31
- new_rule.save!
32
-
33
- new_rule.users = rule.users if rule.try(:users)
34
- new_rule.categories = rule.categories if rule.try(:categories)
35
- new_rule.products = rule.products if rule.try(:products)
36
- end
37
- end
38
-
39
- def generate_random_string(number)
40
- charset = Array('A'..'Z') + Array('a'..'z')
41
- Array.new(number) { charset.sample }.join
42
- end
43
-
44
- def copy_actions
45
- @promotion.promotion_actions.each do |action|
46
- new_action = action.dup
47
- new_action.promotion = @new_promotion
48
- new_action.calculator = action.calculator.dup if action.try(:calculator)
49
- new_action.save!
50
-
51
- next unless action.try(:promotion_action_line_items)
52
-
53
- action.promotion_action_line_items.each do |item|
54
- new_action.promotion_action_line_items << item.dup
55
- end
56
- end
57
- end
58
- end
59
- end
60
- end
@@ -1,45 +0,0 @@
1
- module Spree
2
- module Stock
3
- class Differentiator
4
- attr_reader :missing, :packed, :required, :packages, :order
5
-
6
- def initialize(order, packages)
7
- @order = order
8
- @packages = packages
9
- build_packed
10
- build_required
11
- build_missing
12
- end
13
-
14
- def missing?
15
- missing.values.any? { |v| v > 0 }
16
- end
17
-
18
- private
19
-
20
- def build_missing
21
- @missing = Hash.new(0)
22
- required.keys.each do |variant|
23
- missing = required[variant] - packed[variant]
24
- @missing[variant] = missing if missing > 0
25
- end
26
- end
27
-
28
- def build_packed
29
- @packed = Hash.new(0)
30
- packages.each do |package|
31
- package.contents.each do |content_item|
32
- @packed[content_item.variant] += content_item.quantity
33
- end
34
- end
35
- end
36
-
37
- def build_required
38
- @required = Hash.new(0)
39
- order.line_items.each do |line_item|
40
- @required[line_item.variant] = line_item.quantity
41
- end
42
- end
43
- end
44
- end
45
- end
@@ -1,47 +0,0 @@
1
- module Spree
2
- module Filters
3
- class OptionsPresenter
4
- FilterableOptionType = Struct.new(:option_type, :option_values, keyword_init: true) do
5
- delegate_missing_to :option_type
6
-
7
- def to_h
8
- {
9
- id: option_type.id,
10
- name: option_type.name,
11
- presentation: option_type.label,
12
- option_values: option_values.map { |e| option_value_hash(e) }
13
- }
14
- end
15
-
16
- private
17
-
18
- def option_value_hash(option_value)
19
- {
20
- id: option_value.id,
21
- name: option_value.name,
22
- presentation: option_value.label,
23
- position: option_value.position
24
- }
25
- end
26
- end
27
-
28
- def initialize(option_values_scope:)
29
- @option_values = option_values_scope.includes(:option_type)
30
- end
31
-
32
- def to_a
33
- grouped_options.map do |option_type, option_values|
34
- FilterableOptionType.new(option_type: option_type, option_values: option_values)
35
- end
36
- end
37
-
38
- private
39
-
40
- attr_reader :option_values
41
-
42
- def grouped_options
43
- option_values.group_by(&:option_type)
44
- end
45
- end
46
- end
47
- end
@@ -1,42 +0,0 @@
1
- module Spree
2
- module Carts
3
- class Empty
4
- prepend Spree::ServiceModule::Base
5
-
6
- def call(cart: nil, order: nil)
7
- if order
8
- Spree::Deprecation.warn('Calling Spree::Carts::Empty with order: is deprecated and will be removed in Spree 6.1. Pass cart: instead.')
9
- cart ||= order
10
- end
11
- rewrite_input!(remove: [:order], cart: cart)
12
- run :check_if_can_be_empty
13
- run :empty_order
14
- end
15
-
16
- private
17
-
18
- def check_if_can_be_empty(cart:)
19
- return failure(Spree.t(:cannot_empty)) if cart.nil? || cart.completed?
20
-
21
- success(cart: cart)
22
- end
23
-
24
- def empty_order(cart:)
25
- ActiveRecord::Base.transaction do
26
- cart.line_items.destroy_all
27
- cart.update_columns(total_quantity: 0, updated_at: Time.current)
28
- cart.tax_lines.destroy_all
29
- cart.discounts.destroy_all
30
- cart.fees.destroy_all
31
- cart.fulfillments.destroy_all
32
- cart.order_promotions.destroy_all
33
- cart.recalculate_totals!
34
-
35
- Spree::StockReservations::Release.call(cart: cart)
36
-
37
- success(cart)
38
- end
39
- end
40
- end
41
- end
42
- end
@@ -1,273 +0,0 @@
1
- module Spree
2
- class CountryToTimezone
3
- prepend Spree::ServiceModule::Base
4
-
5
- CAPITAL_CITIES = {
6
- "AD"=>"Andorra la Vella",
7
- "AE"=>"Abu Dhabi",
8
- "AF"=>"Kabul",
9
- "AG"=>"Saint John's",
10
- "AI"=>"The Valley",
11
- "AL"=>"Tirana",
12
- "AM"=>"Yerevan",
13
- "AN"=>"Willemstad",
14
- "AO"=>"Luanda",
15
- "AQ"=>nil,
16
- "AR"=>"Buenos Aires",
17
- "AS"=>"Pago Pago",
18
- "AT"=>"Vienna",
19
- "AU"=>"Canberra",
20
- "AW"=>"Oranjestad",
21
- "AZ"=>"Baku",
22
- "BA"=>"Sarajevo",
23
- "BB"=>"Bridgetown",
24
- "BD"=>"Dhaka",
25
- "BE"=>"Brussels",
26
- "BF"=>"Ouagadougou",
27
- "BG"=>"Sofia",
28
- "BH"=>"Manama",
29
- "BI"=>"Bujumbura",
30
- "BJ"=>"Porto-Novo",
31
- "BL"=>"Gustavia",
32
- "BM"=>"Hamilton",
33
- "BN"=>"Bandar Seri Begawan",
34
- "BO"=>"La Paz",
35
- "BR"=>"Brasilia",
36
- "BS"=>"Nassau",
37
- "BT"=>"Thimphu",
38
- "BV"=>nil,
39
- "BW"=>"Gaborone",
40
- "BY"=>"Minsk",
41
- "BZ"=>"Belmopan",
42
- "CA"=>"Ottawa",
43
- "CC"=>"West Island",
44
- "CD"=>"Kinshasa",
45
- "CF"=>"Bangui",
46
- "CG"=>"Brazzaville",
47
- "CH"=>"Bern",
48
- "CI"=>"Yamoussoukro",
49
- "CK"=>"Avarua",
50
- "CL"=>"Santiago",
51
- "CM"=>"Yaounde",
52
- "CN"=>"Beijing",
53
- "CO"=>"Bogota",
54
- "CR"=>"San Jose",
55
- "CU"=>"Havana",
56
- "CV"=>"Praia",
57
- "CX"=>"The Settlement",
58
- "CY"=>"Nicosia",
59
- "CZ"=>"Prague",
60
- "DE"=>"Berlin",
61
- "DJ"=>"Djibouti",
62
- "DK"=>"Copenhagen",
63
- "DM"=>"Roseau",
64
- "DO"=>"Santo Domingo",
65
- "DZ"=>"Algiers",
66
- "EC"=>"Quito",
67
- "EE"=>"Tallinn",
68
- "EG"=>"Cairo",
69
- "EH"=>nil,
70
- "ER"=>"Asmara",
71
- "ES"=>"Madrid",
72
- "ET"=>"Addis Ababa",
73
- "FI"=>"Helsinki",
74
- "FJ"=>"Suva",
75
- "FK"=>"Stanley",
76
- "FM"=>"Palikir",
77
- "FO"=>"Torshavn",
78
- "FR"=>"Paris",
79
- "GA"=>"Libreville",
80
- "GB"=>"London",
81
- "GD"=>"Saint George's",
82
- "GE"=>"T'bilisi",
83
- "GG"=>"Saint Peter Port",
84
- "GH"=>"Accra",
85
- "GI"=>"Gibraltar",
86
- "GL"=>"Nuuk",
87
- "GM"=>"Banjul",
88
- "GN"=>"Conakry",
89
- "GQ"=>"Malabo",
90
- "GR"=>"Athens",
91
- "GT"=>"Guatemala City",
92
- "GU"=>"Hagatna",
93
- "GW"=>"Bissau",
94
- "GY"=>"Georgetown",
95
- "HK"=>"Hong Kong",
96
- "HM"=>nil,
97
- "HN"=>"Tegucigalpa",
98
- "HR"=>"Zagreb",
99
- "HT"=>"Port-au-Prince",
100
- "HU"=>"Budapest",
101
- "ID"=>"Jakarta",
102
- "IE"=>"Dublin",
103
- "IL"=>"Jerusalem",
104
- "IM"=>"Douglas",
105
- "IN"=>"New Delhi",
106
- "IO"=>nil,
107
- "IQ"=>"Baghdad",
108
- "IR"=>"Tehran",
109
- "IS"=>"Reykjavik",
110
- "IT"=>"Rome",
111
- "JE"=>"Saint Helier",
112
- "JM"=>"Kingston",
113
- "JO"=>"Amman",
114
- "JP"=>"Tokyo",
115
- "KE"=>"Nairobi",
116
- "KG"=>"Bishkek",
117
- "KH"=>"Phnom Penh",
118
- "KI"=>"Tarawa",
119
- "KM"=>"Moroni",
120
- "KN"=>"Basseterre",
121
- "KP"=>"Pyongyang",
122
- "KR"=>"Seoul",
123
- "KW"=>"Kuwait City",
124
- "KY"=>"George Town",
125
- "KZ"=>"Astana",
126
- "LA"=>"Vientiane",
127
- "LB"=>"Beirut",
128
- "LC"=>"Castries",
129
- "LI"=>"Vaduz",
130
- "LK"=>"Colombo",
131
- "LR"=>"Monrovia",
132
- "LS"=>"Maseru",
133
- "LT"=>"Vilnius",
134
- "LU"=>"Luxembourg",
135
- "LV"=>"Riga",
136
- "LY"=>"Tripoli",
137
- "MA"=>"Rabat",
138
- "MC"=>"Monaco",
139
- "MD"=>"Chisinau",
140
- "ME"=>"Podgorica",
141
- "MF"=>"Marigot",
142
- "MG"=>"Antananarivo",
143
- "MH"=>"Majuro",
144
- "MK"=>"Skopje",
145
- "ML"=>"Bamako",
146
- "MM"=>"Rangoon",
147
- "MN"=>"Ulaanbaatar",
148
- "MO"=>nil,
149
- "MP"=>"Saipan",
150
- "MR"=>"Nouakchott",
151
- "MS"=>"Plymouth",
152
- "MT"=>"Valletta",
153
- "MU"=>"Port Louis",
154
- "MV"=>"Male",
155
- "MW"=>"Lilongwe",
156
- "MX"=>"Mexico City",
157
- "MY"=>"Kuala Lumpur",
158
- "MZ"=>"Maputo",
159
- "NA"=>"Windhoek",
160
- "NC"=>"Noumea",
161
- "NE"=>"Niamey",
162
- "NF"=>"Kingston",
163
- "NG"=>"Abuja",
164
- "NI"=>"Managua",
165
- "NL"=>"Amsterdam",
166
- "NO"=>"Oslo",
167
- "NP"=>"Kathmandu",
168
- "NR"=>nil,
169
- "NU"=>"Alofi",
170
- "NZ"=>"Wellington",
171
- "OM"=>"Muscat",
172
- "PA"=>"Panama City",
173
- "PE"=>"Lima",
174
- "PF"=>"Papeete",
175
- "PG"=>"Port Moresby",
176
- "PH"=>"Manila",
177
- "PK"=>"Islamabad",
178
- "PL"=>"Warsaw",
179
- "PM"=>"Saint-Pierre",
180
- "PN"=>"Adamstown",
181
- "PR"=>"San Juan",
182
- "PS"=>nil,
183
- "PT"=>"Lisbon",
184
- "PW"=>"Melekeok",
185
- "PY"=>"Asuncion",
186
- "QA"=>"Doha",
187
- "RO"=>"Bucharest",
188
- "RS"=>"Belgrade",
189
- "RU"=>"Moscow",
190
- "RW"=>"Kigali",
191
- "SA"=>"Riyadh",
192
- "SB"=>"Honiara",
193
- "SC"=>"Victoria",
194
- "SD"=>"Khartoum",
195
- "SE"=>"Stockholm",
196
- "SG"=>"Singapore",
197
- "SH"=>"Jamestown",
198
- "SI"=>"Ljubljana",
199
- "SJ"=>"Longyearbyen",
200
- "SK"=>"Bratislava",
201
- "SL"=>"Freetown",
202
- "SM"=>"San Marino",
203
- "SN"=>"Dakar",
204
- "SO"=>"Mogadishu",
205
- "SR"=>"Paramaribo",
206
- "ST"=>"Sao Tome",
207
- "SV"=>"San Salvador",
208
- "SY"=>"Damascus",
209
- "SZ"=>"Mbabane",
210
- "TC"=>"Grand Turk",
211
- "TD"=>"N'Djamena",
212
- "TF"=>nil,
213
- "TG"=>"Lome",
214
- "TH"=>"Bangkok",
215
- "TJ"=>"Dushanbe",
216
- "TK"=>nil,
217
- "TL"=>"Dili",
218
- "TM"=>"Ashgabat",
219
- "TN"=>"Tunis",
220
- "TO"=>"Nuku'alofa",
221
- "TR"=>"Ankara",
222
- "TT"=>"Port-of-Spain",
223
- "TV"=>"Funafuti",
224
- "TW"=>"Taipei",
225
- "TZ"=>"Dar es Salaam",
226
- "UA"=>"Kyiv",
227
- "UG"=>"Kampala",
228
- "US"=>"Washington, DC",
229
- "UY"=>"Montevideo",
230
- "UZ"=>"Tashkent",
231
- "VA"=>"Vatican City",
232
- "VC"=>"Kingstown",
233
- "VE"=>"Caracas",
234
- "VG"=>"Road Town",
235
- "VI"=>"Charlotte Amalie",
236
- "VN"=>"Hanoi",
237
- "VU"=>"Port-Vila",
238
- "WF"=>"Mata-Utu",
239
- "WS"=>"Apia",
240
- "YE"=>"Sanaa",
241
- "YT"=>"Mamoudzou",
242
- "ZA"=>"Pretoria",
243
- "ZM"=>"Lusaka",
244
- "ZW"=>"Harare"}.freeze
245
-
246
- def call(code:)
247
- case code
248
- when 'US', 'CA'
249
- success('Central Time (US & Canada)')
250
- else
251
- success(from_timezone_helper(code))
252
- end
253
- end
254
-
255
- private
256
-
257
- def from_timezone_helper(code)
258
- timezones = ActiveSupport::TimeZone.country_zones(code)
259
- return 'Central Time (US & Canada)' if timezones.empty?
260
-
261
- timezones.first.name if timezones.size == 1
262
-
263
- # If there is more than one timezone for the country, then we'll use the capital city
264
- # to determine the timezone
265
- # eg GB has London and Edinburgh
266
- capital_city = CAPITAL_CITIES[code]
267
- capital_city_time_zone = timezones.find{ |tz| tz.name.match(capital_city) }
268
- return capital_city_time_zone.name if capital_city_time_zone.present?
269
-
270
- timezones.first.name
271
- end
272
- end
273
- end