solidus_core 2.11.10 → 3.3.1

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 (252) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +6 -2
  3. data/app/assets/javascripts/spree.js.erb +0 -51
  4. data/app/controllers/spree/base_controller.rb +1 -1
  5. data/app/helpers/spree/base_helper.rb +1 -1
  6. data/app/helpers/spree/products_helper.rb +2 -2
  7. data/app/helpers/spree/store_helper.rb +0 -11
  8. data/app/mailers/spree/carton_mailer.rb +1 -5
  9. data/app/models/concerns/spree/active_storage_adapter/attachment.rb +30 -11
  10. data/app/models/concerns/spree/active_storage_adapter.rb +1 -1
  11. data/app/models/concerns/spree/adjustment_source.rb +0 -15
  12. data/app/models/concerns/spree/calculated_adjustments.rb +0 -18
  13. data/app/models/concerns/spree/default_price.rb +39 -10
  14. data/app/models/concerns/spree/ransackable_attributes.rb +24 -4
  15. data/app/models/concerns/spree/soft_deletable.rb +2 -4
  16. data/app/models/concerns/spree/user_address_book.rb +10 -37
  17. data/app/models/concerns/spree/user_methods.rb +38 -13
  18. data/app/models/spree/ability.rb +0 -37
  19. data/app/models/spree/address/name.rb +2 -20
  20. data/app/models/spree/address.rb +8 -186
  21. data/app/models/spree/adjustment.rb +7 -33
  22. data/app/models/spree/base.rb +0 -53
  23. data/app/models/spree/calculator/flat_fee.rb +21 -0
  24. data/app/models/spree/calculator/flexi_rate.rb +0 -5
  25. data/app/models/spree/calculator.rb +0 -7
  26. data/app/models/spree/carton.rb +1 -1
  27. data/app/models/spree/country.rb +2 -7
  28. data/app/models/spree/credit_card.rb +1 -28
  29. data/app/models/spree/customer_return.rb +5 -7
  30. data/app/models/spree/image/active_storage_attachment.rb +2 -7
  31. data/app/models/spree/image/paperclip_attachment.rb +2 -2
  32. data/app/models/spree/image.rb +0 -7
  33. data/app/models/spree/inventory_unit.rb +0 -21
  34. data/app/models/spree/line_item.rb +6 -49
  35. data/app/models/spree/log_entry.rb +74 -1
  36. data/app/models/spree/option_type.rb +1 -1
  37. data/app/models/spree/option_value.rb +10 -1
  38. data/app/models/spree/order/number_generator.rb +7 -1
  39. data/app/models/spree/order.rb +82 -170
  40. data/app/models/spree/order_cancellations.rb +4 -24
  41. data/app/models/spree/order_contents.rb +2 -1
  42. data/app/models/spree/order_inventory.rb +1 -1
  43. data/app/models/spree/order_merger.rb +2 -2
  44. data/app/models/spree/order_promotion.rb +1 -1
  45. data/app/models/spree/order_shipping.rb +6 -9
  46. data/app/models/spree/order_taxation.rb +6 -4
  47. data/app/models/spree/order_updater.rb +17 -16
  48. data/app/models/spree/payment/cancellation.rb +1 -1
  49. data/app/models/spree/payment/processing.rb +58 -55
  50. data/app/models/spree/payment.rb +0 -3
  51. data/app/models/spree/payment_create.rb +1 -13
  52. data/app/models/spree/payment_method/bogus_credit_card.rb +6 -7
  53. data/app/models/spree/payment_method/credit_card.rb +1 -3
  54. data/app/models/spree/payment_method/simple_bogus_credit_card.rb +8 -0
  55. data/app/models/spree/payment_method.rb +26 -110
  56. data/app/models/spree/price.rb +3 -3
  57. data/app/models/spree/product/scopes.rb +24 -33
  58. data/app/models/spree/product.rb +15 -42
  59. data/app/models/spree/product_property.rb +1 -1
  60. data/app/models/spree/promotion/actions/create_adjustment.rb +4 -3
  61. data/app/models/spree/promotion/actions/create_item_adjustments.rb +5 -9
  62. data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +0 -3
  63. data/app/models/spree/promotion/actions/free_shipping.rb +1 -0
  64. data/app/models/spree/promotion/order_adjustments_recalculator.rb +92 -0
  65. data/app/models/spree/promotion/rules/item_total.rb +50 -6
  66. data/app/models/spree/promotion/rules/product.rb +20 -8
  67. data/app/models/spree/promotion/rules/store.rb +4 -0
  68. data/app/models/spree/promotion/rules/taxon.rb +6 -15
  69. data/app/models/spree/promotion/rules/user.rb +4 -0
  70. data/app/models/spree/promotion.rb +39 -32
  71. data/app/models/spree/promotion_action.rb +6 -9
  72. data/app/models/spree/promotion_code/batch_builder.rb +0 -14
  73. data/app/models/spree/promotion_code.rb +11 -7
  74. data/app/models/spree/promotion_handler/cart.rb +26 -6
  75. data/app/models/spree/promotion_rule.rb +5 -0
  76. data/app/models/spree/property.rb +1 -1
  77. data/app/models/spree/refund.rb +8 -52
  78. data/app/models/spree/reimbursement.rb +5 -43
  79. data/app/models/spree/reimbursement_performer.rb +2 -8
  80. data/app/models/spree/reimbursement_type/credit.rb +1 -4
  81. data/app/models/spree/reimbursement_type/reimbursement_helpers.rb +1 -2
  82. data/app/models/spree/reimbursement_type/store_credit.rb +1 -4
  83. data/app/models/spree/return_authorization.rb +2 -5
  84. data/app/models/spree/return_item.rb +4 -24
  85. data/app/models/spree/shipment.rb +3 -56
  86. data/app/models/spree/shipping_method.rb +0 -25
  87. data/app/models/spree/shipping_rate.rb +0 -2
  88. data/app/models/spree/shipping_rate_tax.rb +1 -1
  89. data/app/models/spree/state.rb +1 -5
  90. data/app/models/spree/stock/allocator/on_hand_first.rb +2 -2
  91. data/app/models/spree/stock/availability.rb +11 -3
  92. data/app/models/spree/stock/quantifier.rb +12 -8
  93. data/app/models/spree/stock/simple_coordinator.rb +8 -26
  94. data/app/models/spree/stock/splitter/base.rb +2 -7
  95. data/app/models/spree/stock_item.rb +2 -8
  96. data/app/models/spree/stock_location.rb +2 -2
  97. data/app/models/spree/stock_movement.rb +2 -2
  98. data/app/models/spree/store.rb +0 -12
  99. data/app/models/spree/store_credit.rb +14 -1
  100. data/app/models/spree/store_credit_category.rb +0 -32
  101. data/app/models/spree/store_credit_prioritizer.rb +17 -0
  102. data/app/models/spree/tax/item_tax.rb +3 -2
  103. data/app/models/spree/tax/order_tax.rb +3 -1
  104. data/app/models/spree/tax/tax_helpers.rb +2 -2
  105. data/app/models/spree/tax/tax_location.rb +4 -7
  106. data/app/models/spree/tax_calculator/default.rb +31 -0
  107. data/app/models/spree/tax_calculator/shipping_rate.rb +2 -13
  108. data/app/models/spree/tax_rate.rb +9 -27
  109. data/app/models/spree/taxon/active_storage_attachment.rb +2 -7
  110. data/app/models/spree/taxon/paperclip_attachment.rb +3 -8
  111. data/app/models/spree/taxon.rb +1 -12
  112. data/app/models/spree/taxonomy.rb +1 -1
  113. data/app/models/spree/user_address.rb +0 -5
  114. data/app/models/spree/user_last_url_storer/rules/authentication_rule.rb +1 -1
  115. data/app/models/spree/variant/price_selector.rb +34 -4
  116. data/app/models/spree/variant.rb +52 -66
  117. data/app/models/spree/zone.rb +1 -1
  118. data/app/subscribers/spree/mailer_subscriber.rb +4 -0
  119. data/app/subscribers/spree/order_mailer_subscriber.rb +35 -0
  120. data/config/i18n-tasks.yml +134 -0
  121. data/config/locales/en.yml +406 -263
  122. data/db/migrate/20180416083007_add_apply_to_all_to_variant_property_rule.rb +1 -1
  123. data/db/migrate/20201127212108_add_type_before_removal_to_spree_payment_methods.rb +7 -0
  124. data/db/migrate/20210312061050_change_column_null_on_prices.rb +7 -0
  125. data/db/migrate/20220317165036_set_promotions_with_any_policy_to_all_if_possible.rb +20 -0
  126. data/db/migrate/20220805202442_add_level_to_spree_tax_rates.rb +5 -0
  127. data/db/migrate/20221123152807_add_shipping_category_to_spree_variants.rb +5 -0
  128. data/db/seeds.rb +4 -1
  129. data/lib/generators/solidus/install/app_templates/authentication/custom.rb +21 -0
  130. data/lib/generators/solidus/install/app_templates/authentication/devise.rb +16 -0
  131. data/lib/generators/solidus/install/app_templates/authentication/existing.rb +10 -0
  132. data/lib/generators/solidus/install/app_templates/authentication/none.rb +1 -0
  133. data/lib/generators/solidus/install/app_templates/frontend/break_down_solidus_gem.rb +54 -0
  134. data/lib/generators/solidus/install/app_templates/frontend/classic.rb +16 -0
  135. data/lib/generators/solidus/install/app_templates/frontend/none.rb +2 -0
  136. data/lib/generators/solidus/install/app_templates/frontend/starter.rb +3 -0
  137. data/lib/generators/solidus/install/app_templates/payment_method/bolt.rb +13 -0
  138. data/lib/generators/solidus/install/app_templates/payment_method/none.rb +1 -0
  139. data/lib/generators/solidus/install/app_templates/payment_method/paypal.rb +10 -0
  140. data/lib/generators/solidus/install/install_generator.rb +247 -149
  141. data/lib/generators/solidus/install/templates/config/initializers/spree.rb.tt +15 -60
  142. data/lib/generators/solidus/install/templates/vendor/assets/javascripts/spree/backend/all.js +2 -2
  143. data/lib/generators/solidus/update/templates/config/initializers/new_solidus_defaults.rb.tt +30 -0
  144. data/lib/generators/solidus/update/update_generator.rb +112 -0
  145. data/lib/generators/spree/custom_user/custom_user_generator.rb +6 -4
  146. data/lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt +2 -6
  147. data/lib/generators/spree/custom_user/templates/migration.rb.tt +7 -3
  148. data/lib/generators/spree/dummy/dummy_generator.rb +12 -9
  149. data/lib/generators/spree/dummy/templates/rails/application.rb.tt +0 -1
  150. data/lib/generators/spree/dummy/templates/rails/database.yml +81 -39
  151. data/lib/generators/spree/dummy/templates/rails/storage.yml +3 -0
  152. data/lib/generators/spree/dummy/templates/rails/test.rb +2 -0
  153. data/lib/spree/app_configuration.rb +134 -64
  154. data/lib/spree/bus.rb +20 -0
  155. data/lib/spree/core/class_constantizer.rb +2 -0
  156. data/lib/spree/core/controller_helpers/auth.rb +10 -15
  157. data/lib/spree/core/controller_helpers/current_host.rb +5 -3
  158. data/lib/spree/core/controller_helpers/order.rb +12 -32
  159. data/lib/spree/core/controller_helpers/payment_parameters.rb +0 -54
  160. data/lib/spree/core/controller_helpers/pricing.rb +0 -8
  161. data/lib/spree/core/controller_helpers/search.rb +1 -1
  162. data/lib/spree/core/controller_helpers/strong_parameters.rb +0 -4
  163. data/lib/spree/core/engine.rb +54 -50
  164. data/lib/spree/core/environment_extension.rb +0 -9
  165. data/lib/spree/core/product_filters.rb +1 -41
  166. data/lib/spree/core/role_configuration.rb +0 -14
  167. data/lib/spree/core/search/base.rb +18 -35
  168. data/lib/spree/core/state_machines/order.rb +2 -2
  169. data/lib/spree/core/state_machines.rb +2 -11
  170. data/lib/spree/core/stock_configuration.rb +18 -0
  171. data/lib/spree/core/validators/email.rb +5 -3
  172. data/lib/spree/core/version.rb +5 -1
  173. data/lib/spree/core/versioned_value.rb +75 -0
  174. data/lib/spree/core.rb +40 -11
  175. data/lib/spree/deprecation.rb +1 -1
  176. data/lib/spree/event/configuration.rb +0 -5
  177. data/lib/spree/event/subscriber.rb +0 -18
  178. data/lib/spree/event/subscriber_registry.rb +7 -7
  179. data/lib/spree/event.rb +1 -32
  180. data/lib/spree/i18n.rb +0 -22
  181. data/lib/spree/migrations.rb +13 -11
  182. data/lib/spree/money.rb +3 -18
  183. data/lib/spree/permission_sets/default_customer.rb +8 -1
  184. data/lib/spree/permitted_attributes.rb +17 -59
  185. data/lib/spree/preferences/configuration.rb +84 -0
  186. data/lib/spree/preferences/preferable.rb +13 -0
  187. data/lib/spree/preferences/preferable_class_methods.rb +37 -4
  188. data/lib/spree/preferences/preference_differentiator.rb +29 -0
  189. data/lib/spree/preferences/static_model_preferences.rb +25 -10
  190. data/lib/spree/rails_compatibility.rb +106 -0
  191. data/lib/spree/testing_support/blacklist_urls.rb +1 -1
  192. data/lib/spree/testing_support/bus_helpers.rb +101 -0
  193. data/lib/spree/testing_support/capybara_ext.rb +0 -30
  194. data/lib/spree/testing_support/common_rake.rb +71 -23
  195. data/lib/spree/testing_support/controller_requests.rb +0 -82
  196. data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/backend/all.js +1 -1
  197. data/lib/spree/testing_support/dummy_app/assets/javascripts/spree/frontend/all.js +1 -1
  198. data/lib/spree/testing_support/dummy_app/database.yml +42 -22
  199. data/lib/spree/testing_support/dummy_app/migrations.rb +0 -3
  200. data/lib/spree/testing_support/dummy_app.rb +47 -34
  201. data/lib/spree/testing_support/factories/address_factory.rb +9 -6
  202. data/lib/spree/testing_support/factories/calculator_factory.rb +3 -0
  203. data/lib/spree/testing_support/factories/country_factory.rb +1 -2
  204. data/lib/spree/testing_support/factories/inventory_unit_factory.rb +1 -1
  205. data/lib/spree/testing_support/factories/order_factory.rb +8 -5
  206. data/lib/spree/testing_support/factories/product_factory.rb +4 -1
  207. data/lib/spree/testing_support/factories/promotion_factory.rb +28 -14
  208. data/lib/spree/testing_support/factories/refund_factory.rb +0 -1
  209. data/lib/spree/testing_support/factories/state_factory.rb +8 -2
  210. data/lib/spree/testing_support/factories/store_credit_factory.rb +4 -4
  211. data/lib/spree/testing_support/factories/user_factory.rb +6 -0
  212. data/lib/spree/testing_support/factory_bot.rb +2 -2
  213. data/lib/spree/testing_support/order_walkthrough.rb +6 -8
  214. data/lib/spree/testing_support/preferences.rb +0 -25
  215. data/lib/spree/testing_support/silence_deprecations.rb +9 -0
  216. data/lib/tasks/colorado_delivery_fee.rake +28 -0
  217. data/lib/tasks/payment_method.rake +29 -0
  218. data/lib/tasks/solidus/check_orders_with_invalid_email.rake +18 -0
  219. data/lib/tasks/solidus/delete_prices_with_nil_amount.rake +8 -0
  220. data/lib/tasks/solidus/split_promotions_with_any_match_policy.rake +33 -0
  221. data/solidus_core.gemspec +14 -7
  222. metadata +127 -78
  223. data/app/mailers/spree/test_mailer.rb +0 -13
  224. data/app/models/concerns/spree/user_payment_source.rb +0 -26
  225. data/app/models/spree/calculator/free_shipping.rb +0 -22
  226. data/app/models/spree/calculator/percent_per_item.rb +0 -51
  227. data/app/models/spree/calculator/price_sack.rb +0 -28
  228. data/app/models/spree/gateway/bogus.rb +0 -13
  229. data/app/models/spree/gateway/bogus_simple.rb +0 -13
  230. data/app/models/spree/gateway.rb +0 -14
  231. data/app/models/spree/order/checkout.rb +0 -244
  232. data/app/models/spree/order_capturing.rb +0 -50
  233. data/app/models/spree/promotion_handler/free_shipping.rb +0 -9
  234. data/app/models/spree/tax/shipping_rate_taxer.rb +0 -24
  235. data/lib/generators/solidus/install/templates/vendor/assets/javascripts/spree/frontend/all.js +0 -10
  236. data/lib/generators/solidus/install/templates/vendor/assets/stylesheets/spree/frontend/all.css +0 -9
  237. data/lib/generators/spree/install/install_generator.rb +0 -15
  238. data/lib/solidus/migrations/rename_gateways.rb +0 -41
  239. data/lib/spree/core/current_store.rb +0 -24
  240. data/lib/spree/paranoia_deprecations.rb +0 -41
  241. data/lib/spree/promo/environment.rb +0 -12
  242. data/lib/spree/testing_support/bar_ability.rb +0 -19
  243. data/lib/tasks/core.rake +0 -104
  244. data/lib/tasks/email.rake +0 -12
  245. data/lib/tasks/migrations/copy_order_bill_address_to_credit_card.rake +0 -119
  246. data/lib/tasks/migrations/migrate_address_names.rake +0 -158
  247. data/lib/tasks/migrations/migrate_default_billing_addresses_to_address_book.rake +0 -26
  248. data/lib/tasks/migrations/migrate_shipping_rate_taxes.rake +0 -22
  249. data/lib/tasks/migrations/migrate_user_addresses.rake +0 -34
  250. data/lib/tasks/migrations/rename_gateways.rake +0 -23
  251. data/lib/tasks/order_capturing.rake +0 -27
  252. data/lib/tasks/upgrade.rake +0 -13
data/lib/tasks/core.rake DELETED
@@ -1,104 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'active_record'
4
-
5
- def prompt_for_agree(prompt)
6
- print prompt
7
- ["y", "yes"].include? STDIN.gets.strip.downcase
8
- end
9
-
10
- namespace :db do
11
- desc 'Loads a specified fixture file:
12
- use rake db:load_file[/absolute/path/to/sample/filename.rb]'
13
-
14
- task :load_file, [:file, :dir] => :environment do |_t, args|
15
- Spree::Deprecation.warn("load_file has been deprecated. Please load your own file.")
16
- file = Pathname.new(args.file)
17
-
18
- puts "loading ruby #{file}"
19
- require file
20
- end
21
-
22
- desc "Loads fixtures from the the dir you specify using rake db:load_dir[loadfrom]"
23
- task :load_dir, [:dir] => :environment do |_t, args|
24
- Spree::Deprecation.warn("rake spree:load_dir has been deprecated and will be removed with Solidus 3.0. Please load your files directly.")
25
- dir = args.dir
26
- dir = File.join(Rails.root, "db", dir) if Pathname.new(dir).relative?
27
-
28
- ruby_files = {}
29
- Dir.glob(File.join(dir, '**/*.{rb}')).each do |fixture_file|
30
- ruby_files[File.basename(fixture_file, '.*')] = fixture_file
31
- end
32
- ruby_files.sort.each do |fixture, ruby_file|
33
- # If file is exists within application it takes precendence.
34
- if File.exist?(File.join(Rails.root, "db/default/spree", "#{fixture}.rb"))
35
- ruby_file = File.expand_path(File.join(Rails.root, "db/default/spree", "#{fixture}.rb"))
36
- end
37
- # an invoke will only execute the task once
38
- Rake::Task["db:load_file"].execute( Rake::TaskArguments.new([:file], [ruby_file]) )
39
- end
40
- end
41
-
42
- desc "Migrate schema to version 0 and back up again. WARNING: Destroys all data in tables!!"
43
- task remigrate: :environment do
44
- Spree::Deprecation.warn("remigrate has been deprecated. Please use db:reset or other db: commands instead.")
45
-
46
- if ENV['SKIP_NAG'] || ENV['OVERWRITE'].to_s.casecmp('true') || prompt_for_agree("This task will destroy any data in the database. Are you sure you want to \ncontinue? [y/n] ")
47
-
48
- # Drop all tables
49
- ActiveRecord::Base.connection.tables.each { |t| ActiveRecord::Base.connection.drop_table t }
50
-
51
- # Migrate upward
52
- Rake::Task["db:migrate"].invoke
53
-
54
- # Dump the schema
55
- Rake::Task["db:schema:dump"].invoke
56
- else
57
- puts "Task cancelled."
58
- exit
59
- end
60
- end
61
-
62
- desc "Bootstrap is: migrating, loading defaults, sample data and seeding (for all extensions) and load_products tasks"
63
- task :bootstrap do
64
- Spree::Deprecation.warn("rake bootstrap has been deprecated, please run db:setup instead.")
65
-
66
- # remigrate unless production mode (as saftey check)
67
- if %w[demo development test].include? Rails.env
68
- if ENV['AUTO_ACCEPT'] || prompt_for_agree("This task will destroy any data in the database. Are you sure you want to \ncontinue? [y/n] ")
69
- ENV['SKIP_NAG'] = 'yes'
70
- Rake::Task["db:create"].invoke
71
- Rake::Task["db:remigrate"].invoke
72
- else
73
- puts "Task cancelled, exiting."
74
- exit
75
- end
76
- else
77
- puts "NOTE: Bootstrap in production mode will not drop database before migration"
78
- Rake::Task["db:migrate"].invoke
79
- end
80
-
81
- ActiveRecord::Base.send(:subclasses).each(&:reset_column_information)
82
-
83
- load_defaults = Spree::Country.count == 0
84
- load_defaults ||= prompt_for_agree('Countries present, load sample data anyways? [y/n]: ')
85
- if load_defaults
86
- Rake::Task["db:seed"].invoke
87
- end
88
-
89
- if Rails.env.production? && Spree::Product.count > 0
90
- load_sample = prompt_for_agree("WARNING: In Production and products exist in database, load sample data anyways? [y/n]:" )
91
- else
92
- load_sample = true if ENV['AUTO_ACCEPT']
93
- load_sample ||= prompt_for_agree('Load Sample Data? [y/n]: ')
94
- end
95
-
96
- if load_sample
97
- # Reload models' attributes in case they were loaded in old migrations with wrong attributes
98
- ActiveRecord::Base.descendants.each(&:reset_column_information)
99
- Rake::Task["spree_sample:load"].invoke
100
- end
101
-
102
- puts "Bootstrap Complete.\n\n"
103
- end
104
- end
data/lib/tasks/email.rake DELETED
@@ -1,12 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- namespace :email do
4
- desc 'Sends test email to specified address - Example: EMAIL=solidus@example.com bundle exec rake email:test'
5
- task test: :environment do
6
- Spree::Deprecation.warn("rake email:test has been deprecated and will be removed with Solidus 3.0")
7
-
8
- raise ArgumentError, "Must pass EMAIL environment variable. Example: EMAIL=solidus@example.com bundle exec rake email:test" if ENV['EMAIL'].blank?
9
-
10
- Spree::TestMailer.test_email(ENV['EMAIL']).deliver!
11
- end
12
- end
@@ -1,119 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- namespace 'spree:migrations:copy_order_bill_address_to_credit_card' do
4
- # This copies the billing address from the order associated with a
5
- # credit card's most recent payment to the credit card.
6
-
7
- # Used in the migration CopyOrderBillAddressToCreditCard and made available as a
8
- # rake task to allow running it a second time after deploying the new code, in
9
- # case some order->credit card data was missed between the time that the
10
- # migration was run and the application servers were restarted with the new
11
- # code.
12
-
13
- # This task should be safe to run multiple times.
14
-
15
- task up: :environment do
16
- Spree::Deprecation.warn("rake spree:migrations:copy_order_bill_address_to_credit_card:up has been deprecated and will be removed with Solidus 3.0.")
17
-
18
- if Spree::CreditCard.connection.adapter_name =~ /postgres/i
19
- postgres_copy
20
- else
21
- ruby_copy
22
- end
23
- end
24
-
25
- task down: :environment do
26
- Spree::Deprecation.warn("rake spree:migrations:copy_order_bill_address_to_credit_card:down has been deprecated and will be removed with Solidus 3.0.")
27
-
28
- Spree::CreditCard.update_all(address_id: nil)
29
- end
30
-
31
- def ruby_copy
32
- scope = Spree::CreditCard.where(address_id: nil).includes(payments: :order)
33
-
34
- scope.find_each(batch_size: 500) do |cc|
35
- # remove payments that lack a bill address
36
- payments = cc.payments.select { |p| p.order.bill_address_id }
37
-
38
- payment = payments.sort_by do |p|
39
- [
40
- %w(failed invalid).include?(p.state) ? 0 : 1, # prioritize valid payments
41
- p.created_at, # prioritize more recent payments
42
- ]
43
- end.last
44
-
45
- next if payment.nil?
46
-
47
- cc.update_column(:address_id, payment.order.bill_address_id)
48
- puts "Successfully associated billing address (#{payment.order.bill_address_id}) with credit card (#{cc.id})"
49
- end
50
- end
51
-
52
- # This was 20x faster for us but the syntax is postgres-specific. I'm sure
53
- # there are equivalent versions for other DBs if someone wants to write them.
54
- # I took a quick stab at crafting a cross-db compatible version but it was
55
- # slow.
56
- def postgres_copy
57
- batch_size = 10_000
58
-
59
- current_start_id = 1
60
-
61
- while current_start_id <= last_credit_card_id
62
- current_end_id = current_start_id + batch_size
63
- puts "updating #{current_start_id} to #{current_end_id}"
64
-
65
- # first try to find a valid payment for each credit card
66
- Spree::CreditCard.connection.execute(
67
- postgres_sql(
68
- start_id: current_start_id,
69
- end_id: current_end_id,
70
- payment_state: "not in ('failed', 'invalid')"
71
- )
72
- )
73
-
74
- # fall back to using invalid payments for each credit card
75
- Spree::CreditCard.connection.execute(
76
- postgres_sql(
77
- start_id: current_start_id,
78
- end_id: current_end_id,
79
- payment_state: "in ('failed', 'invalid')"
80
- )
81
- )
82
-
83
- current_start_id += batch_size
84
- end
85
- end
86
-
87
- def postgres_sql(start_id:, end_id:, payment_state:)
88
- <<-SQL
89
- update spree_credit_cards c
90
- set address_id = o.bill_address_id
91
- from spree_payments p
92
- inner join spree_orders o
93
- on o.id = p.order_id
94
- and o.bill_address_id is not null
95
- left join (
96
- select p2.*
97
- from spree_payments p2
98
- inner join spree_orders o2
99
- on o2.id = p2.order_id
100
- and o2.bill_address_id is not null
101
- ) more_recent_payment
102
- on more_recent_payment.source_id = p.source_id
103
- and more_recent_payment.source_type = 'Spree::CreditCard'
104
- and more_recent_payment.created_at > p.created_at
105
- and more_recent_payment.state #{payment_state}
106
- where c.address_id is null
107
- and p.source_id = c.id
108
- and p.source_type = 'Spree::CreditCard'
109
- and p.state #{payment_state}
110
- and more_recent_payment.id is null
111
- and o.bill_address_id is not null
112
- and c.id between #{start_id} and #{end_id}
113
- SQL
114
- end
115
-
116
- def last_credit_card_id
117
- Spree::CreditCard.last.try!(:id) || 0
118
- end
119
- end
@@ -1,158 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'thor'
4
-
5
- namespace :solidus do
6
- namespace :migrations do
7
- namespace :migrate_address_names do
8
- desc 'Backfills Spree::Address name attribute using firstname and lastname
9
- concatenation in order to retain historical data when upgrading to new
10
- address name format'
11
- task up: :environment do
12
- puts "Combining addresses' firstname and lastname into name ... "
13
- class Spree::AddressForMigration < ApplicationRecord
14
- self.table_name = 'spree_addresses'
15
- end
16
-
17
- records = Spree::AddressForMigration.unscoped.where(name: [nil, ''])
18
- count = records.count
19
- connection = ActiveRecord::Base.connection
20
- adapter_name = connection.adapter_name.downcase
21
- shell = Thor::Shell::Basic.new
22
- puts " Your DB contains #{count} addresses that may be affected by this task."
23
- # `trim` is not needed for pg or mysql when using `concat_ws`:
24
- # select concat_ws('joinstring', 'foo', null);
25
- # concat_ws
26
- # -----------
27
- # foo
28
- # (1 row)
29
- # select concat_ws('joinstring', 'foo', null) = trim(concat_ws('joinstring', 'foo', null));
30
- # ?column?
31
- # ----------
32
- # t
33
- # (1 row)
34
- unless count.zero?
35
- concat_statement = begin
36
- case adapter_name
37
- when /sqlite/
38
- "name = TRIM(COALESCE(firstname, '') || ' ' || COALESCE(lastname, ''))"
39
- when /postgres/, /mysql2/
40
- "name = CONCAT_WS(' ', firstname, lastname)"
41
- else
42
- abort " No migration path available for adapter #{adapter_name}. Please write your own."
43
- end
44
- end
45
-
46
- # The batch size should be limited to avoid locking the table records for too long. These are
47
- # the numbers I got with 1_000_000 records in `spree_addresses`, all with different name and
48
- # surname, with postgresql:
49
- #
50
- # Updating 1000000 records in one shot
51
- # batch took 178 seconds
52
- #
53
- # Updating 1000000 addresses in batches of 200000
54
- # batch took 36 seconds
55
- # batch took 31 seconds
56
- # batch took 31 seconds
57
- # batch took 31 seconds
58
- # batch took 30 seconds
59
- #
60
- # Updating 1000000 addresses in batches of 150000
61
- # batch took 29 seconds
62
- # batch took 27 seconds
63
- # batch took 27 seconds
64
- # batch took 27 seconds
65
- # batch took 26 seconds
66
- # batch took 26 seconds
67
- # batch took 19 seconds
68
- #
69
- # Updating 1000000 addresses in batches of 100000
70
- # batch took 17 seconds
71
- # batch took 15 seconds
72
- # batch took 17 seconds
73
- # batch took 17 seconds
74
- # batch took 17 seconds
75
- # batch took 17 seconds
76
- # batch took 17 seconds
77
- # batch took 17 seconds
78
- # batch took 17 seconds
79
- # batch took 17 seconds
80
- #
81
- # This is with mysql:
82
- # Updating 1000000 records in one shot
83
- # batch updated in 153 seconds
84
- #
85
- # Updating 1000000 records in batches of 200000, this may take a while...
86
- # batch took 41 seconds
87
- # batch took 37 seconds
88
- # batch took 35 seconds
89
- # batch took 28 seconds
90
- # batch took 27 seconds
91
- #
92
- # Updating 1000000 records in batches of 150000, this may take a while...
93
- # batch took 30 seconds
94
- # batch took 29 seconds
95
- # batch took 18 seconds
96
- # batch took 18 seconds
97
- # batch took 17 seconds
98
- # batch took 29 seconds
99
- # batch took 12 seconds
100
- #
101
- # Updating 1000000 records in batches of 100000, this may take a while...
102
- # batch took 10 seconds
103
- # batch took 11 seconds
104
- # batch took 12 seconds
105
- # batch took 13 seconds
106
- # batch took 12 seconds
107
- # batch took 12 seconds
108
- # batch took 14 seconds
109
- # batch took 19 seconds
110
- # batch took 20 seconds
111
- # batch took 21 seconds
112
- #
113
- # Please note that the migration will be much faster when there's no index
114
- # on the `name` column. For example, with mysql each batch takes exactly
115
- # the same time:
116
- #
117
- # Updating 1000000 records in batches of 200000, this may take a while...
118
- # batch took 17 seconds
119
- # batch took 17 seconds
120
- # batch took 17 seconds
121
- # batch took 16 seconds
122
- # batch took 17 seconds
123
- #
124
- # So, if special need arise, one can drop the index added with migration
125
- # 20210122110141_add_name_to_spree_addresses.rb and add the index later,
126
- # in non blocking ways. For postgresql:
127
- # add_index(:spree_addresses, :name, algorithm: :concurrently)
128
- #
129
- # For mysql 5.6:
130
- # sql = "ALTER TABLE spree_addresses ADD INDEX index_spree_addresses_on_name (name), ALGORITHM=INPLACE, LOCK=NONE;"
131
- # ActiveRecord::Base.connection.execute sql
132
- #
133
- puts ' Data migration will happen in batches. The default value is 100_000, which should take less than 20 seconds on mysql or postgresql.'
134
- size = shell.ask(' Please enter a different batch size, or press return to confirm the default: ')
135
- size = (size.presence || 100_000).to_i
136
-
137
- abort " Invalid batch size number #{size}, please run the task again." unless size.positive?
138
-
139
- batches_total = (count / size).ceil
140
- puts " We're going to migrate #{count} records in #{batches_total} batches of #{size}."
141
-
142
- answer = shell.ask(' Do you want to proceed?', limited_to: ['Y', 'N'], case_insensitive: true)
143
- if answer == 'Y'
144
- puts " Updating #{count} records in batches of #{size}, this may take a while..."
145
-
146
- records.in_batches(of: size).each.with_index(1) do |batch, index|
147
- now = Time.zone.now
148
- batch.update_all(concat_statement)
149
- puts " Batch #{index}/#{batches_total} done in #{(Time.zone.now - now).to_i} seconds."
150
- end
151
- else
152
- puts " Database not migrated. Please, make sure to fill address's name field on your own."
153
- end
154
- end
155
- end
156
- end
157
- end
158
- end
@@ -1,26 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- namespace :solidus do
4
- namespace :migrations do
5
- namespace :migrate_default_billing_addresses_to_address_book do
6
- task up: :environment do
7
- print "Migrating default billing addresses to address book ... "
8
- if Spree::UserAddress.where(default_billing: true).any?
9
- Spree.user_class.joins(:bill_address).update_all(bill_address_id: nil) # rubocop:disable Rails/SkipsModelValidations
10
- end
11
- Spree::UserAddress.joins(
12
- <<~SQL
13
- JOIN spree_users ON spree_user_addresses.user_id = spree_users.id
14
- AND spree_user_addresses.address_id = spree_users.bill_address_id
15
- SQL
16
- ).update_all(default_billing: true)
17
- puts "Success"
18
- end
19
-
20
- task down: :environment do
21
- Spree::UserAddress.update_all(default_billing: false) # rubocop:disable Rails/SkipsModelValidations
22
- puts "Rolled back default billing address migration to address book"
23
- end
24
- end
25
- end
26
- end
@@ -1,22 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- namespace :solidus do
4
- namespace :migrations do
5
- namespace :migrate_shipping_rate_taxes do
6
- task up: :environment do
7
- Spree::Deprecation.warn("rake spree:migrations:migrate_shipping_rate_taxes:up has been deprecated and will be removed with Solidus 3.0.")
8
-
9
- print "Adding persisted tax notes to historic shipping rates ... "
10
- Spree::ShippingRate.where.not(tax_rate_id: nil).find_each do |shipping_rate|
11
- tax_rate = Spree::TaxRate.unscoped.find(shipping_rate.tax_rate_id)
12
- shipping_rate.taxes.find_or_create_by!(
13
- tax_rate: tax_rate,
14
- amount: tax_rate.compute_amount(shipping_rate)
15
- )
16
- end
17
- Spree::ShippingRate.where.not(tax_rate_id: nil).update_all(tax_rate_id: nil)
18
- puts "Success."
19
- end
20
- end
21
- end
22
- end
@@ -1,34 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- namespace 'spree:migrations:migrate_user_addresses' do
4
- # This creates an entry in the user_addresses table for a user's currently
5
- # associated shipping and billing addresses.
6
-
7
- # This task should not need to be run more than once. But the de-dup behavior in
8
- # UserAddressBook should make it safe.
9
- # When the code (in the same PR) is deployed, each new order's addresses will be added
10
- # to the user's address book. This will catch up all the historical data.
11
-
12
- task up: :environment do
13
- Spree::Deprecation.warn("rake spree:migrations:migrate_user_addresses:up has been deprecated and will be removed with Solidus 3.0.")
14
-
15
- Spree.user_class.find_each(batch_size: 500) do |user|
16
- ship_address = Spree::Address.find_by(id: user.ship_address_id)
17
- bill_address = Spree::Address.find_by(id: user.bill_address_id)
18
-
19
- current_addresses = [bill_address, ship_address].compact.uniq
20
-
21
- current_addresses.each do |address|
22
- # since ship_address is last, it will override bill_address as default when both are present
23
- user.save_in_address_book(address.attributes, true)
24
- end
25
-
26
- puts "Migrated addresses for user ##{user.id}"
27
- end
28
- end
29
-
30
- task down: :environment do
31
- Spree::Deprecation.warn("rake spree:migrations:migrate_user_addresses:down has been deprecated and will be removed with Solidus 3.0.")
32
- Spree::UserAddress.delete_all
33
- end
34
- end
@@ -1,23 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- require 'solidus/migrations/rename_gateways'
4
-
5
- namespace 'solidus:migrations:rename_gateways' do
6
- task up: :environment do
7
- Spree::Deprecation.warn("rake solidus:migrations:rename_gateways:up has been deprecated and will be removed with Solidus 3.0.")
8
- count = Solidus::Migrations::RenameGateways.new.up
9
-
10
- unless ENV['VERBOSE'] == 'false' || !verbose
11
- puts "Renamed #{count} gateways into payment methods."
12
- end
13
- end
14
-
15
- task down: :environment do
16
- Spree::Deprecation.warn("rake solidus:migrations:rename_gateways:down has been deprecated and will be removed with Solidus 3.0.")
17
- count = Solidus::Migrations::RenameGateways.new.down
18
-
19
- unless ENV['VERBOSE'] == 'false' || !verbose
20
- puts "Renamed #{count} payment methods into gateways."
21
- end
22
- end
23
- end
@@ -1,27 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- namespace :order_capturing do
4
- desc "Looks for orders with inventory that is fully shipped/short-shipped, and captures money for it"
5
- task capture_payments: :environment do
6
- Spree::Deprecation.warn("rake order_capturing:capture_payments has been deprecated and will be removed with Solidus 3.0.")
7
-
8
- failures = []
9
- orders = Spree::Order.complete.where(payment_state: 'balance_due').where('completed_at > ?', Spree::Config[:order_capturing_time_window].days.ago)
10
-
11
- orders.find_each do |order|
12
- if order.inventory_units.all? { |iu| iu.canceled? || iu.shipped? }
13
- if Spree::OrderCapturing.failure_handler
14
- begin
15
- Spree::OrderCapturing.new(order).capture_payments
16
- rescue StandardError => e
17
- failures << { message: "Order #{order.number} unable to capture. #{e.class}: #{e.message}" }
18
- end
19
- else
20
- Spree::OrderCapturing.new(order).capture_payments
21
- end
22
- end
23
- end
24
-
25
- Spree::OrderCapturing.failure_handler.call(failures) if failures.any?
26
- end
27
- end
@@ -1,13 +0,0 @@
1
- # frozen_string_literal: true
2
-
3
- namespace :solidus do
4
- namespace :upgrade do
5
- desc "Upgrade Solidus to version 2.11"
6
- task two_point_eleven: [
7
- 'solidus:migrations:migrate_default_billing_addresses_to_address_book:up',
8
- 'solidus:migrations:migrate_address_names:up'
9
- ] do
10
- puts "Your Solidus install is ready for Solidus 2.11"
11
- end
12
- end
13
- end