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
@@ -13,7 +13,7 @@ module Spree
13
13
  attr_reader :shipping_label
14
14
 
15
15
  # @param owner [Spree::Fulfillment, Spree::Return]
16
- # @param file [ActionDispatch::Http::UploadedFile, String] the file, or a signed blob id from a direct upload
16
+ # @param file [ActionDispatch::Http::UploadedFile, String] the file, or a signed id from POST /files
17
17
  # @param tracking_number [String] the number printed on the label
18
18
  # @param carrier [String, nil] free text; detected from the number when omitted
19
19
  # @param service [String, nil]
@@ -41,15 +41,15 @@ module Spree
41
41
  private
42
42
 
43
43
  def ensure_recordable
44
- failure(owner, Spree.t('shipping_labels.errors.already_purchased')) if owner.shipping_labels.active.exists?
45
- failure(owner, Spree.t('shipping_labels.errors.tracking_number_required')) if tracking_number.blank?
46
- failure(owner, Spree.t('shipping_labels.errors.file_required')) if file.blank?
44
+ failure(owner, I18n.t('spree.shipping_labels.errors.already_purchased')) if owner.shipping_labels.active.exists?
45
+ failure(owner, I18n.t('spree.shipping_labels.errors.tracking_number_required')) if tracking_number.blank?
46
+ failure(owner, I18n.t('spree.shipping_labels.errors.file_required')) if file.blank?
47
47
 
48
48
  case owner
49
49
  when Spree::Fulfillment
50
- failure(owner, Spree.t('fulfillments.errors.cannot_purchase_label')) if owner.canceled? || owner.delivered?
50
+ failure(owner, I18n.t('spree.fulfillments.errors.cannot_purchase_label')) if owner.canceled? || owner.delivered?
51
51
  when Spree::Return
52
- failure(owner, Spree.t('shipping_labels.errors.return_closed')) if owner.received? || owner.refunded? || owner.canceled?
52
+ failure(owner, I18n.t('spree.shipping_labels.errors.return_closed')) if owner.received? || owner.refunded? || owner.canceled?
53
53
  end
54
54
  end
55
55
 
@@ -69,7 +69,7 @@ module Spree
69
69
  failure(@shipping_label) unless @shipping_label.save
70
70
  end
71
71
 
72
- # A direct-upload blob carries the type the client declared, which the
72
+ # An uploaded blob carries the type the client declared, which the
73
73
  # attachment validator re-decides from the bytes; either way the
74
74
  # extension is the merchant-visible answer, so it wins when it names a
75
75
  # format Spree knows.
@@ -42,7 +42,7 @@ module Spree
42
42
  return if shipping_label.refundable?
43
43
 
44
44
  reason = shipping_label.uploaded? ? 'uploaded_not_refundable' : 'not_refundable'
45
- failure(shipping_label, Spree.t("shipping_labels.errors.#{reason}"))
45
+ failure(shipping_label, I18n.t("spree.shipping_labels.errors.#{reason}"))
46
46
  end
47
47
 
48
48
  # A provider that knows why the carrier said no raises with its words;
@@ -52,7 +52,7 @@ module Spree
52
52
 
53
53
  return if %w[refunded refund_requested].include?(@outcome)
54
54
 
55
- failure(shipping_label, Spree.t('shipping_labels.errors.refund_failed'))
55
+ failure(shipping_label, I18n.t('spree.shipping_labels.errors.refund_failed'))
56
56
  rescue Spree::Core::LabelRefundRefused => e
57
57
  failure(shipping_label, e.message)
58
58
  end
@@ -61,19 +61,19 @@ module Spree
61
61
 
62
62
  return if @normalized_items.any?
63
63
 
64
- failure(receivable, Spree.t("#{error_scope}.errors.no_items_received"))
64
+ failure(receivable, I18n.t("spree.#{error_scope}.errors.no_items_received"))
65
65
  end
66
66
 
67
67
  # A line the payload names but counts nothing on is left out rather than
68
68
  # refused: a receive screen submits every row, most of them untouched.
69
69
  def normalize_item(item)
70
70
  line = item[:item]
71
- failure(receivable, Spree.t("#{error_scope}.errors.item_not_on_document")) unless line_belongs?(line)
71
+ failure(receivable, I18n.t("spree.#{error_scope}.errors.item_not_on_document")) unless line_belongs?(line)
72
72
 
73
73
  accepted = item[:quantity_accepted].to_i
74
74
  rejected = item[:quantity_rejected].to_i
75
75
  if accepted.negative? || rejected.negative?
76
- failure(receivable, Spree.t("#{error_scope}.errors.invalid_receipt_quantity", variant: line.variant_name))
76
+ failure(receivable, I18n.t("spree.#{error_scope}.errors.invalid_receipt_quantity", variant: line.variant_name))
77
77
  end
78
78
  return nil if accepted.zero? && rejected.zero?
79
79
 
@@ -93,7 +93,7 @@ module Spree
93
93
  repeated = lines.group_by(&:id).values.find { |group| group.length > 1 }
94
94
  return if repeated.nil?
95
95
 
96
- failure(receivable, Spree.t("#{error_scope}.errors.repeated_item", variant: repeated.first.variant_name))
96
+ failure(receivable, I18n.t("spree.#{error_scope}.errors.repeated_item", variant: repeated.first.variant_name))
97
97
  end
98
98
 
99
99
  def build_receipt
@@ -49,11 +49,11 @@ module Spree
49
49
  private
50
50
 
51
51
  def ensure_cancelable
52
- failure(stock_transfer, Spree.t('stock_transfer.errors.already_closed')) if stock_transfer.closed?
52
+ failure(stock_transfer, I18n.t('spree.stock_transfer.errors.already_closed')) if stock_transfer.closed?
53
53
  return unless stock_transfer.in_flight?
54
54
  return if IN_TRANSIT_RESOLUTIONS.include?(on_in_transit)
55
55
 
56
- failure(stock_transfer, Spree.t('stock_transfer.errors.in_transit_resolution_required'))
56
+ failure(stock_transfer, I18n.t('spree.stock_transfer.errors.in_transit_resolution_required'))
57
57
  end
58
58
 
59
59
  # Whether the units come back or are written off, the destination is no
@@ -8,7 +8,7 @@ module Spree
8
8
  # destination counted in, records why the rest never arrived, and leaves
9
9
  # the outstanding count on each line as the record of the loss.
10
10
  class Close < Spree::Workflow
11
- include Spree::Receivables::IncomingCounter
11
+ include Spree::Receivables::ClosingShort
12
12
 
13
13
  hooks :validate, :after_close
14
14
 
@@ -18,39 +18,12 @@ module Spree
18
18
  # @param reason [String, nil] what happened to the balance
19
19
  def perform(stock_transfer:, reason: nil)
20
20
  super
21
-
22
- stock_transfer.with_lock do
23
- step :ensure_closable
24
- run_hooks :validate
25
- step :uncount_awaited_units
26
- step :close_short
27
- end
28
-
29
- run_hooks :after_close
30
- stock_transfer.publish_event('stock_transfer.received')
31
- success(stock_transfer.reload)
21
+ close
32
22
  end
33
23
 
34
24
  private
35
25
 
36
- def ensure_closable
37
- return if stock_transfer.partially_received?
38
-
39
- failure(stock_transfer, Spree.t('stock_transfer.errors.not_partially_received'))
40
- end
41
-
42
- # The missing units are not going to turn up, so the destination stops
43
- # expecting them; each line's outstanding count keeps the record.
44
- def uncount_awaited_units
45
- uncount_incoming(stock_transfer)
46
- end
47
-
48
- def close_short
49
- now = Time.current
50
- attributes = { status: 'received', received_at: now, closed_short_at: now, close_reason: reason.presence }
51
-
52
- failure(stock_transfer) unless stock_transfer.update(attributes)
53
- end
26
+ def receivable = stock_transfer
54
27
  end
55
28
  end
56
29
  end
@@ -16,9 +16,10 @@ module Spree
16
16
  # may legitimately open empty and gain lines as the merchant packs
17
17
  # @param reference [String, nil] the merchant's own label for the trip
18
18
  # @param notes [String, nil]
19
+ # @param metadata [Hash, nil]
19
20
  # @param created_by [Object, nil]
20
21
  def perform(store:, source_location:, destination_location:, items: [],
21
- reference: nil, notes: nil, created_by: nil)
22
+ reference: nil, notes: nil, metadata: nil, created_by: nil)
22
23
  super
23
24
 
24
25
  step :build_transfer
@@ -46,6 +47,7 @@ module Spree
46
47
  created_by: created_by,
47
48
  status: Spree::StockTransfer.default_status
48
49
  )
50
+ @stock_transfer.metadata = metadata if metadata
49
51
 
50
52
  Array(items).each do |item|
51
53
  @stock_transfer.items.build(variant: item[:variant], quantity_shipped: item[:quantity_shipped])
@@ -30,7 +30,7 @@ module Spree
30
30
  def ensure_returnable
31
31
  return if stock_transfer.ready_to_ship?
32
32
 
33
- failure(stock_transfer, Spree.t('stock_transfer.errors.not_ready_to_ship'))
33
+ failure(stock_transfer, I18n.t('spree.stock_transfer.errors.not_ready_to_ship'))
34
34
  end
35
35
 
36
36
  def return_to_draft
@@ -46,9 +46,9 @@ module Spree
46
46
 
47
47
  def ensure_shippable
48
48
  unless stock_transfer.draft? || stock_transfer.ready_to_ship?
49
- failure(stock_transfer, Spree.t('stock_transfer.errors.not_shippable'))
49
+ failure(stock_transfer, I18n.t('spree.stock_transfer.errors.not_shippable'))
50
50
  end
51
- failure(stock_transfer, Spree.t('stock_transfer.errors.must_have_variant')) if stock_transfer.items.empty?
51
+ failure(stock_transfer, I18n.t('spree.stock_transfer.errors.must_have_variant')) if stock_transfer.items.empty?
52
52
  end
53
53
 
54
54
  # Every line needs enough available stock for the quantity being moved,
@@ -65,7 +65,7 @@ module Spree
65
65
  return if unavailable_items.empty?
66
66
 
67
67
  failure(stock_transfer,
68
- Spree.t('stock_transfer.errors.variants_unavailable', stock: source.name))
68
+ I18n.t('spree.stock_transfer.errors.variants_unavailable', stock: source.name))
69
69
  end
70
70
 
71
71
  def write_shipped_movements
@@ -24,8 +24,8 @@ module Spree
24
24
  private
25
25
 
26
26
  def ensure_draft
27
- failure(stock_transfer, Spree.t('stock_transfer.errors.not_draft')) unless stock_transfer.draft?
28
- failure(stock_transfer, Spree.t('stock_transfer.errors.must_have_variant')) if stock_transfer.items.empty?
27
+ failure(stock_transfer, I18n.t('spree.stock_transfer.errors.not_draft')) unless stock_transfer.draft?
28
+ failure(stock_transfer, I18n.t('spree.stock_transfer.errors.must_have_variant')) if stock_transfer.items.empty?
29
29
  end
30
30
 
31
31
  def mark_ready
@@ -46,7 +46,7 @@ module Spree
46
46
  def ensure_receivable
47
47
  return if stock_transfer.in_flight?
48
48
 
49
- failure(stock_transfer, Spree.t('stock_transfer.errors.not_in_transit'))
49
+ failure(stock_transfer, I18n.t('spree.stock_transfer.errors.not_in_transit'))
50
50
  end
51
51
 
52
52
  def line_belongs?(line)
@@ -4,6 +4,8 @@ module Spree
4
4
  # matter of record, so this refuses anything past `draft` rather than
5
5
  # quietly rewriting a document the warehouse is already acting on.
6
6
  class Update < Spree::Workflow
7
+ include Spree::Receivables::DraftEditing
8
+
7
9
  hooks :validate, :after_update
8
10
 
9
11
  # @param stock_transfer [Spree::StockTransfer]
@@ -13,43 +15,13 @@ module Spree
13
15
  # replacing the current lines; nil leaves them alone
14
16
  def perform(stock_transfer:, attributes: {}, items: nil)
15
17
  super
16
-
17
- step :ensure_editable
18
- run_hooks :validate
19
-
20
- ApplicationRecord.transaction do
21
- step :apply_changes
22
- step :save_transfer
23
- end
24
-
25
- run_hooks :after_update
26
- success(stock_transfer.reload)
18
+ edit
27
19
  end
28
20
 
29
21
  private
30
22
 
31
- def ensure_editable
32
- return if stock_transfer.editable?
33
-
34
- failure(stock_transfer, Spree.t('stock_transfer.errors.not_editable'))
35
- end
36
-
37
- # A whole-list replacement rather than a per-line diff: a draft's lines
38
- # are what the merchant is still deciding, and sending the list they
39
- # want is simpler for a client than working out which rows to delete.
40
- def apply_changes
41
- stock_transfer.assign_attributes(attributes) if attributes.present?
42
- return if items.nil?
43
-
44
- stock_transfer.items.destroy_all
45
- Array(items).each do |item|
46
- stock_transfer.items.build(variant: item[:variant], quantity_shipped: item[:quantity_shipped])
47
- end
48
- end
49
-
50
- def save_transfer
51
- failure(stock_transfer) unless stock_transfer.save
52
- end
23
+ def receivable = stock_transfer
24
+ def item_attributes = %i[quantity_shipped]
53
25
  end
54
26
  end
55
27
  end
@@ -0,0 +1,180 @@
1
+ {
2
+ "AED": 2,
3
+ "AFN": 2,
4
+ "ALL": 2,
5
+ "AMD": 2,
6
+ "ANG": 2,
7
+ "AOA": 2,
8
+ "ARS": 2,
9
+ "AUD": 2,
10
+ "AWG": 2,
11
+ "AZN": 2,
12
+ "BAM": 2,
13
+ "BBD": 2,
14
+ "BDT": 2,
15
+ "BGN": 2,
16
+ "BHD": 3,
17
+ "BIF": 0,
18
+ "BMD": 2,
19
+ "BND": 2,
20
+ "BOB": 2,
21
+ "BRL": 2,
22
+ "BSD": 2,
23
+ "BTN": 2,
24
+ "BWP": 2,
25
+ "BYN": 2,
26
+ "BYR": 0,
27
+ "BZD": 2,
28
+ "CAD": 2,
29
+ "CDF": 2,
30
+ "CHF": 2,
31
+ "CLF": 4,
32
+ "CLP": 0,
33
+ "CNY": 2,
34
+ "COP": 2,
35
+ "CRC": 2,
36
+ "CUC": 2,
37
+ "CUP": 2,
38
+ "CVE": 2,
39
+ "CZK": 2,
40
+ "DJF": 0,
41
+ "DKK": 2,
42
+ "DOP": 2,
43
+ "DZD": 2,
44
+ "EEK": 2,
45
+ "EGP": 2,
46
+ "ERN": 2,
47
+ "ETB": 2,
48
+ "EUR": 2,
49
+ "FJD": 2,
50
+ "FKP": 2,
51
+ "GBP": 2,
52
+ "GEL": 2,
53
+ "GHS": 2,
54
+ "GIP": 2,
55
+ "GMD": 2,
56
+ "GNF": 0,
57
+ "GTQ": 2,
58
+ "GYD": 2,
59
+ "HKD": 2,
60
+ "HNL": 2,
61
+ "HRK": 2,
62
+ "HTG": 2,
63
+ "HUF": 2,
64
+ "IDR": 2,
65
+ "ILS": 2,
66
+ "INR": 2,
67
+ "IQD": 3,
68
+ "IRR": 2,
69
+ "ISK": 0,
70
+ "JMD": 2,
71
+ "JOD": 3,
72
+ "JPY": 0,
73
+ "KES": 2,
74
+ "KGS": 2,
75
+ "KHR": 2,
76
+ "KMF": 0,
77
+ "KPW": 2,
78
+ "KRW": 0,
79
+ "KWD": 3,
80
+ "KYD": 2,
81
+ "KZT": 2,
82
+ "LAK": 2,
83
+ "LBP": 2,
84
+ "LKR": 2,
85
+ "LRD": 2,
86
+ "LSL": 2,
87
+ "LTL": 2,
88
+ "LVL": 2,
89
+ "LYD": 3,
90
+ "MAD": 2,
91
+ "MDL": 2,
92
+ "MGA": 2,
93
+ "MKD": 2,
94
+ "MMK": 2,
95
+ "MNT": 2,
96
+ "MOP": 2,
97
+ "MRO": 2,
98
+ "MRU": 2,
99
+ "MTL": 2,
100
+ "MUR": 2,
101
+ "MVR": 2,
102
+ "MWK": 2,
103
+ "MXN": 2,
104
+ "MYR": 2,
105
+ "MZN": 2,
106
+ "NAD": 2,
107
+ "NGN": 2,
108
+ "NIO": 2,
109
+ "NOK": 2,
110
+ "NPR": 2,
111
+ "NZD": 2,
112
+ "OMR": 3,
113
+ "PAB": 2,
114
+ "PEN": 2,
115
+ "PGK": 2,
116
+ "PHP": 2,
117
+ "PKR": 2,
118
+ "PLN": 2,
119
+ "PYG": 0,
120
+ "QAR": 2,
121
+ "RON": 2,
122
+ "RSD": 2,
123
+ "RUB": 2,
124
+ "RWF": 0,
125
+ "SAR": 2,
126
+ "SBD": 2,
127
+ "SCR": 2,
128
+ "SDG": 2,
129
+ "SEK": 2,
130
+ "SGD": 2,
131
+ "SHP": 2,
132
+ "SKK": 2,
133
+ "SLE": 2,
134
+ "SLL": 2,
135
+ "SOS": 2,
136
+ "SRD": 2,
137
+ "SSP": 2,
138
+ "STD": 2,
139
+ "STN": 2,
140
+ "SVC": 2,
141
+ "SYP": 2,
142
+ "SZL": 2,
143
+ "THB": 2,
144
+ "TJS": 2,
145
+ "TMM": 2,
146
+ "TMT": 2,
147
+ "TND": 3,
148
+ "TOP": 2,
149
+ "TRY": 2,
150
+ "TTD": 2,
151
+ "TWD": 2,
152
+ "TZS": 2,
153
+ "UAH": 2,
154
+ "UGX": 0,
155
+ "USD": 2,
156
+ "UYI": 0,
157
+ "UYU": 2,
158
+ "UYW": 4,
159
+ "UZS": 2,
160
+ "VED": 2,
161
+ "VEF": 2,
162
+ "VES": 2,
163
+ "VND": 0,
164
+ "VUV": 0,
165
+ "WST": 2,
166
+ "XAF": 0,
167
+ "XCD": 2,
168
+ "XCG": 2,
169
+ "XOF": 0,
170
+ "XPF": 0,
171
+ "YER": 2,
172
+ "ZAR": 2,
173
+ "ZMK": 2,
174
+ "ZMW": 2,
175
+ "ZWD": 2,
176
+ "ZWG": 2,
177
+ "ZWL": 2,
178
+ "ZWN": 2,
179
+ "ZWR": 2
180
+ }
@@ -14,11 +14,13 @@ data:
14
14
  # adapter: I18n::Tasks::Data::FileSystem
15
15
 
16
16
  # Locale files or `Dir.glob` patterns where translations are read from:
17
+ ## This one config checks every Spree gem: core's keys are used from all of
18
+ ## them, and their own keys from core.
17
19
  read:
18
- ## Default:
19
- # - config/locales/%{locale}.yml
20
- ## More files:
21
- # - config/locales/**/*.%{locale}.yml
20
+ - config/locales/%{locale}.yml
21
+ <% %w[api emails].map { |gem| "../#{gem}" }.concat(Dir['../providers/*']).each do |gem| %>
22
+ - "<%= File.expand_path("#{gem}/config/locales", Dir.pwd) %>/%{locale}.yml"
23
+ <% end %>
22
24
 
23
25
  # Locale files to write new keys to, based on a list of key pattern => file rules. Matched from top to bottom:
24
26
  # `i18n-tasks normalize -p` will force move the keys according to these rules
@@ -52,9 +54,14 @@ data:
52
54
 
53
55
  # Find translate calls
54
56
  search:
55
- ## Paths or `Find.find` patterns to search in:
56
- # paths:
57
- # - app/
57
+ ## Paths or `Find.find` patterns to search in. Core keys are read by every
58
+ ## Spree gem, so all of them are searched.
59
+ paths:
60
+ - app/
61
+ - lib/
62
+ <% (%w[api emails dashboard opentelemetry].map { |gem| "../#{gem}" } + Dir['../providers/*']).product(%w[app lib]).each do |gem, folder| %>
63
+ - "<%= File.expand_path("#{gem}/#{folder}", Dir.pwd) %>"
64
+ <% end %>
58
65
 
59
66
  ## Root directories for relative keys resolution.
60
67
  # relative_roots:
@@ -143,12 +150,18 @@ ignore_missing:
143
150
  - 'unauthorized.default'
144
151
 
145
152
  ## Consider these keys used:
146
- # ignore_unused:
147
- # - 'activerecord.attributes.*'
148
- # - '{devise,kaminari,will_paginate}.*'
149
- # - 'simple_form.{yes,no}'
150
- # - 'simple_form.{placeholders,hints,labels}.*'
151
- # - 'simple_form.{error_notification,required}.:'
153
+ ignore_unused:
154
+ # Read by Rails itself (model names, attribute names, validation messages, formats).
155
+ - 'activerecord.*'
156
+ - 'activemodel.*'
157
+ - 'errors.*'
158
+ - 'number.*'
159
+ # Keys built with interpolation, which the scanner cannot follow.
160
+ - 'spree.reporting.*'
161
+ - 'spree.permissions_catalog.*'
162
+ # Spree::TypeLabels reads <family>_types.<api_type>.{name,description}.
163
+ - 'spree.{collection_rule,commission_rule,delivery_method_rule,order_routing_rule,promotion_action,promotion_rule,seller_requirement}_types.*'
164
+ - 'spree.i18n.this_file_language'
152
165
 
153
166
  ## Exclude these keys from the `i18n-tasks eq-base' report:
154
167
  # ignore_eq_base:
@@ -172,8 +185,9 @@ ignore_missing:
172
185
  # <%# I18n::Tasks.add_scanner 'I18n::Tasks::Scanners::PatternMapper',
173
186
  # only: %w(*.html.haml *.html.slim),
174
187
  # patterns: [['= title\b', '.page_title']] %>
175
- #
176
- # The PatternMapper can also match key literals via a special %{key} interpolation, e.g.:
177
- #
178
- # <%# I18n::Tasks.add_scanner 'I18n::Tasks::Scanners::PatternMapper',
179
- # patterns: [['\bSpree\.t[( ]\s*%{key}', 'spree.%{key}']] %>
188
+
189
+ # Email templates translate Spree keys with Liquid's `t` filter, and shared
190
+ # partials take a key to translate (`label: 'some.key', translate: true`).
191
+ <% I18n::Tasks.add_scanner 'I18n::Tasks::Scanners::PatternMapper',
192
+ only: %w(*.liquid),
193
+ patterns: [['%{key}\s*\|\s*t\b', 'spree.%{key}'], ['\blabel:\s*%{key}', 'spree.%{key}']] %>
@@ -0,0 +1,7 @@
1
+ Alba.backend = :oj_rails
2
+ Alba.inflector = :active_support
3
+
4
+ # Custom types
5
+ Alba.register_type :iso8601, converter: ->(time) { time&.iso8601(3) }, auto_convert: true
6
+ # Decimals and money rendered as their exact string form instead of JSON numbers
7
+ Alba.register_type :string, check: ->(value) { value.is_a?(String) }, converter: ->(value) { value.to_s }, auto_convert: true