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,92 +0,0 @@
1
- module Spree
2
- module Payments
3
- # @deprecated Unused since 6.0 and removed in 7.0. Nothing in Spree
4
- # calls this: the storefront creates payments through the Store API
5
- # controller, store credit through Spree::Checkout::AddStoreCredit,
6
- # gift cards through Spree::GiftCards::Apply, and a partial capture's
7
- # remainder through Spree::Payment#split_uncaptured_amount.
8
- #
9
- # It also cannot serve those callers as written — it resolves the
10
- # payment method from +params[:payment_method_id]+ against the
11
- # storefront-visible list and builds a source from client attributes,
12
- # while they already hold both (the gift card flow creates its payment
13
- # method by type when the store has none).
14
- class Create
15
- prepend Spree::ServiceModule::Base
16
-
17
- def call(order:, params: {})
18
- ApplicationRecord.transaction do
19
- run :prepare_payment_attributes
20
- run :find_or_create_payment_source
21
- run :save_payment
22
- end
23
- # Gateway I/O — after the transaction, on the in-memory graph (some
24
- # gateways need the raw card number, which never persists).
25
- run :store_gateway_profile
26
- end
27
-
28
- protected
29
-
30
- def prepare_payment_attributes(order:, params:)
31
- payment_method = order.payment_methods.find { |pm| pm.id.to_s == params[:payment_method_id]&.to_s }
32
-
33
- payment_attributes = {
34
- amount: params[:amount] || order.order_total_after_store_credit,
35
- payment_method: payment_method
36
- }
37
-
38
- return failure(nil, :payment_method_not_found) if payment_method.blank?
39
-
40
- success(order: order, params: params, payment_attributes: payment_attributes)
41
- end
42
-
43
- def find_or_create_payment_source(order:, params:, payment_attributes:)
44
- payment_method = payment_attributes[:payment_method]
45
-
46
- if payment_method&.source_required?
47
- if order.customer.present? && params[:source_id].present?
48
- source = payment_method.payment_source_class.find_by(id: params[:source_id], customer: order.customer)
49
-
50
- return failure(nil, :source_not_found) if source.nil?
51
- else
52
- result = Wallet::CreatePaymentSource.call(
53
- payment_method: payment_method,
54
- params: params.delete(:source_attributes),
55
- user: order.customer
56
- )
57
-
58
- return failure(nil, result.error.value) if result.failure?
59
-
60
- source = result.value
61
- end
62
-
63
- payment_attributes[:source] = source
64
- end
65
-
66
- success(order: order, payment_attributes: payment_attributes)
67
- end
68
-
69
- def save_payment(order:, payment_attributes:)
70
- payment = order.payments.new(payment_attributes)
71
-
72
- if payment.save
73
- success(payment: payment)
74
- else
75
- failure(payment)
76
- end
77
- end
78
-
79
- # A payment that cannot be profiled must not linger half-created — the
80
- # old after_save callback rolled the whole save back on gateway failure.
81
- def store_gateway_profile(payment:)
82
- return success(payment) unless payment.profiles_supported?
83
-
84
- payment.create_payment_profile
85
- success(payment)
86
- rescue Spree::Core::GatewayError => e
87
- payment.destroy
88
- failure(payment, e.message)
89
- end
90
- end
91
- end
92
- end
@@ -1,23 +0,0 @@
1
- module Spree
2
- class UrlValidator < ActiveModel::EachValidator
3
- def validate_each(record, attribute, value)
4
- unless url_valid?(value)
5
- record.errors.add(attribute, (options[:message] || ERROR_MESSAGE))
6
- end
7
- end
8
-
9
- private
10
-
11
- ERROR_MESSAGE = 'must be a valid URL'
12
- private_constant :ERROR_MESSAGE
13
-
14
- def url_valid?(url)
15
- uri = begin
16
- URI.parse(url)
17
- rescue URI::InvalidURIError
18
- return false
19
- end
20
- uri.host.present? && uri.is_a?(URI::HTTP)
21
- end
22
- end
23
- end
@@ -1,14 +0,0 @@
1
- <figure class="attachment attachment--<%= blob.representable? ? "preview" : "file" %> attachment--<%= blob.filename.extension %>">
2
- <% if blob.representable? %>
3
- <%= spree_image_tag(blob, width: local_assigns[:in_gallery] ? 400 : 512, height: local_assigns[:in_gallery] ? 300 : 400) %>
4
- <% end %>
5
-
6
- <figcaption class="attachment__caption">
7
- <% if caption = blob.try(:caption) %>
8
- <%= caption %>
9
- <% else %>
10
- <span class="attachment__name"><%= blob.filename %></span>
11
- <span class="attachment__size"><%= number_to_human_size blob.byte_size %></span>
12
- <% end %>
13
- </figcaption>
14
- </figure>
@@ -1,8 +0,0 @@
1
- <%= render layout: 'spree/shared/mailer_hero' do %>
2
- <h1><%= Spree.t('admin_user_mailer.password_reset_email.action') %></h1>
3
- <p class="greeting"><%= Spree.t('admin_user_mailer.password_reset_email.greeting', name: @user.first_name.presence || @user.email) %></p>
4
- <p><%= Spree.t('admin_user_mailer.password_reset_email.instructions', store_name: @current_store.name) %></p>
5
- <%= render 'spree/shared/mailer_button', url: @reset_url, label: Spree.t('admin_user_mailer.password_reset_email.action') %>
6
- <p class="sub"><%= Spree.t('admin_user_mailer.password_reset_email.expiry_notice') %></p>
7
- <p class="sub"><%= Spree.t('admin_user_mailer.password_reset_email.ignore_notice') %></p>
8
- <% end %>
@@ -1,7 +0,0 @@
1
- <%= render layout: 'spree/shared/mailer_hero' do %>
2
- <h1><%= Spree.t('export_mailer.greeting', user_name: @export.user&.first_name) %></h1>
3
- <p><%= Spree.t('export_mailer.export_done.message') %></p>
4
- <% if @export.results_url.present? %>
5
- <%= render 'spree/shared/mailer_button', url: @export.results_url, label: @export.attachment.filename %>
6
- <% end %>
7
- <% end %>
@@ -1,12 +0,0 @@
1
- <%= render layout: 'spree/shared/mailer_hero' do %>
2
- <h1><%= Spree.t('import_mailer.greeting', user_name: @import.user&.first_name) %></h1>
3
- <p><%= Spree.t('import_mailer.import_done.message', completed_count: @import.rows_status_counts['completed'] || 0) %></p>
4
- <% failed_count = @import.rows_status_counts['failed'] || 0 %>
5
- <% if failed_count > 0 %>
6
- <p><strong><%= Spree.t('import_mailer.import_done.failed_message', failed_count: failed_count) %></strong></p>
7
- <% end %>
8
- <% results_url = @import.results_page_url %>
9
- <% if results_url.present? %>
10
- <%= render 'spree/shared/mailer_button', url: results_url, label: Spree.t('import_mailer.import_done.view_results') %>
11
- <% end %>
12
- <% end %>
@@ -1,4 +0,0 @@
1
- <%= render layout: 'spree/shared/mailer_hero' do %>
2
- <h1><%= Spree.t('invitation_mailer.greeting', user_name: @invitation.inviter.first_name) %></h1>
3
- <p><%= Spree.t('invitation_mailer.invitation_accepted.body', invitee_name: @invitation.invitee&.name, resource_name: @invitation.resource.name) %></p>
4
- <% end %>
@@ -1,12 +0,0 @@
1
- <%= render layout: 'spree/shared/mailer_hero' do %>
2
- <h1><%= Spree.t('invitation_mailer.invitation_email.subject', resource_name: @invitation.resource.name) %></h1>
3
- <p class="greeting"><%= Spree.t('invitation_mailer.greeting', user_name: @invitation.invitee&.first_name || @invitation.email) %></p>
4
- <p><%= Spree.t('invitation_mailer.invitation_email.body', inviter_name: @invitation.inviter.name, resource_name: @invitation.resource.name) %></p>
5
- <p><%= Spree.t('invitation_mailer.invitation_email.link_description') %></p>
6
- <% accept_url = if spree.respond_to?(:admin_invitation_url)
7
- spree.admin_invitation_url(@invitation, token: @invitation.token, host: @invitation.store.formatted_url)
8
- else
9
- main_app.admin_invitation_acceptance_url(@invitation)
10
- end %>
11
- <%= render 'spree/shared/mailer_button', url: accept_url, label: Spree.t(:accept) %>
12
- <% end %>
@@ -1,8 +0,0 @@
1
- <%= render layout: 'spree/shared/mailer_hero' do %>
2
- <h1><%= Spree.t('seller_user_mailer.password_reset_email.action') %></h1>
3
- <p class="greeting"><%= Spree.t('seller_user_mailer.password_reset_email.greeting', name: @user.first_name.presence || @user.email) %></p>
4
- <p><%= Spree.t('seller_user_mailer.password_reset_email.instructions', store_name: @current_store.name) %></p>
5
- <%= render 'spree/shared/mailer_button', url: @reset_url, label: Spree.t('seller_user_mailer.password_reset_email.action') %>
6
- <p class="sub"><%= Spree.t('seller_user_mailer.password_reset_email.expiry_notice') %></p>
7
- <p class="sub"><%= Spree.t('seller_user_mailer.password_reset_email.ignore_notice') %></p>
8
- <% end %>
@@ -1,19 +0,0 @@
1
- <!-- You can override this template to design your own footer. -->
2
- <table width="100%" cellpadding="0" cellspacing="0" role="presentation">
3
- <tr>
4
- <td align="center">
5
- <div class="footer_content f-fallback">
6
- <p class="footer_brand">
7
- <%= link_to current_store.name, current_store.storefront_url %>
8
- </p>
9
- <% if current_store.address.present? %>
10
- <p class="footer_meta"><%= current_store.address %></p>
11
- <% end %>
12
- <% if current_store.customer_support_email.present? %>
13
- <p class="footer_meta"><%= mail_to current_store.customer_support_email %></p>
14
- <% end %>
15
- <p class="footer_note">&copy; <%= Time.current.year %> <%= current_store.name %></p>
16
- </div>
17
- </td>
18
- </tr>
19
- </table>
@@ -1,8 +0,0 @@
1
- <!-- You can override this template to design your own header. -->
2
- <table width="100%" cellpadding="0" cellspacing="0" role="presentation">
3
- <tr>
4
- <td class="email-masthead" align="center">
5
- <%= render 'spree/shared/mailer_logo', logo: current_store.mailer_logo.attached? ? current_store.mailer_logo : current_store.logo, height: 32 %>
6
- </td>
7
- </tr>
8
- </table>
@@ -1,399 +0,0 @@
1
- <style type="text/css" rel="stylesheet" media="all">
2
- /* Fonts ------------------------------ */
3
- /* Same files the react-email Studio templates load; Gmail strips these and falls back to Arial. */
4
-
5
- @font-face {
6
- font-family: "Geist";
7
- font-style: normal;
8
- font-weight: 500;
9
- src: url("https://fonts.gstatic.com/s/geist/v4/gyByhwUxId8gMEwcGFU.woff2") format("woff2");
10
- }
11
-
12
- @font-face {
13
- font-family: "Geist";
14
- font-style: normal;
15
- font-weight: 600;
16
- src: url("https://fonts.gstatic.com/s/geist/v4/gyByhwUxId8gMEwcGFU.woff2") format("woff2");
17
- }
18
-
19
- @font-face {
20
- font-family: "Geist";
21
- font-style: normal;
22
- font-weight: 700;
23
- src: url("https://fonts.gstatic.com/s/geist/v4/gyByhwUxId8gMEwcGFU.woff2") format("woff2");
24
- }
25
-
26
- @font-face {
27
- font-family: "Inter";
28
- font-style: normal;
29
- font-weight: 400;
30
- src: url("https://fonts.gstatic.com/s/inter/v20/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuOKfMZg.ttf") format("truetype");
31
- }
32
-
33
- @font-face {
34
- font-family: "Inter";
35
- font-style: normal;
36
- font-weight: 450;
37
- src: url("https://fonts.gstatic.com/s/inter/v20/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuOKfMZg.ttf") format("truetype");
38
- }
39
-
40
- @font-face {
41
- font-family: "Inter";
42
- font-style: normal;
43
- font-weight: 500;
44
- src: url("https://fonts.gstatic.com/s/inter/v20/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuI6fMZg.ttf") format("truetype");
45
- }
46
-
47
- @font-face {
48
- font-family: "Inter";
49
- font-style: normal;
50
- font-weight: 600;
51
- src: url("https://fonts.gstatic.com/s/inter/v20/UcCO3FwrK3iLTeHuS_nVMrMxCp50SjIw2boKoduKmMEVuGKYMZg.ttf") format("truetype");
52
- }
53
-
54
- /* Base ------------------------------ */
55
-
56
- body {
57
- width: 100% !important;
58
- height: 100%;
59
- margin: 0;
60
- -webkit-text-size-adjust: none;
61
- background-color: #FFFFFF;
62
- color: #726A6A;
63
- }
64
-
65
- a {
66
- color: #332C2C;
67
- }
68
-
69
- a img {
70
- border: none;
71
- }
72
-
73
- td {
74
- word-break: break-word;
75
- }
76
-
77
- .preheader {
78
- display: none !important;
79
- visibility: hidden;
80
- mso-hide: all;
81
- font-size: 1px;
82
- line-height: 1px;
83
- max-height: 0;
84
- max-width: 0;
85
- opacity: 0;
86
- overflow: hidden;
87
- }
88
-
89
- /* Type ------------------------------ */
90
-
91
- body,
92
- td,
93
- th {
94
- font-family: "Inter", Helvetica, Arial, sans-serif;
95
- }
96
-
97
- h1 {
98
- margin: 0 0 24px;
99
- font-family: "Geist", "Inter", Helvetica, Arial, sans-serif;
100
- color: #332C2C;
101
- font-size: 40px;
102
- line-height: 1.2;
103
- letter-spacing: -0.8px;
104
- font-weight: 700;
105
- text-align: center;
106
- }
107
-
108
- h2 {
109
- margin: 0 0 16px;
110
- font-family: "Geist", "Inter", Helvetica, Arial, sans-serif;
111
- color: #332C2C;
112
- font-size: 22px;
113
- line-height: 1.4;
114
- letter-spacing: -0.18px;
115
- font-weight: 500;
116
- text-align: center;
117
- }
118
-
119
- h3 {
120
- margin: 0 0 16px;
121
- font-family: "Geist", "Inter", Helvetica, Arial, sans-serif;
122
- color: #726A6A;
123
- font-size: 16px;
124
- line-height: 1.5;
125
- letter-spacing: -0.16px;
126
- font-weight: 500;
127
- text-align: left;
128
- }
129
-
130
- td,
131
- th {
132
- font-size: 14px;
133
- }
134
-
135
- p,
136
- ul,
137
- ol,
138
- blockquote {
139
- margin: 0 0 16px;
140
- font-size: 14px;
141
- line-height: 1.6;
142
- letter-spacing: -0.042px;
143
- font-weight: 450;
144
- color: #726A6A;
145
- }
146
-
147
- p.sub {
148
- font-size: 13px;
149
- color: #726A6A;
150
- }
151
-
152
- p.sub a {
153
- color: #726A6A;
154
- word-break: break-all;
155
- }
156
-
157
- p.strong {
158
- margin: 0;
159
- font-weight: 500;
160
- color: #332C2C;
161
- }
162
-
163
- /* Utilities ------------------------------ */
164
-
165
- .align-right {
166
- text-align: right;
167
- }
168
-
169
- .align-left {
170
- text-align: left;
171
- }
172
-
173
- .align-center {
174
- text-align: center;
175
- }
176
-
177
- /* Buttons ------------------------------ */
178
-
179
- .button {
180
- display: inline-block;
181
- background-color: #FFFFFF;
182
- border: 1px solid #E8E9E9;
183
- border-radius: 8px;
184
- padding: 12px 20px;
185
- font-size: 15px;
186
- line-height: 1.6;
187
- font-weight: 500;
188
- color: #1F2222 !important;
189
- text-decoration: none;
190
- -webkit-text-size-adjust: none;
191
- box-sizing: border-box;
192
- }
193
-
194
- .button--green {
195
- background-color: #22BC66;
196
- border-color: #22BC66;
197
- color: #FFFFFF !important;
198
- }
199
-
200
- .button--red {
201
- background-color: #FF6136;
202
- border-color: #FF6136;
203
- color: #FFFFFF !important;
204
- }
205
-
206
- @media only screen and (max-width: 500px) {
207
- .button {
208
- width: 100% !important;
209
- text-align: center !important;
210
- }
211
- }
212
-
213
- /* Hero ------------------------------ */
214
-
215
- .hero {
216
- width: 100%;
217
- text-align: center;
218
- }
219
-
220
- .hero_content {
221
- max-width: 420px;
222
- margin: 0 auto;
223
- }
224
-
225
- .hero h1 {
226
- margin: 0;
227
- }
228
-
229
- .hero p {
230
- margin: 12px 0 0;
231
- }
232
-
233
- .hero .greeting {
234
- margin: 24px 0 0;
235
- font-size: 15px;
236
- font-weight: 500;
237
- color: #332C2C;
238
- }
239
-
240
- .hero .sub {
241
- margin: 24px 0 0;
242
- }
243
-
244
- .hero .sub + .sub {
245
- margin: 16px 0 0;
246
- }
247
-
248
- /* Sections ------------------------------ */
249
-
250
- .section {
251
- width: 100%;
252
- margin: 48px 0 0;
253
- text-align: left;
254
- }
255
-
256
- .section .sub {
257
- margin: 16px 0 0;
258
- }
259
-
260
- /* Structure ------------------------------ */
261
-
262
- .email-wrapper {
263
- width: 100%;
264
- margin: 0;
265
- padding: 0;
266
- background-color: #FFFFFF;
267
- }
268
-
269
- .email-content {
270
- width: 100%;
271
- max-width: 640px;
272
- margin: 0 auto;
273
- padding: 0;
274
- }
275
-
276
- /* Masthead ----------------------- */
277
-
278
- .email-masthead {
279
- padding: 0 0 32px;
280
- text-align: center;
281
- }
282
-
283
- /* Body ------------------------------ */
284
-
285
- .email-card {
286
- background-color: #F6F6F6;
287
- padding: 56px 24px;
288
- }
289
-
290
- .email-footer {
291
- padding: 64px 24px;
292
- text-align: center;
293
- }
294
-
295
- .email-footer p {
296
- color: #726A6A;
297
- }
298
-
299
- .footer_content {
300
- max-width: 320px;
301
- margin: 0 auto;
302
- }
303
-
304
- .footer_brand {
305
- margin: 0;
306
- font-size: 13px;
307
- line-height: 1.5;
308
- letter-spacing: -0.13px;
309
- }
310
-
311
- .footer_brand a {
312
- color: #726A6A;
313
- font-weight: 500;
314
- text-decoration: none;
315
- }
316
-
317
- .footer_meta {
318
- margin: 12px 0 0;
319
- font-size: 11px;
320
- line-height: 1.5;
321
- letter-spacing: -0.11px;
322
- }
323
-
324
- .footer_meta a {
325
- color: #726A6A;
326
- }
327
-
328
- .footer_note {
329
- margin: 20px 0 0;
330
- font-size: 11px;
331
- line-height: 1.5;
332
- letter-spacing: -0.11px;
333
- color: #726A6A;
334
- }
335
-
336
- .body-action {
337
- width: 100%;
338
- margin: 32px auto 0;
339
- padding: 0;
340
- text-align: center;
341
- }
342
-
343
- /* Legacy class hooks ------------------------------ */
344
- /* Kept for host apps and extensions that override mailer templates with
345
- pre-5.6 markup; nothing in Spree itself uses these anymore. */
346
-
347
- .purchase,
348
- .purchase_content {
349
- width: 100%;
350
- margin: 0;
351
- }
352
-
353
- .purchase_item {
354
- padding: 10px 4px;
355
- color: #726A6A;
356
- font-size: 14px;
357
- line-height: 1.6;
358
- }
359
-
360
- .purchase_item--additional {
361
- font-size: 13px;
362
- color: #726A6A;
363
- }
364
-
365
- .purchase_total {
366
- margin: 0;
367
- text-align: right;
368
- font-weight: 500;
369
- color: #332C2C;
370
- }
371
-
372
- .purchase_total--name {
373
- margin: 0;
374
- text-align: right;
375
- color: #726A6A;
376
- }
377
-
378
- /* Media Queries ------------------------------ */
379
-
380
- @media only screen and (max-width: 600px) {
381
- .email-card {
382
- padding: 40px 16px !important;
383
- }
384
- .email-footer {
385
- padding: 48px 16px !important;
386
- }
387
- h1 {
388
- font-size: 32px !important;
389
- letter-spacing: -0.64px !important;
390
- }
391
- }
392
- </style>
393
- <!--[if mso]>
394
- <style type="text/css">
395
- .f-fallback {
396
- font-family: Arial, sans-serif;
397
- }
398
- </style>
399
- <![endif]-->
@@ -1,41 +0,0 @@
1
- <% logo ||= current_store.mailer_logo.attached? ? current_store.mailer_logo : current_store.logo %>
2
- <% height ||= 64 %>
3
- <% logo_css ||= '' %>
4
-
5
- <%= link_to current_store.storefront_url, id: 'site-logo', style: "text-decoration: none;" do %>
6
- <span style="display: none;"><%= current_store.name %></span>
7
- <% if logo.present? && logo.attached? && logo.variable? %>
8
- <% aspect_ratio = spree_asset_aspect_ratio(logo) %>
9
- <% logo_style = "aspect-ratio: #{aspect_ratio};" %>
10
-
11
- <% if aspect_ratio.to_f > 10 %>
12
- <% logo_height = 16 %>
13
- <% elsif aspect_ratio.to_f > 5 %>
14
- <% logo_height = 25 %>
15
- <% elsif aspect_ratio.to_f < 3 %>
16
- <% logo_height = 32 %>
17
- <% else %>
18
- <% logo_height = 32 %>
19
- <% end %>
20
-
21
- <% if defined?(height) && height > 0 %>
22
- <% logo_style += "height: #{height}px;" %>
23
- <% cdn_height = height %>
24
- <% elsif aspect_ratio.to_f < 3 %>
25
- <% cdn_height = 64 %>
26
- <% logo_style += "height: 64px;" %>
27
- <% else %>
28
- <% cdn_height = 32 %>
29
- <% logo_style += "height: 32px;" %>
30
- <% end %>
31
-
32
- <% variant_options = spree_image_variant_options(resize_to_fit: [nil, cdn_height * 3]) %>
33
-
34
- <%= image_tag main_app.cdn_image_url(logo.variant(variant_options)),
35
- style: "#{logo_style} width: auto;",
36
- alt: current_store.name,
37
- height: cdn_height %>
38
- <% else %>
39
- <h1 style="margin: 0; font-size: 22px; font-weight: bold; text-align: center; text-transform: uppercase;"><%= current_store.name %></h1>
40
- <% end %>
41
- <% end %>