solidus_core 2.11.10 → 3.3.1

Sign up to get free protection for your applications and to get access to all the features.
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