spree_core 6.0.0.beta3 → 6.0.0.rc1

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 (495) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +2 -2
  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/seller_payouts/sweep_seller_job.rb +2 -0
  10. data/app/mailers/spree/admin_user_mailer.rb +4 -19
  11. data/app/mailers/spree/base_mailer.rb +96 -13
  12. data/app/mailers/spree/email_template_mailer.rb +27 -0
  13. data/app/mailers/spree/export_mailer.rb +3 -4
  14. data/app/mailers/spree/import_mailer.rb +3 -4
  15. data/app/mailers/spree/invitation_mailer.rb +24 -7
  16. data/app/mailers/spree/seller_user_mailer.rb +4 -16
  17. data/app/mailers/spree/webhook_mailer.rb +2 -2
  18. data/app/models/concerns/spree/acted_by.rb +1 -1
  19. data/app/models/concerns/spree/admin_user_methods.rb +13 -1
  20. data/app/models/concerns/spree/api_typed.rb +91 -0
  21. data/app/models/concerns/spree/calculator/tiers.rb +76 -0
  22. data/app/models/concerns/spree/customer_methods.rb +15 -14
  23. data/app/models/concerns/spree/email_template_identity.rb +52 -0
  24. data/app/models/concerns/spree/parameterizable_name.rb +2 -0
  25. data/app/models/concerns/spree/payment_session_transitions.rb +8 -2
  26. data/app/models/concerns/spree/post_sale/taxation.rb +54 -0
  27. data/app/models/concerns/spree/post_sale/taxed_line.rb +51 -0
  28. data/app/models/concerns/spree/preference_schema.rb +4 -12
  29. data/app/models/concerns/spree/product_scopes.rb +11 -1
  30. data/app/models/concerns/spree/provider_listing.rb +41 -0
  31. data/app/models/concerns/spree/publishable.rb +82 -14
  32. data/app/models/concerns/spree/purchase/addresses.rb +23 -10
  33. data/app/models/concerns/spree/purchase/currency.rb +1 -1
  34. data/app/models/concerns/spree/purchase/deprecated_aliases.rb +87 -0
  35. data/app/models/concerns/spree/purchase/gift_cards.rb +10 -4
  36. data/app/models/concerns/spree/purchase/locale.rb +1 -1
  37. data/app/models/concerns/spree/purchase/payment_processing.rb +7 -3
  38. data/app/models/concerns/spree/purchase/purchase_order.rb +2 -2
  39. data/app/models/concerns/spree/purchase/totals.rb +49 -1
  40. data/app/models/concerns/spree/receivable.rb +1 -1
  41. data/app/models/concerns/spree/searchable.rb +0 -4
  42. data/app/models/concerns/spree/secret_preferences.rb +59 -0
  43. data/app/models/concerns/spree/single_store_resource.rb +1 -1
  44. data/app/models/concerns/spree/stores/email_branding.rb +31 -0
  45. data/app/models/concerns/spree/type_labels.rb +38 -0
  46. data/app/models/concerns/spree/typed_adjustment_line.rb +1 -1
  47. data/app/models/concerns/spree/typed_associations.rb +6 -0
  48. data/app/models/spree/address.rb +11 -1
  49. data/app/models/spree/adjusters/promotion.rb +1 -15
  50. data/app/models/spree/allowed_origin.rb +0 -1
  51. data/app/models/spree/api_key.rb +5 -6
  52. data/app/models/spree/authentication/strategies/oidc_strategy.rb +5 -5
  53. data/app/models/spree/base.rb +70 -22
  54. data/app/models/spree/calculator/flat_percent_item_total.rb +1 -3
  55. data/app/models/spree/calculator/flat_rate.rb +1 -3
  56. data/app/models/spree/calculator/flexi_rate.rb +1 -3
  57. data/app/models/spree/calculator/percent_on_line_item.rb +1 -1
  58. data/app/models/spree/calculator/price_sack.rb +1 -3
  59. data/app/models/spree/calculator/shipping/digital_delivery.rb +1 -3
  60. data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +1 -3
  61. data/app/models/spree/calculator/shipping/flat_rate.rb +1 -3
  62. data/app/models/spree/calculator/shipping/flexi_rate.rb +1 -3
  63. data/app/models/spree/calculator/shipping/per_item.rb +1 -3
  64. data/app/models/spree/calculator/shipping/price_sack.rb +1 -3
  65. data/app/models/spree/calculator/tiered_flat_rate.rb +6 -23
  66. data/app/models/spree/calculator/tiered_percent.rb +7 -25
  67. data/app/models/spree/cart.rb +78 -18
  68. data/app/models/spree/channel/gating.rb +1 -1
  69. data/app/models/spree/channel.rb +4 -4
  70. data/app/models/spree/claim.rb +21 -1
  71. data/app/models/spree/claim_line_item.rb +41 -6
  72. data/app/models/spree/collection.rb +0 -1
  73. data/app/models/spree/collection_rule.rb +5 -21
  74. data/app/models/spree/commission_line.rb +1 -1
  75. data/app/models/spree/commission_rate.rb +2 -3
  76. data/app/models/spree/commission_rate_value.rb +1 -1
  77. data/app/models/spree/commission_rule.rb +4 -11
  78. data/app/models/spree/commission_rules/product_rule.rb +1 -1
  79. data/app/models/spree/company_invitation.rb +1 -0
  80. data/app/models/spree/consent_record.rb +0 -1
  81. data/app/models/spree/credit_card.rb +1 -1
  82. data/app/models/spree/current.rb +23 -0
  83. data/app/models/spree/custom_field.rb +2 -2
  84. data/app/models/spree/custom_field_definition.rb +9 -23
  85. data/app/models/spree/custom_fields/boolean.rb +1 -1
  86. data/app/models/spree/custom_fields/json.rb +1 -1
  87. data/app/models/spree/data_feed/google.rb +0 -2
  88. data/app/models/spree/data_request.rb +1 -1
  89. data/app/models/spree/delivery_method.rb +30 -13
  90. data/app/models/spree/delivery_method_rule.rb +4 -11
  91. data/app/models/spree/delivery_rate.rb +4 -5
  92. data/app/models/spree/delivery_rate_provider/base.rb +1 -0
  93. data/app/models/spree/delivery_zone.rb +0 -1
  94. data/app/models/spree/delivery_zone_member.rb +4 -4
  95. data/app/models/spree/digital_asset.rb +7 -0
  96. data/app/models/spree/digital_asset_provider/base.rb +2 -0
  97. data/app/models/spree/digital_link.rb +2 -5
  98. data/app/models/spree/discount.rb +1 -1
  99. data/app/models/spree/email_template.rb +25 -0
  100. data/app/models/spree/email_template_draft.rb +13 -0
  101. data/app/models/spree/email_template_revision.rb +17 -0
  102. data/app/models/spree/email_templates/entry.rb +118 -0
  103. data/app/models/spree/email_templates/sample_record.rb +16 -0
  104. data/app/models/spree/emails/branding.rb +80 -0
  105. data/app/models/spree/exchange.rb +15 -1
  106. data/app/models/spree/exchange_line_item.rb +121 -5
  107. data/app/models/spree/export.rb +0 -1
  108. data/app/models/spree/exports/products.rb +10 -1
  109. data/app/models/spree/exports/report.rb +1 -1
  110. data/app/models/spree/fee.rb +4 -2
  111. data/app/models/spree/fulfillment.rb +53 -27
  112. data/app/models/spree/fulfillment_changer.rb +2 -2
  113. data/app/models/spree/fulfillment_item.rb +0 -4
  114. data/app/models/spree/fulfillment_provider/base.rb +1 -0
  115. data/app/models/spree/gateway/bogus.rb +4 -0
  116. data/app/models/spree/gateway/custom_payment_source_method.rb +5 -0
  117. data/app/models/spree/gateway.rb +5 -1
  118. data/app/models/spree/gift_card.rb +12 -1
  119. data/app/models/spree/gift_card_batch.rb +0 -1
  120. data/app/models/spree/import.rb +2 -7
  121. data/app/models/spree/import_mapping.rb +1 -2
  122. data/app/models/spree/import_row.rb +2 -2
  123. data/app/models/spree/import_schemas/products.rb +1 -0
  124. data/app/models/spree/integration.rb +8 -18
  125. data/app/models/spree/invitation.rb +5 -5
  126. data/app/models/spree/line_item.rb +13 -2
  127. data/app/models/spree/locale.rb +11 -8
  128. data/app/models/spree/market.rb +1 -0
  129. data/app/models/spree/newsletter_subscriber.rb +3 -0
  130. data/app/models/spree/order.rb +56 -138
  131. data/app/models/spree/order_group.rb +11 -2
  132. data/app/models/spree/order_inventory.rb +10 -5
  133. data/app/models/spree/order_promotion.rb +1 -1
  134. data/app/models/spree/order_routing/has_strategy_preference.rb +1 -1
  135. data/app/models/spree/order_routing/strategy/base.rb +4 -2
  136. data/app/models/spree/order_routing/strategy/rules.rb +1 -1
  137. data/app/models/spree/order_routing_rule.rb +6 -22
  138. data/app/models/spree/package_type.rb +1 -2
  139. data/app/models/spree/payment/gateway_options.rb +14 -52
  140. data/app/models/spree/payment/processing.rb +2 -4
  141. data/app/models/spree/payment.rb +20 -5
  142. data/app/models/spree/payment_method/session_instrumentation.rb +1 -0
  143. data/app/models/spree/payment_method/store_credit.rb +4 -4
  144. data/app/models/spree/payment_method.rb +36 -4
  145. data/app/models/spree/payment_session.rb +5 -1
  146. data/app/models/spree/payment_setup_session.rb +1 -0
  147. data/app/models/spree/payout_provider/base.rb +3 -1
  148. data/app/models/spree/pickup_point_provider/base.rb +2 -0
  149. data/app/models/spree/price_list.rb +1 -2
  150. data/app/models/spree/price_rules/channel_rule.rb +1 -1
  151. data/app/models/spree/price_rules/customer_group_rule.rb +1 -1
  152. data/app/models/spree/product.rb +31 -7
  153. data/app/models/spree/product_submission.rb +0 -12
  154. data/app/models/spree/product_type.rb +0 -1
  155. data/app/models/spree/promotion/actions/create_line_items.rb +27 -17
  156. data/app/models/spree/promotion/rules/category.rb +0 -4
  157. data/app/models/spree/promotion/rules/channel.rb +0 -4
  158. data/app/models/spree/promotion/rules/country.rb +0 -4
  159. data/app/models/spree/promotion/rules/currency.rb +0 -4
  160. data/app/models/spree/promotion/rules/customer_group.rb +0 -4
  161. data/app/models/spree/promotion/rules/first_order.rb +0 -4
  162. data/app/models/spree/promotion/rules/item_total.rb +4 -8
  163. data/app/models/spree/promotion/rules/market.rb +0 -4
  164. data/app/models/spree/promotion/rules/one_use_per_user.rb +0 -4
  165. data/app/models/spree/promotion/rules/option_value.rb +0 -3
  166. data/app/models/spree/promotion/rules/product.rb +0 -4
  167. data/app/models/spree/promotion/rules/user.rb +0 -4
  168. data/app/models/spree/promotion/rules/user_logged_in.rb +0 -4
  169. data/app/models/spree/promotion.rb +35 -6
  170. data/app/models/spree/promotion_action.rb +7 -14
  171. data/app/models/spree/promotion_action_line_item.rb +1 -1
  172. data/app/models/spree/promotion_handler/coupon.rb +59 -27
  173. data/app/models/spree/promotion_rule.rb +7 -14
  174. data/app/models/spree/purchase_order.rb +1 -0
  175. data/app/models/spree/quantity_rule.rb +1 -1
  176. data/app/models/spree/refund.rb +28 -3
  177. data/app/models/spree/return.rb +30 -2
  178. data/app/models/spree/return_line_item.rb +65 -14
  179. data/app/models/spree/role.rb +7 -7
  180. data/app/models/spree/saved_report.rb +1 -1
  181. data/app/models/spree/seller.rb +2 -1
  182. data/app/models/spree/seller_payout.rb +7 -0
  183. data/app/models/spree/seller_requirement.rb +4 -12
  184. data/app/models/spree/seller_requirement_custom_field.rb +1 -2
  185. data/app/models/spree/seller_requirement_submission.rb +2 -2
  186. data/app/models/spree/seller_requirements/accept_terms.rb +2 -3
  187. data/app/models/spree/seller_transfer.rb +5 -0
  188. data/app/models/spree/shipping_label.rb +1 -0
  189. data/app/models/spree/stock/availability_validator.rb +2 -2
  190. data/app/models/spree/stock/inventory_unit_builder.rb +1 -1
  191. data/app/models/spree/stock/packer.rb +2 -2
  192. data/app/models/spree/stock/splitter/weight.rb +1 -1
  193. data/app/models/spree/stock_level/custom_events.rb +6 -0
  194. data/app/models/spree/stock_level.rb +1 -1
  195. data/app/models/spree/stock_movement.rb +1 -1
  196. data/app/models/spree/stock_receipt_item.rb +1 -1
  197. data/app/models/spree/stock_reservation.rb +2 -2
  198. data/app/models/spree/stock_transfer.rb +4 -2
  199. data/app/models/spree/store.rb +33 -7
  200. data/app/models/spree/store_credit.rb +8 -9
  201. data/app/models/spree/store_credit_event.rb +5 -5
  202. data/app/models/spree/tax_exemption_certificate.rb +2 -0
  203. data/app/models/spree/tax_identifier.rb +3 -1
  204. data/app/models/spree/tax_line.rb +53 -3
  205. data/app/models/spree/tax_provider/base.rb +71 -14
  206. data/app/models/spree/tax_provider/internal.rb +59 -33
  207. data/app/models/spree/tax_provider/recorded_share.rb +114 -0
  208. data/app/models/spree/tax_rate.rb +1 -2
  209. data/app/models/spree/taxonomy.rb +0 -1
  210. data/app/models/spree/variant.rb +4 -3
  211. data/app/models/spree/variant_media.rb +1 -1
  212. data/app/models/spree/webhook_endpoint.rb +10 -13
  213. data/app/models/spree/wishlist.rb +1 -6
  214. data/app/models/spree/wishlist_item/custom_events.rb +6 -0
  215. data/app/presenters/spree/csv/customer_presenter.rb +1 -1
  216. data/app/presenters/spree/csv/newsletter_subscriber_presenter.rb +1 -1
  217. data/app/presenters/spree/csv/order_line_item_presenter.rb +1 -1
  218. data/app/presenters/spree/csv/product_variant_presenter.rb +42 -12
  219. data/app/serializers/spree/emails/base_serializer.rb +14 -0
  220. data/app/serializers/spree/emails/export_serializer.rb +13 -0
  221. data/app/serializers/spree/emails/import_serializer.rb +19 -0
  222. data/app/serializers/spree/emails/invitation_serializer.rb +28 -0
  223. data/app/serializers/spree/emails/store_serializer.rb +31 -0
  224. data/app/serializers/spree/emails/user_serializer.rb +12 -0
  225. data/app/serializers/spree/emails/webhook_endpoint_serializer.rb +16 -0
  226. data/app/services/spree/carts/create.rb +8 -2
  227. data/app/services/spree/carts/destroy.rb +2 -2
  228. data/app/services/spree/carts/remove_out_of_stock_items.rb +2 -2
  229. data/app/services/spree/carts/split_by_seller.rb +1 -1
  230. data/app/services/spree/carts/update.rb +19 -5
  231. data/app/services/spree/catalogs/set_product_terms.rb +1 -1
  232. data/app/services/spree/categories/add_products.rb +13 -31
  233. data/app/services/spree/categories/remove_products.rb +12 -51
  234. data/app/services/spree/checkout/advance.rb +1 -4
  235. data/app/services/spree/collections/add_products.rb +10 -23
  236. data/app/services/spree/collections/remove_products.rb +7 -43
  237. data/app/services/spree/coupon_codes/bulk_generate.rb +8 -14
  238. data/app/services/spree/data_requests/create.rb +1 -1
  239. data/app/services/spree/deliveries/destroy.rb +2 -2
  240. data/app/services/spree/email_templates/check.rb +58 -0
  241. data/app/services/spree/email_templates/no_sample_record.rb +7 -0
  242. data/app/services/spree/email_templates/preview.rb +99 -0
  243. data/app/services/spree/emails/file_system.rb +23 -0
  244. data/app/services/spree/emails/filters.rb +84 -0
  245. data/app/services/spree/emails/liquid_context.rb +48 -0
  246. data/app/services/spree/emails/rendered_email.rb +14 -0
  247. data/app/services/spree/emails/renderer.rb +125 -0
  248. data/app/services/spree/emails/template.rb +51 -0
  249. data/app/services/spree/emails/template_data.rb +23 -0
  250. data/app/services/spree/emails/template_resolver.rb +109 -0
  251. data/app/services/spree/emails/text_converter.rb +72 -0
  252. data/app/services/spree/emails/translation_inliner.rb +134 -0
  253. data/app/services/spree/imports/row_processors/price_list_price.rb +10 -10
  254. data/app/services/spree/imports/row_processors/product_variant.rb +65 -34
  255. data/app/services/spree/imports/row_processors/purchase_order.rb +13 -13
  256. data/app/services/spree/locales.rb +4 -5
  257. data/app/services/spree/newsletter/subscribe.rb +8 -12
  258. data/app/services/spree/orders/build_fulfillments.rb +3 -2
  259. data/app/services/spree/orders/create.rb +2 -1
  260. data/app/services/spree/orders/discounts/create.rb +7 -4
  261. data/app/services/spree/orders/discounts/destroy.rb +1 -0
  262. data/app/services/spree/orders/discounts/update.rb +1 -0
  263. data/app/services/spree/orders/fees/create.rb +1 -0
  264. data/app/services/spree/orders/fees/destroy.rb +1 -0
  265. data/app/services/spree/orders/fees/update.rb +1 -0
  266. data/app/services/spree/orders/remove_line_item.rb +13 -3
  267. data/app/services/spree/orders/update.rb +10 -6
  268. data/app/services/spree/orders/update_item.rb +6 -3
  269. data/app/services/spree/orders/update_statuses.rb +3 -1
  270. data/app/services/spree/product_memberships.rb +61 -0
  271. data/app/services/spree/returns/eligibility_validator.rb +1 -1
  272. data/app/services/spree/search_provider/custom_field_schema.rb +2 -2
  273. data/app/services/spree/seeds/commission_rates.rb +1 -1
  274. data/app/services/spree/seeds/digital_delivery.rb +1 -1
  275. data/app/services/spree/seeds/payment_methods.rb +2 -2
  276. data/app/services/spree/seeds/saved_reports.rb +3 -3
  277. data/app/services/spree/sellers/requirements.rb +1 -2
  278. data/app/services/spree/shipping_labels/confirm_refund.rb +1 -1
  279. data/app/services/spree/shipping_labels/store_file.rb +3 -3
  280. data/app/services/spree/stock_levels/correct.rb +3 -3
  281. data/app/services/spree/stock_reservations/reserve.rb +2 -3
  282. data/app/services/spree/store_credits/apply.rb +15 -13
  283. data/app/services/spree/stores/provision_defaults.rb +15 -14
  284. data/app/subscribers/spree/seller_onboarding_subscriber.rb +1 -1
  285. data/app/views/layouts/spree/base_mailer.html.erb +2 -43
  286. data/app/views/layouts/spree/base_mailer.liquid +79 -0
  287. data/app/views/spree/admin_user_mailer/password_reset_email.liquid +14 -0
  288. data/app/views/spree/export_mailer/export_done.liquid +12 -0
  289. data/app/views/spree/import_mailer/import_done.liquid +15 -0
  290. data/app/views/spree/invitation_mailer/invitation_accepted.liquid +9 -0
  291. data/app/views/spree/invitation_mailer/invitation_email.liquid +13 -0
  292. data/app/views/spree/seller_user_mailer/password_reset_email.liquid +14 -0
  293. data/app/views/spree/shared/_mailer_button.html.erb +4 -5
  294. data/app/views/spree/shared/_mailer_hero.html.erb +6 -5
  295. data/app/views/spree/shared/_summary_row.liquid +8 -0
  296. data/app/views/spree/webhook_mailer/endpoint_disabled.liquid +21 -0
  297. data/app/workflows/spree/carts/add_item.rb +4 -4
  298. data/app/workflows/spree/carts/complete.rb +13 -3
  299. data/app/workflows/spree/carts/merge.rb +1 -1
  300. data/app/workflows/spree/carts/recalculate_totals.rb +5 -0
  301. data/app/workflows/spree/carts/upsert_items.rb +18 -9
  302. data/app/workflows/spree/claims/approve.rb +5 -22
  303. data/app/workflows/spree/claims/cancel.rb +5 -21
  304. data/app/workflows/spree/claims/create.rb +15 -0
  305. data/app/workflows/spree/claims/deny.rb +7 -0
  306. data/app/workflows/spree/claims/resolve.rb +34 -31
  307. data/app/workflows/spree/customers/anonymize.rb +3 -4
  308. data/app/workflows/spree/customers/create.rb +1 -1
  309. data/app/workflows/spree/data_requests/fulfill.rb +2 -2
  310. data/app/workflows/spree/deliveries/update_tracking.rb +1 -1
  311. data/app/workflows/spree/email_templates/discard_draft.rb +20 -0
  312. data/app/workflows/spree/email_templates/publish.rb +70 -0
  313. data/app/workflows/spree/email_templates/restore_revision.rb +33 -0
  314. data/app/workflows/spree/email_templates/revert.rb +29 -0
  315. data/app/workflows/spree/email_templates/save_draft.rb +85 -0
  316. data/app/workflows/spree/exchanges/approve.rb +5 -22
  317. data/app/workflows/spree/exchanges/cancel.rb +5 -21
  318. data/app/workflows/spree/exchanges/create.rb +6 -0
  319. data/app/workflows/spree/exchanges/fulfill.rb +75 -51
  320. data/app/workflows/spree/exchanges/receive.rb +6 -65
  321. data/app/workflows/spree/fulfillments/cancel.rb +1 -1
  322. data/app/workflows/spree/fulfillments/create.rb +51 -47
  323. data/app/workflows/spree/fulfillments/fulfill.rb +23 -27
  324. data/app/workflows/spree/fulfillments/mark_delivered.rb +1 -1
  325. data/app/workflows/spree/fulfillments/replacements.rb +59 -0
  326. data/app/workflows/spree/gift_cards/apply.rb +2 -2
  327. data/app/workflows/spree/orders/add_item.rb +5 -1
  328. data/app/workflows/spree/orders/cancel.rb +3 -3
  329. data/app/workflows/spree/orders/complete.rb +16 -8
  330. data/app/workflows/spree/payments/process.rb +2 -2
  331. data/app/workflows/spree/post_sale/approval.rb +35 -0
  332. data/app/workflows/spree/post_sale/cancellation.rb +44 -0
  333. data/app/workflows/spree/post_sale/receipt.rb +92 -0
  334. data/app/workflows/spree/products/nested_attributes.rb +1 -1
  335. data/app/workflows/spree/purchase_orders/cancel.rb +1 -1
  336. data/app/workflows/spree/purchase_orders/close.rb +3 -31
  337. data/app/workflows/spree/purchase_orders/mark_draft.rb +2 -2
  338. data/app/workflows/spree/purchase_orders/mark_ordered.rb +2 -2
  339. data/app/workflows/spree/purchase_orders/receive.rb +1 -1
  340. data/app/workflows/spree/purchase_orders/update.rb +5 -34
  341. data/app/workflows/spree/receivables/closing_short.rb +46 -0
  342. data/app/workflows/spree/receivables/draft_editing.rb +48 -0
  343. data/app/workflows/spree/refunds/create.rb +5 -2
  344. data/app/workflows/spree/refunds/order_payments.rb +14 -2
  345. data/app/workflows/spree/refunds/tax_credit.rb +67 -0
  346. data/app/workflows/spree/returns/approve.rb +5 -22
  347. data/app/workflows/spree/returns/cancel.rb +5 -22
  348. data/app/workflows/spree/returns/create.rb +8 -0
  349. data/app/workflows/spree/returns/receive.rb +5 -76
  350. data/app/workflows/spree/returns/refund.rb +31 -8
  351. data/app/workflows/spree/seller_requirement_submissions/create.rb +1 -2
  352. data/app/workflows/spree/seller_transfers/reverse.rb +28 -1
  353. data/app/workflows/spree/shipping_labels/purchase.rb +8 -8
  354. data/app/workflows/spree/shipping_labels/record.rb +5 -5
  355. data/app/workflows/spree/shipping_labels/refund.rb +2 -2
  356. data/app/workflows/spree/stock_receipts/recording.rb +4 -4
  357. data/app/workflows/spree/stock_transfers/cancel.rb +2 -2
  358. data/app/workflows/spree/stock_transfers/close.rb +3 -30
  359. data/app/workflows/spree/stock_transfers/mark_draft.rb +1 -1
  360. data/app/workflows/spree/stock_transfers/mark_in_transit.rb +3 -3
  361. data/app/workflows/spree/stock_transfers/mark_ready.rb +2 -2
  362. data/app/workflows/spree/stock_transfers/receive.rb +1 -1
  363. data/app/workflows/spree/stock_transfers/update.rb +5 -33
  364. data/config/i18n-tasks.yml +32 -18
  365. data/config/initializers/alba.rb +7 -0
  366. data/config/language_names.csv +264 -0
  367. data/config/locales/ar.yml +811 -0
  368. data/config/locales/be.yml +855 -0
  369. data/config/locales/bg.yml +723 -0
  370. data/config/locales/ca.yml +689 -0
  371. data/config/locales/cs.yml +855 -0
  372. data/config/locales/da.yml +771 -0
  373. data/config/locales/de-CH.yml +248 -0
  374. data/config/locales/de.yml +835 -0
  375. data/config/locales/el.yml +769 -0
  376. data/config/locales/en.yml +37 -503
  377. data/config/locales/es-CL.yml +301 -0
  378. data/config/locales/es-EC.yml +186 -0
  379. data/config/locales/es-MX.yml +334 -0
  380. data/config/locales/es.yml +831 -0
  381. data/config/locales/et.yml +644 -0
  382. data/config/locales/fa.yml +709 -0
  383. data/config/locales/fi.yml +771 -0
  384. data/config/locales/fr.yml +830 -0
  385. data/config/locales/hu.yml +751 -0
  386. data/config/locales/id.yml +756 -0
  387. data/config/locales/it.yml +833 -0
  388. data/config/locales/ja.yml +726 -0
  389. data/config/locales/km.yml +759 -0
  390. data/config/locales/ko.yml +575 -0
  391. data/config/locales/ku.yml +753 -0
  392. data/config/locales/lt.yml +821 -0
  393. data/config/locales/lv.yml +685 -0
  394. data/config/locales/nb.yml +824 -0
  395. data/config/locales/ne.yml +823 -0
  396. data/config/locales/nl.yml +826 -0
  397. data/config/locales/pl.yml +835 -0
  398. data/config/locales/pt-BR.yml +547 -0
  399. data/config/locales/pt.yml +636 -0
  400. data/config/locales/ro.yml +750 -0
  401. data/config/locales/ru.yml +834 -0
  402. data/config/locales/sk.yml +680 -0
  403. data/config/locales/sl-SI.yml +600 -0
  404. data/config/locales/sv.yml +827 -0
  405. data/config/locales/th.yml +745 -0
  406. data/config/locales/tr.yml +777 -0
  407. data/config/locales/uk.yml +836 -0
  408. data/config/locales/vi.yml +768 -0
  409. data/config/locales/zh-CN.yml +786 -0
  410. data/config/locales/zh-TW.yml +834 -0
  411. data/db/migrate/20260925000001_add_replacement_to_spree_fulfillment_items.rb +5 -0
  412. data/db/migrate/20261001000001_add_post_sale_tax.rb +30 -0
  413. data/db/migrate/20261001000001_convert_preferences_to_json.rb +166 -0
  414. data/db/migrate/20261001000001_create_spree_email_templates.rb +52 -0
  415. data/lib/generators/spree/dummy/dummy_generator.rb +0 -9
  416. data/lib/generators/spree/dummy/templates/rails/test.rb +7 -0
  417. data/lib/spree/checkout/default_requirements.rb +37 -13
  418. data/lib/spree/core/configuration.rb +1 -1
  419. data/lib/spree/core/controller_helpers/store.rb +1 -1
  420. data/lib/spree/core/dependencies.rb +5 -4
  421. data/lib/spree/core/emails/escaped_output.rb +60 -0
  422. data/lib/spree/core/engine.rb +48 -167
  423. data/lib/spree/core/permissions/default_catalog.rb +5 -0
  424. data/lib/spree/core/preferences/json_conversion.rb +182 -0
  425. data/lib/spree/core/preferences/masking.rb +4 -1
  426. data/lib/spree/core/preferences/preferable.rb +137 -83
  427. data/lib/spree/core/preferences/preferable_class_methods.rb +81 -146
  428. data/lib/spree/core/previews/import_preview.rb +10 -0
  429. data/lib/spree/core/tax/provider_error.rb +37 -0
  430. data/lib/spree/core/version.rb +1 -1
  431. data/lib/spree/core.rb +85 -370
  432. data/lib/spree/emails/editable_templates.rb +82 -0
  433. data/lib/spree/events/catalog.rb +189 -0
  434. data/lib/spree/events.rb +21 -1
  435. data/lib/spree/hooks.rb +0 -17
  436. data/lib/spree/i18n.rb +32 -15
  437. data/lib/spree/reporting/adapters/live.rb +6 -6
  438. data/lib/spree/reporting/default_vocabulary.rb +22 -10
  439. data/lib/spree/reporting/hydration.rb +1 -1
  440. data/lib/spree/reporting/query.rb +8 -0
  441. data/lib/spree/reporting/schema.rb +10 -10
  442. data/lib/spree/testing_support/editable_email_templates.rb +61 -0
  443. data/lib/spree/testing_support/emails.rb +22 -0
  444. data/lib/spree/testing_support/factories/cart_factory.rb +1 -1
  445. data/lib/spree/testing_support/factories/email_template_factory.rb +28 -0
  446. data/lib/spree/testing_support/factories/order_factory.rb +2 -2
  447. data/lib/spree/testing_support/factories/refund_factory.rb +1 -1
  448. data/lib/spree/testing_support/factories/stock_factory.rb +1 -1
  449. data/lib/spree/testing_support/factories/variant_factory.rb +1 -1
  450. data/lib/spree/testing_support/i18n.rb +3 -94
  451. data/lib/spree/testing_support/lifecycle_events.rb +1 -1
  452. data/lib/spree/testing_support/order_walkthrough.rb +1 -1
  453. data/lib/spree/testing_support/preferences.rb +0 -5
  454. data/lib/spree/testing_support/store.rb +9 -1
  455. data/lib/spree/upgrades/5_6_to_6_0/manifest.yml +45 -0
  456. data/lib/tasks/categories_and_collections.rake +3 -3
  457. data/lib/tasks/core.rake +6 -4
  458. data/lib/tasks/media.rake +3 -3
  459. data/lib/tasks/package_types.rake +1 -1
  460. data/lib/tasks/preferences_json.rake +101 -0
  461. data/spec/fixtures/mailer_views/custom_views_probe_mailer/welcome_email.html.erb +4 -0
  462. metadata +188 -44
  463. data/app/models/acts_as_taggable_on/tag_decorator.rb +0 -10
  464. data/app/models/concerns/spree/has_image_alt_text.rb +0 -18
  465. data/app/models/spree/base_analytics_event_handler.rb +0 -54
  466. data/app/models/spree/invitations/store.rb +0 -6
  467. data/app/models/spree/preference.rb +0 -14
  468. data/app/models/spree/promotion_handler/page.rb +0 -25
  469. data/app/models/spree/promotion_handler/promotion_duplicator.rb +0 -60
  470. data/app/models/spree/stock/differentiator.rb +0 -45
  471. data/app/presenters/spree/filters/options_presenter.rb +0 -47
  472. data/app/services/spree/carts/empty.rb +0 -42
  473. data/app/services/spree/country_to_timezone.rb +0 -273
  474. data/app/services/spree/payments/create.rb +0 -92
  475. data/app/validators/spree/url_validator.rb +0 -23
  476. data/app/views/active_storage/blobs/_blob.html.erb +0 -14
  477. data/app/views/spree/admin_user_mailer/password_reset_email.html.erb +0 -8
  478. data/app/views/spree/export_mailer/export_done.html.erb +0 -7
  479. data/app/views/spree/import_mailer/import_done.html.erb +0 -12
  480. data/app/views/spree/invitation_mailer/invitation_accepted.html.erb +0 -4
  481. data/app/views/spree/invitation_mailer/invitation_email.html.erb +0 -12
  482. data/app/views/spree/seller_user_mailer/password_reset_email.html.erb +0 -8
  483. data/app/views/spree/shared/_base_mailer_footer.html.erb +0 -19
  484. data/app/views/spree/shared/_base_mailer_header.html.erb +0 -8
  485. data/app/views/spree/shared/_base_mailer_stylesheets.html.erb +0 -399
  486. data/app/views/spree/shared/_mailer_logo.html.erb +0 -41
  487. data/app/views/spree/shared/_purchased_items_styles.html.erb +0 -119
  488. data/app/views/spree/webhook_mailer/endpoint_disabled.html.erb +0 -51
  489. data/app/views/spree/webhook_mailer/endpoint_disabled.text.erb +0 -10
  490. data/app/workflows/spree/fulfillments/purchase_label.rb +0 -40
  491. data/app/workflows/spree/returns/purchase_label.rb +0 -32
  492. data/lib/spree/analytics.rb +0 -11
  493. data/lib/spree/core/preferences/scoped_store.rb +0 -34
  494. data/lib/spree/core/preferences/store.rb +0 -105
  495. data/lib/spree/translation_migrations.rb +0 -52
@@ -0,0 +1,768 @@
1
+ ---
2
+ vi:
3
+ activemodel:
4
+ errors:
5
+ messages:
6
+ blank: không được để trống
7
+ activerecord:
8
+ attributes:
9
+ spree/address:
10
+ address1: Địa chỉ
11
+ address2: Địa chỉ (tiếp)
12
+ city: Thành phố
13
+ company: Công ty
14
+ country: Quốc gia
15
+ label: Tên địa chỉ
16
+ phone: Điện thoại
17
+ state: Bang
18
+ spree/calculator/tiered_flat_rate:
19
+ preferred_base_amount: Số Lượng Cơ Bản Ưu Tiên
20
+ preferred_tiers: Các Cấp Độ Ưu Tiên
21
+ spree/calculator/tiered_percent:
22
+ preferred_base_percent: Phần Trăm Cơ Bản Ưu Tiên
23
+ preferred_tiers: Các Cấp Độ Ưu Tiên
24
+ spree/country:
25
+ iso: ISO
26
+ iso3: ISO3
27
+ iso_name: Tên ISO
28
+ name: Tên
29
+ numcode: Mã ISO
30
+ spree/credit_card:
31
+ cc_type: Kiểu
32
+ month: Tháng
33
+ name: Tên Chủ Thẻ
34
+ number: Số
35
+ verification_value: Thông số kiểm tra
36
+ year: Năm
37
+ spree/customer_group:
38
+ description: Mô tả
39
+ name: Tên
40
+ spree/gift_card:
41
+ amount_used: Số tiền đã dùng
42
+ expires_at: Hết hạn vào
43
+ spree/import:
44
+ preferred_delimiter: Dấu phân cách
45
+ spree/import_mapping:
46
+ file_column: Cột tệp
47
+ schema_field: Trường lược đồ
48
+ spree/import_row:
49
+ row_number: Số
50
+ spree/inventory_unit:
51
+ state: Bang
52
+ spree/invitation:
53
+ inviter: Người mời
54
+ spree/line_item:
55
+ price: Giá
56
+ quantity: Số lượng
57
+ spree/option_type:
58
+ filterable: Có thể lọc
59
+ kind: Loại
60
+ name: Tên
61
+ spree/option_value:
62
+ color_code: Mã màu
63
+ image: Ảnh mẫu màu
64
+ spree/order:
65
+ checkout_complete: Thanh toán hoàn tất
66
+ completed_at: Hoàn tất lúc
67
+ considered_risky: Tình trảng rủi ro
68
+ coupon_code: Mã Giảm Giá
69
+ created_at: Ngày đặt hàng
70
+ email: Email của khách hàng
71
+ internal_note: Ghi chú nội bộ
72
+ ip_address: Địa chỉ IP
73
+ item_count: Sản phẩm
74
+ item_total: Tổng sản phẩm
75
+ number: Mã Đơn Hàng
76
+ payment_state: Trạng thái thanh toán
77
+ shipment_state: Trạng thái giao hàng
78
+ special_instructions: Chỉ dẫn đặc biệt
79
+ state: Bang
80
+ total: Tổng
81
+ spree/order/bill_address:
82
+ address1: Đỉa chị thanh toán - tên đường
83
+ city: Đỉa chị thanh toán - thành phố
84
+ phone: Đỉa chị thanh toán - ĐT
85
+ state: Đỉa chị thanh toán - bang
86
+ spree/order/ship_address:
87
+ address1: Đỉa chị giao hàng - tên đường
88
+ city: Đỉa chị giao hàng - thành phố
89
+ phone: Đỉa chị giao hàng - ĐT
90
+ state: Đỉa chị giao hàng - bang
91
+ spree/payment:
92
+ amount: Giá trị
93
+ number: Số
94
+ spree/payment_method:
95
+ name: Tên phương thức thanh toán
96
+ spree/policy:
97
+ body: Nội dung
98
+ owner: Chính sách cho
99
+ spree/price_list:
100
+ description: Mô tả
101
+ ends_at: Kết thúc vào
102
+ match_policy: Chính sách khớp
103
+ name: Tên
104
+ priority: Mức ưu tiên
105
+ starts_at: Bắt đầu vào
106
+ status: Trạng thái
107
+ spree/price_rule:
108
+ priority: Mức ưu tiên
109
+ type: Loại
110
+ spree/product:
111
+ available_on: Có hiệu lực vào lúc
112
+ cost_currency: Tiền tệ
113
+ cost_price: Giá nhập
114
+ description: Mô tả sản phẩm
115
+ discontinue_on: Ngừng kinh doanh vào
116
+ less_than: Nhỏ hơn
117
+ make_active_at: Kích hoạt vào
118
+ master_price: Giá bán
119
+ more_than: Lớn hơn
120
+ name: Tên sản phẩm
121
+ tax_category: Mục thuế
122
+ spree/promotion:
123
+ advertise: Quảng cáo
124
+ code: Mã
125
+ description: Chú thích
126
+ event_name: Tên sự kiện
127
+ expires_at: Hết hạn lúc
128
+ generate_code: Tạo mã giảm giá
129
+ name: Tên
130
+ path: Đường dẫn
131
+ promotion_category: Danh mục khuyến mãi
132
+ starts_at: Bắt đầu lúc
133
+ usage_limit: Giới hạn sử dụng
134
+ spree/promotion_category:
135
+ code: Mã
136
+ name: Kiểu khuyến mãi
137
+ spree/property:
138
+ name: Tên
139
+ presentation: Thể hiện
140
+ spree/role:
141
+ name: Tên
142
+ spree/shipment:
143
+ number: Số
144
+ spree/state:
145
+ abbr: Viết tắt
146
+ name: Tên
147
+ spree/store:
148
+ address: Địa chỉ
149
+ contact_phone: Điện thoại liên hệ
150
+ mail_from_address: Email
151
+ meta_description: Mô Tả Meta
152
+ meta_keywords: Từ Khoá Meta
153
+ name: Tên
154
+ preferred_digital_asset_authorized_clicks: Giới hạn số lần tải xuống
155
+ preferred_digital_asset_authorized_days: Giới hạn số ngày tải xuống
156
+ preferred_limit_digital_download_count: Giới hạn số lần tải xuống liên kết kỹ thuật số
157
+ preferred_limit_digital_download_days: Giới hạn số ngày tải xuống liên kết kỹ thuật số
158
+ seo_robots: SEO Robots
159
+ seo_title: Tiêu đề SEO
160
+ storefront_custom_code_body_end: Mã tùy chỉnh trước thẻ đóng body
161
+ storefront_custom_code_body_start: Mã tùy chỉnh sau thẻ mở body
162
+ storefront_custom_code_head: Mã tùy chỉnh trong phần head của trang
163
+ url: url
164
+ spree/store_credit:
165
+ amount_used: Số tiền đã dùng
166
+ spree/tax_category:
167
+ description: Chú thích
168
+ name: Tên
169
+ spree/tax_rate:
170
+ amount: Mức giá
171
+ spree/taxon:
172
+ name: Tên
173
+ permalink: Permalink
174
+ position: Ví trí
175
+ sort_order: Thứ tự sắp xếp
176
+ spree/taxonomy:
177
+ name: Tên
178
+ spree/user:
179
+ avatar: Ảnh đại diện
180
+ email: Email
181
+ password: Mật khẩu
182
+ password_confirmation: Xác nhận mật khẩu
183
+ spree/variant:
184
+ cost_currency: Tiền tệ
185
+ cost_price: Giá nhập
186
+ depth: sâu
187
+ height: Cao
188
+ price: Giá bán
189
+ sku: Mã
190
+ weight: Nặng
191
+ width: Dài
192
+ spree/zone:
193
+ description: Mô tả
194
+ name: Tên vùng
195
+ user:
196
+ current_sign_in: Đăng nhập hiện tại vào
197
+ last_sign_in: Đăng nhập lần cuối vào
198
+ sign_in_count: Số lần đăng nhập
199
+ errors:
200
+ messages:
201
+ blank: không được để trống
202
+ models:
203
+ spree/allowed_origin:
204
+ attributes:
205
+ origin:
206
+ must_be_origin_only: phải là một origin (lược đồ và máy chủ) không có đường dẫn, truy vấn hoặc fragment
207
+ spree/classification:
208
+ attributes:
209
+ taxon_id:
210
+ already_linked: Đã Được Liên Kết
211
+ spree/credit_card:
212
+ attributes:
213
+ base:
214
+ card_expired: Thẻ Đã Hết Hạn
215
+ expiry_invalid: Hạn Sử Dụng Không Hợp Lệ
216
+ spree/gift_card:
217
+ attributes:
218
+ base:
219
+ cannot_destroy_used_gift_card: Không thể xóa thẻ quà tặng đã được sử dụng
220
+ spree/import:
221
+ attributes:
222
+ attachment:
223
+ content_type: có kiểu nội dung không được phép
224
+ type:
225
+ inclusion: không nằm trong danh sách các loại được phép
226
+ spree/line_item:
227
+ attributes:
228
+ currency:
229
+ must_match_order_currency: Phải Trùng Khớp Với Tiền Tệ Đơn Hàng
230
+ spree/market:
231
+ attributes:
232
+ base:
233
+ cannot_destroy_default_market: Không thể xóa thị trường mặc định.
234
+ cannot_destroy_last_market: Không thể xóa thị trường duy nhất.
235
+ spree/market_country:
236
+ attributes:
237
+ country:
238
+ already_in_market: đã được gán cho một thị trường khác trong cửa hàng này
239
+ not_in_shipping_zone: không nằm trong bất kỳ khu vực vận chuyển nào. Vui lòng thiết lập khu vực vận chuyển trước.
240
+ spree/payment:
241
+ attributes:
242
+ amount:
243
+ greater_than_max_amount: lớn hơn số tiền tối đa được phép là %{max_amount}
244
+ spree/price_list:
245
+ attributes:
246
+ ends_at:
247
+ must_be_after_starts_at: phải sau thời điểm bắt đầu
248
+ spree/product:
249
+ attributes:
250
+ base:
251
+ cannot_destroy_if_attached_to_line_items: Không thể xóa các Sản phẩm đã được thêm vào Đơn hàng đã đặt. Trong những trường hợp này, vui lòng ngừng kinh doanh chúng.
252
+ discontinue_on:
253
+ invalid_date_range: phải muộn hơn ngày sẵn có
254
+ spree/product_publication:
255
+ attributes:
256
+ unpublished_at:
257
+ must_be_after_published_at: phải sau ngày xuất bản
258
+ spree/promotion:
259
+ attributes:
260
+ expires_at:
261
+ invalid_date_range: phải muộn hơn ngày bắt đầu
262
+ spree/refund:
263
+ attributes:
264
+ amount:
265
+ greater_than_allowed: Lớn Hơn Số Tiền Cho Phép
266
+ spree/store:
267
+ attributes:
268
+ base:
269
+ cannot_destroy_only_store: Không thể xóa Cửa hàng duy nhất.
270
+ spree/store_credit:
271
+ attributes:
272
+ amount_authorized:
273
+ exceeds_total_credits: Vượt quá tổng tín dụng.
274
+ amount_used:
275
+ cannot_be_greater_than_amount: Không thể lớn hơn số tiền.
276
+ greater_than_zero_restrict_delete: lớn hơn không. Không thể xóa tín dụng cửa hàng.
277
+ spree/user:
278
+ attributes:
279
+ bill_address_id:
280
+ belongs_to_other_user: thuộc về người dùng khác
281
+ deprecated_in_completed_order: đã ngừng dùng trong đơn hàng đã hoàn tất
282
+ ship_address_id:
283
+ belongs_to_other_user: thuộc về người dùng khác
284
+ deprecated_in_completed_order: đã ngừng dùng trong đơn hàng đã hoàn tất
285
+ spree/variant:
286
+ attributes:
287
+ base:
288
+ cannot_destroy_if_attached_to_line_items: Không thể xóa các Biến thể đã được thêm vào Đơn hàng đã đặt. Trong những trường hợp này, vui lòng ngừng kinh doanh chúng.
289
+ spree/webhook_endpoint:
290
+ attributes:
291
+ url:
292
+ internal_address_not_allowed: không được trỏ đến địa chỉ mạng nội bộ hoặc riêng tư
293
+ models:
294
+ spree/address:
295
+ one: Địa chỉ
296
+ other: Địa chỉ
297
+ spree/classification:
298
+ one: Phân loại
299
+ other: Phân loại
300
+ spree/country:
301
+ one: Quốc gia
302
+ other: Quốc gia
303
+ spree/credit_card:
304
+ one: Thẻ tín dụng
305
+ other: Thẻ tín dụng
306
+ spree/customer_group:
307
+ one: Nhóm khách hàng
308
+ other: Nhóm khách hàng
309
+ spree/customer_group_user:
310
+ one: Người dùng nhóm khách hàng
311
+ other: Người dùng nhóm khách hàng
312
+ spree/export:
313
+ one: Xuất dữ liệu
314
+ other: Xuất dữ liệu
315
+ spree/integration:
316
+ one: Tích hợp
317
+ other: Tích hợp
318
+ spree/inventory_unit:
319
+ one: Đơn vị hàng
320
+ other: Đơn vị tồn kho
321
+ spree/line_item:
322
+ one: Item
323
+ other: Mục hàng
324
+ spree/option_type:
325
+ one: Loại Tùy Chọn
326
+ other: Loại tùy chọn
327
+ spree/option_value:
328
+ one: Giá Trị Tùy Chọn
329
+ other: Giá trị tùy chọn
330
+ spree/order:
331
+ one: Đơn đặt hàng
332
+ other: Đơn hàng
333
+ spree/payment:
334
+ one: Thanh toán
335
+ other: Thanh toán
336
+ spree/payment_method:
337
+ one: Phương Thức Thanh Toán
338
+ other: Phương thức thanh toán
339
+ spree/price:
340
+ one: Giá
341
+ other: Giá
342
+ spree/price_list:
343
+ one: Bảng giá
344
+ other: Bảng giá
345
+ spree/price_rule:
346
+ one: Quy tắc giá
347
+ other: Quy tắc giá
348
+ spree/product:
349
+ one: Sản phẩm
350
+ other: Sản phẩm
351
+ spree/promotion:
352
+ one: Khuyến mãi
353
+ other: Khuyến mãi
354
+ spree/promotion_category:
355
+ one: Kiểu khuyến mãi
356
+ other: Danh mục khuyến mãi
357
+ spree/property:
358
+ one: Thuộc tính
359
+ other: Thuộc tính
360
+ spree/refund_reason:
361
+ one: Lý do trả hàng
362
+ other: Lý do hoàn tiền
363
+ spree/role:
364
+ one: Quyền
365
+ other: Vai trò
366
+ spree/shipment:
367
+ one: Vận chuyển
368
+ other: Lô hàng
369
+ spree/shipping_method:
370
+ one: Phương thức vận chuyển
371
+ other: Phương thức vận chuyển
372
+ spree/state:
373
+ one: Trạng thái
374
+ other: Tỉnh/Bang
375
+ spree/stock_location:
376
+ one: Địa điểm kho
377
+ other: Địa điểm kho
378
+ spree/stock_movement:
379
+ one: Kho Vận
380
+ other: Biến động kho
381
+ spree/stock_transfer:
382
+ one: Chuyển Kho A-B
383
+ other: Chuyển kho
384
+ spree/store:
385
+ one: Cửa hàng
386
+ other: Cửa hàng
387
+ spree/store_credit:
388
+ one: Tín dụng cửa hàng
389
+ other: Tín dụng cửa hàng
390
+ spree/tax_category:
391
+ one: Loại Thuế
392
+ other: Danh mục thuế
393
+ spree/tax_rate:
394
+ one: Tỷ Lệ Thuế
395
+ other: Mức thuế suất
396
+ spree/taxon:
397
+ one: Phân Loại
398
+ other: Danh mục
399
+ spree/taxonomy:
400
+ one: Hệ Thống Phân Loại
401
+ other: Danh mục
402
+ spree/user:
403
+ one: Người dùng
404
+ other: Người dùng
405
+ spree/variant:
406
+ one: Phân loại
407
+ other: Biến thể
408
+ spree/zone:
409
+ one: Vùng
410
+ other: Khu vực
411
+ errors:
412
+ messages:
413
+ already_confirmed: đã được chứng nhận
414
+ not_found: không tìm thấy
415
+ not_locked: không bị khoá
416
+ not_saved:
417
+ one: '1 lỗi đã ngăn không cho %{resource} này được lưu:'
418
+ other: "%{count} lỗi đã ngăn không cho %{resource} này được lưu:"
419
+ number:
420
+ percentage:
421
+ format:
422
+ precision: 1
423
+ spree:
424
+ accept: Chấp nhận
425
+ accepted: Đã chấp nhận
426
+ accepts_email_marketing: Đồng ý nhận email tiếp thị
427
+ account: Tài khoản
428
+ active: Có hiệu lực
429
+ address: Địa chỉ
430
+ address1: Địa chỉ
431
+ address2: Địa chỉ (tiếp)
432
+ adjustment: Điều chỉnh
433
+ adjustment_labels:
434
+ tax_rates:
435
+ excluding_tax: "%{name}%{amount}"
436
+ including_tax: "%{name}%{amount} (Đã bao gồm trong giá)"
437
+ adjustments_deleted: Đã xóa điều chỉnh
438
+ all: Tất cả
439
+ amount: Giá trị
440
+ api_key_no_current_key: Không có khóa API nào xác thực yêu cầu này
441
+ api_key_scopes_immutable: không thể thay đổi sau khi khóa được tạo; hãy tạo một khóa mới với các phạm vi bạn cần và thu hồi khóa này
442
+ approver: Người xác nhận
443
+ authorized: Đã Ủy Quyền
444
+ availability: tình trạng còn hàng
445
+ backorderable: Có Thể Đặt Chỗ
446
+ backordered: Đã Đặt Chỗ
447
+ bill_address: Địa chỉ thanh toán
448
+ billing_address: Địa chỉ thanh toán
449
+ calculator: Máy tính
450
+ canceled: Đã hủy
451
+ canceler: Người thực hiện hủy
452
+ cannot_be_destroyed: Không thể xóa đơn hàng.
453
+ capture: Lấy tiền
454
+ cart: Giỏ Hàng
455
+ cart_already_updated: Giỏ hàng đã được cập nhật.
456
+ cart_line_item:
457
+ delivery_unavailable: "%{li_name} không thể giao đến địa chỉ đã chọn"
458
+ discontinued: "%{li_name} đã bị xóa vì đã ngừng kinh doanh"
459
+ out_of_stock: "%{li_name} đã bị xóa vì đã hết hàng"
460
+ categories: Loại mặt hàng
461
+ category: Loại mặt hàng
462
+ channel: Kênh bán hàng
463
+ channels: Kênh bán hàng
464
+ checkout: Thủ tục mua hàng
465
+ checkout_requirements:
466
+ email_required: Bắt buộc nhập địa chỉ email
467
+ line_items_required: Thêm ít nhất một sản phẩm vào giỏ hàng
468
+ payment_required: Thêm một phương thức thanh toán
469
+ ship_address_required: Bắt buộc nhập địa chỉ giao hàng
470
+ city: Thành phố
471
+ color_code: Mã màu
472
+ company: Công ty
473
+ compare_at_amount: Số tiền so sánh
474
+ compare_at_price: Giá so sánh
475
+ complete: hoàn tất
476
+ confirm: Xác nhận
477
+ cost_price: Giá
478
+ count_on_hand: Số hàng có trong tay
479
+ country: Quốc gia
480
+ coupon_code: Mã Phiếu Giảm Giá
481
+ coupon_code_already_applied: Mã khuyến mại đã được dùng cho đơn hàng khác
482
+ coupon_code_applied: The coupon code was successfully applied to your order.
483
+ coupon_code_better_exists: Mã khuyến mại trước đó có nhiều khuyến mại hơn
484
+ coupon_code_expired: Mã khuyến mại bị hết hạn
485
+ coupon_code_max_usage: Mã khuyến mại bị vượt qua số lần cho phép sử dụng
486
+ coupon_code_not_eligible: Mã khuyến mại không cho đơn hàng này được
487
+ coupon_code_not_found: Mã khuyến mại bạn nhập vào không tồn tại. Vui lòng thử lại.
488
+ coupon_code_used: Mã giảm giá bạn đã nhập đã được sử dụng. Vui lòng thử lại.
489
+ created_at: Tạo lúc
490
+ credit_card: Thẻ Tín Dụng
491
+ currency: Tiền Tệ
492
+ currency_not_supported_by_store: không được cửa hàng này hỗ trợ
493
+ customer: Khách hàng
494
+ customers: Khách hàng
495
+ default: Mặc Định
496
+ default_stock_location_name: Địa điểm cửa hàng
497
+ default_wishlist_name: Danh sách yêu thích
498
+ delivery: Giao Hàng
499
+ depth: Sâu
500
+ description: Miêu Tả
501
+ destination: Đích Đến
502
+ destroy: Hủy Bỏ
503
+ details: Chi Tiết
504
+ digital:
505
+ digital_delivery: Giao hàng kỹ thuật số
506
+ digital_assets: Tài sản kỹ thuật số
507
+ discontinued: Đã ngừng kinh doanh
508
+ discontinued_variants_present: Một số mục hàng trong đơn hàng này có sản phẩm không còn khả dụng.
509
+ display_delivery_range: Giao hàng trong %{delivery_range} ngày làm việc
510
+ draft: Bản nháp
511
+ eligibility_errors:
512
+ messages:
513
+ has_excluded_product: Có Sản Phẩm Bị Loại Trừ
514
+ limit_once_per_user: Giới Hạn Một Lần Cho Mỗi Người Dùng
515
+ missing_product: Thiếu Sản Phẩm
516
+ missing_taxon: Thiếu Phân Loại
517
+ no_applicable_products: Không Có Sản Phẩm Áp Dụng
518
+ no_matching_channel: Mã giảm giá này không áp dụng cho kênh bán hàng này.
519
+ no_matching_market: Mã giảm giá này không áp dụng tại thị trường của bạn.
520
+ no_matching_taxons: Không Có Phân Loại Phù Hợp
521
+ no_user_or_email_specified: Không Có Người Dùng Hoặc Email Được Chỉ Định
522
+ no_user_specified: Không Có Người Dùng Được Chỉ Định
523
+ not_first_order: Không Phải Đơn Hàng Đầu Tiên
524
+ wrong_country: Mã giảm giá này không hợp lệ tại quốc gia của bạn
525
+ email: Email
526
+ error: lỗi
527
+ error_user_destroy_with_orders: Không thể xóa người dùng có liên kết với đơn hàng
528
+ error_user_does_not_have_any_store_credits: Người dùng không có tín dụng cửa hàng nào khả dụng
529
+ errors:
530
+ messages:
531
+ cannot_delete_default_channel: Không thể xóa kênh mặc định. Hãy nâng một kênh khác thành mặc định trước.
532
+ channel_store_mismatch: phải thuộc cùng một cửa hàng
533
+ invalid_order_routing_rule: không phải là quy tắc định tuyến đơn hàng đã đăng ký
534
+ invalid_order_routing_strategy: không phải là chiến lược định tuyến đơn hàng đã đăng ký
535
+ store_association_can_not_be_changed: Không thể thay đổi liên kết cửa hàng
536
+ store_is_already_set: Cửa hàng đã được đặt
537
+ expired: Đã hết hạn
538
+ export_mailer:
539
+ export_done:
540
+ message: Làm tốt lắm, bản xuất của bạn đã sẵn sàng! Vui lòng dùng liên kết bên dưới để tải xuống.
541
+ subject: Bản xuất %{export_number} của bạn đã được xử lý thành công!
542
+ greeting: Chào %{user_name},
543
+ field: Trường
544
+ first_name: Tên
545
+ flat_percent: Định mức phần trăm
546
+ flat_rate_per_order: Lãi suất sàn (cho từng đơn hàng)
547
+ flexible_rate: Lãi suất dao động
548
+ free: Miễn phí
549
+ gateway: Gateway
550
+ gateway_error: Lỗi Gateway
551
+ gift_card: Thẻ quà tặng
552
+ gift_card_already_redeemed: Thẻ quà tặng đã được sử dụng.
553
+ gift_card_applied: Thẻ quà tặng đã được áp dụng thành công cho đơn hàng của bạn!
554
+ gift_card_customer_not_logged_in: Không thể áp dụng thẻ quà tặng với người dùng khách.
555
+ gift_card_expired: Thẻ quà tặng đã hết hạn.
556
+ gift_card_mismatched_currency: Không thể áp dụng thẻ quà tặng với tiền tệ hiện tại.
557
+ gift_card_mismatched_customer: Thẻ quà tặng này gắn với người dùng khác.
558
+ gift_card_not_found: Không tìm thấy thẻ quà tặng.
559
+ gift_card_removed: Thẻ quà tặng đã được gỡ thành công khỏi đơn hàng của bạn
560
+ gift_card_using_store_credit_error: Bạn không thể áp dụng thẻ quà tặng sau khi đã áp dụng tín dụng cửa hàng.
561
+ height: Cao
562
+ i18n:
563
+ this_file_language: tiếng Việt (VN)
564
+ idempotency_key_reused: Idempotency-Key này đã được sử dụng với các tham số yêu cầu khác.
565
+ image: Hình ảnh
566
+ import: Nhập dữ liệu
567
+ in_stock: Còn hàng
568
+ internal_note: Ghi chú nội bộ
569
+ inventory: Hàng
570
+ invitation_mailer:
571
+ greeting: Chào %{user_name},
572
+ invitation_accepted:
573
+ body: "%{invitee_name} đã chấp nhận lời mời tham gia %{resource_name} của bạn"
574
+ subject: "%{invitee_name} đã chấp nhận lời mời tham gia %{resource_name} của bạn"
575
+ invitation_email:
576
+ body: "%{inviter_name} đã mời bạn tham gia %{resource_name}"
577
+ link_description: 'Để chấp nhận lời mời này, vui lòng nhấp vào liên kết bên dưới:'
578
+ subject: Lời mời tham gia %{resource_name}
579
+ iso: ISO Alpha-2
580
+ item: Món
581
+ key: Khóa
582
+ kind: Loại
583
+ label: Nhãn
584
+ last_name: Họ
585
+ line_item: Mục hàng
586
+ line_items: Mục hàng
587
+ link: Liên kết
588
+ locale: Ngôn ngữ
589
+ locale_not_supported_by_store: không được cửa hàng này hỗ trợ
590
+ manual: Thủ công
591
+ market: Thị trường
592
+ me_no_current_user: Không có người dùng quản trị nào xác thực yêu cầu này
593
+ media: Phương tiện
594
+ meta_description: Meta miểu tả
595
+ meta_keywords: Meta danh sách từ khóa
596
+ metadata: Metadata
597
+ min_quantity: Số lượng tối thiểu
598
+ month: Tháng
599
+ name: Tên
600
+ new_variant: Biến thể mới
601
+ no_cc_type: Không có
602
+ none: Rỗng
603
+ number: Số
604
+ on_hand: Có hàng
605
+ only_active_products_can_be_added_to_cart: Không thể thêm sản phẩm bản nháp và đã lưu trữ vào giỏ hàng, vui lòng đánh dấu sản phẩm là đang hoạt động trước.
606
+ open: Mở
607
+ option_name: Tên tùy chọn
608
+ option_type: Option Type
609
+ option_value: Option Value
610
+ options: Tùy chọn
611
+ or: hoặc
612
+ order: Đơn hàng
613
+ order_routing:
614
+ strategies:
615
+ legacy: Kế thừa
616
+ rules: Quy tắc (theo thứ tự)
617
+ order_summary: Tóm tắt đơn đặt hàng
618
+ orders: Đơn hàng
619
+ out_of_stock: Hết hàng
620
+ password: Mật khẩu
621
+ path: Đường dẫn
622
+ payment: Thanh toán
623
+ payment_method: Phương thức thanh toán
624
+ payment_methods: Phương thức thanh toán
625
+ payment_source: Nguồn thanh toán
626
+ percent: Phần trăm
627
+ phone: Điện thoại
628
+ price: Giá
629
+ price_range: Loại giá
630
+ price_rules:
631
+ channel_rule:
632
+ description: Áp dụng giá theo kênh bán hàng
633
+ customer_group_rule:
634
+ description: Áp dụng giá cho các nhóm khách hàng cụ thể
635
+ price_sack: Price Sack
636
+ prices: Giá
637
+ privacy_policy: Chính sách bảo mật
638
+ processing: Đang xử lý
639
+ product: Sản phẩm
640
+ product_translations: Bản dịch sản phẩm
641
+ products: Sản phẩm
642
+ products_cannot_be_shipped: Hiện tại chúng tôi không thể giao %{product_names} đến vị trí hiện tại của bạn. Vui lòng thay đổi địa chỉ giao hàng hoặc gỡ %{product_names} khỏi giỏ hàng của bạn.
643
+ promotion: Khuyến mãi
644
+ promotion_already_used: Bạn không thể xóa khuyến mãi đã được áp dụng
645
+ promotion_label: Khuyến mãi (%{name})
646
+ promotion_rule_types:
647
+ category:
648
+ description: Đơn hàng bao gồm sản phẩm trong các danh mục được chỉ định
649
+ name: Danh mục
650
+ channel:
651
+ description: Giới hạn cho các đơn hàng được đặt qua (các) kênh được chỉ định
652
+ name: Kênh bán hàng
653
+ country:
654
+ description: Giới hạn cho các đơn hàng có địa chỉ giao hàng tại một quốc gia cụ thể
655
+ name: Quốc gia
656
+ currency:
657
+ description: Giới hạn cho các đơn hàng bằng một loại tiền tệ cụ thể
658
+ name: Tiền tệ
659
+ customer:
660
+ description: Chỉ dành cho các khách hàng được chỉ định
661
+ name: Khách hàng
662
+ customer_group:
663
+ description: Chỉ dành cho khách hàng trong (các) nhóm khách hàng được chỉ định
664
+ name: "(Các) nhóm khách hàng"
665
+ customer_logged_in:
666
+ description: Chỉ dành cho khách hàng đã đăng nhập
667
+ name: Chỉ khách hàng đã đăng nhập
668
+ market:
669
+ description: Giới hạn cho các đơn hàng được đặt tại (các) thị trường được chỉ định
670
+ name: Thị trường
671
+ promotions: Khuyến mãi
672
+ quantity: Số lượng
673
+ query: Truy vấn
674
+ reason: Lí do
675
+ received: Đã nhận
676
+ reference: Tham khảo
677
+ refund: Thối
678
+ refund_amount: Số tiền hoàn lại
679
+ registration: Đăng ký
680
+ remove: Xóa
681
+ remove_gift_card_on_completed_order_error: Bạn không thể gỡ thẻ quà tặng sau khi đơn hàng đã được đặt
682
+ resellable: Có thể bán lại
683
+ resend: Gửi lại
684
+ response_code: Mã phản hồi
685
+ return: trở về
686
+ returned: Đã trả về
687
+ returns_policy: Chính sách trả hàng
688
+ row: Hàng
689
+ rules: Rules
690
+ scope: Phạm vi
691
+ selected_quantity_not_available: đã chọn của %{item} không khả dụng.
692
+ ship: Gửi
693
+ ship_address: Địa chỉ giao hàng
694
+ shipment: Vận chuyển
695
+ shipped: Đã chuyển phát
696
+ shipping: Vận chuyển
697
+ shipping_address: Địa chỉ giao hàng
698
+ shipping_flat_rate_per_item: Giá thấp nhất với từng mục gói
699
+ shipping_flat_rate_per_order: Giá thấp nhất
700
+ shipping_flexible_rate: Suất linh hoạt với từng mục gói
701
+ shipping_policy: Chính sách vận chuyển
702
+ shipping_price_sack: Xô giá
703
+ shipping_rates:
704
+ display_price:
705
+ excluding_tax: "%{price} (+ %{tax_amount} %{tax_rate_name})"
706
+ including_tax: "%{price} (đã gồm %{tax_amount} %{tax_rate_name})"
707
+ sku: SKU
708
+ source: Nguồn
709
+ status: Tình trạng
710
+ stock_location: Địa điểm hàng
711
+ stock_locations: Địa điểm hàng
712
+ stock_transfer:
713
+ errors:
714
+ must_have_variant: Bạn phải thêm ít nhất một biến thể
715
+ same_location: không thể trùng với địa điểm đích
716
+ variants_unavailable: Một số biến thể không có sẵn tại %{stock}
717
+ store: Cửa hàng
718
+ store_credit:
719
+ allocated: Đã thêm
720
+ authorized: Đã ủy quyền
721
+ captured: Đã dùng
722
+ credit: Tín dụng
723
+ eligible: Đủ điều kiện
724
+ store_credit_name: Tín dụng cửa hàng
725
+ store_credit_payment_method:
726
+ currency_mismatch: Tiền tệ của tín dụng cửa hàng không khớp với tiền tệ của đơn hàng
727
+ insufficient_authorized_amount: Không thể thu nhiều hơn số tiền đã ủy quyền
728
+ insufficient_funds: Số dư tín dụng cửa hàng còn lại không đủ
729
+ successful_action: "%{action} tín dụng cửa hàng thành công"
730
+ unable_to_credit: 'Không thể ghi có mã: %{auth_code}'
731
+ unable_to_find: Không thể tìm thấy tín dụng cửa hàng
732
+ unable_to_find_for_action: 'Không thể tìm thấy tín dụng cửa hàng cho mã xác thực: %{auth_code} cho hành động: %{action}'
733
+ unable_to_void: 'Không thể hủy mã: %{auth_code}'
734
+ tags: Thẻ
735
+ tax: Thuế
736
+ tax_category: Biểu thuế
737
+ terms_of_service: Điều khoản dịch vụ
738
+ total: Giá trị
739
+ tracking: Theo dõi
740
+ tracking_number: Số theo dõi
741
+ tracking_url: URL theo dõi
742
+ type: Loại
743
+ unable_to_connect_to_gateway: Không thề kết nối với gateway.
744
+ updated_at: Cập nhật vào
745
+ url: URL
746
+ user: Người dùng
747
+ validation:
748
+ must_be_int: phải là số nguyên
749
+ value: Giá trị
750
+ variant: Variant
751
+ variants: Biến thể
752
+ verified: Đã xác minh
753
+ void: Vô hiệu hóa
754
+ webhook_mailer:
755
+ endpoint_disabled:
756
+ disabled_at_label: Vô hiệu hóa vào
757
+ heading: Điểm cuối Webhook đã bị vô hiệu hóa
758
+ instructions: Vui lòng kiểm tra URL điểm cuối và dịch vụ, sau đó kích hoạt lại trong Cài đặt → Nhà phát triển → Webhook.
759
+ message: Điểm cuối webhook "%{endpoint_name}" đã tự động bị vô hiệu hóa sau nhiều lần gửi thất bại liên tiếp.
760
+ name_label: Tên
761
+ reason_label: Lý do
762
+ subject: 'Điểm cuối webhook đã bị vô hiệu hóa: %{endpoint_name}'
763
+ url_label: URL
764
+ weight: Khối lượng
765
+ weight_unit: Đơn vị khối lượng
766
+ width: Rộng
767
+ year: Năm
768
+ zip: Mã bưu điện