solidus_core 2.1.1 → 2.2.0.beta1

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 (145) hide show
  1. checksums.yaml +4 -4
  2. data/Rakefile +0 -1
  3. data/app/assets/config/solidus_core_manifest.js +1 -0
  4. data/app/assets/javascripts/spree.js.erb +72 -0
  5. data/app/helpers/spree/store_helper.rb +5 -0
  6. data/app/jobs/spree/promotion_code_batch_job.rb +24 -0
  7. data/app/mailers/spree/promotion_code_batch_mailer.rb +13 -0
  8. data/app/models/concerns/spree/calculated_adjustments.rb +1 -1
  9. data/app/models/concerns/spree/ordered_property_value_list.rb +2 -2
  10. data/app/models/concerns/spree/user_address_book.rb +4 -4
  11. data/app/models/concerns/spree/user_methods.rb +7 -0
  12. data/app/models/concerns/spree/user_payment_source.rb +12 -5
  13. data/app/models/spree/address.rb +14 -3
  14. data/app/models/spree/adjustment.rb +13 -1
  15. data/app/models/spree/app_configuration.rb +0 -19
  16. data/app/models/spree/base.rb +2 -0
  17. data/app/models/spree/credit_card.rb +34 -43
  18. data/app/models/spree/gateway/bogus.rb +1 -1
  19. data/app/models/spree/gateway.rb +6 -4
  20. data/app/models/spree/inventory_unit.rb +3 -2
  21. data/app/models/spree/order/checkout.rb +187 -273
  22. data/app/models/spree/order.rb +137 -71
  23. data/app/models/spree/order_contents.rb +1 -1
  24. data/app/models/spree/order_inventory.rb +11 -11
  25. data/app/models/spree/order_promotion.rb +2 -0
  26. data/app/models/spree/order_update_attributes.rb +1 -8
  27. data/app/models/spree/order_updater.rb +67 -63
  28. data/app/models/spree/payment.rb +0 -1
  29. data/app/models/spree/payment_create.rb +27 -7
  30. data/app/models/spree/payment_method/store_credit.rb +3 -3
  31. data/app/models/spree/payment_method.rb +4 -1
  32. data/app/models/spree/payment_source.rb +45 -0
  33. data/app/models/spree/product/scopes.rb +24 -24
  34. data/app/models/spree/product.rb +4 -4
  35. data/app/models/spree/promotion.rb +2 -0
  36. data/app/models/spree/promotion_code/batch_builder.rb +63 -0
  37. data/app/models/spree/promotion_code.rb +1 -0
  38. data/app/models/spree/promotion_code_batch.rb +25 -0
  39. data/app/models/spree/promotion_handler/cart.rb +2 -2
  40. data/app/models/spree/promotion_handler/coupon.rb +1 -2
  41. data/app/models/spree/promotion_handler/free_shipping.rb +32 -21
  42. data/app/models/spree/promotion_handler/page.rb +1 -1
  43. data/app/models/spree/reimbursement.rb +1 -1
  44. data/app/models/spree/return_authorization.rb +0 -28
  45. data/app/models/spree/return_item.rb +1 -1
  46. data/app/models/spree/shipment.rb +4 -4
  47. data/app/models/spree/shipping_method.rb +2 -2
  48. data/app/models/spree/shipping_rate.rb +1 -1
  49. data/app/models/spree/stock/availability_validator.rb +16 -17
  50. data/app/models/spree/stock/coordinator.rb +3 -3
  51. data/app/models/spree/stock/package.rb +1 -1
  52. data/app/models/spree/stock/quantifier.rb +5 -4
  53. data/app/models/spree/stock_location.rb +2 -2
  54. data/app/models/spree/store.rb +2 -2
  55. data/app/models/spree/store_credit.rb +1 -1
  56. data/app/models/spree/tax/tax_helpers.rb +3 -3
  57. data/app/models/spree/tax_rate.rb +7 -1
  58. data/app/models/spree/taxonomy.rb +1 -1
  59. data/app/models/spree/variant/scopes.rb +5 -5
  60. data/app/models/spree/variant/vat_price_generator.rb +8 -5
  61. data/app/models/spree/variant.rb +1 -0
  62. data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +19 -10
  63. data/app/models/spree/wallet/default_payment_builder.rb +6 -6
  64. data/app/models/spree/wallet.rb +71 -0
  65. data/app/models/spree/wallet_payment_source.rb +17 -0
  66. data/app/models/spree/zone.rb +1 -1
  67. data/app/views/spree/carton_mailer/shipped_email.text.erb +1 -1
  68. data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_errored.text.erb +2 -0
  69. data/app/views/spree/promotion_code_batch_mailer/promotion_code_batch_finished.text.erb +2 -0
  70. data/app/views/spree/reimbursement_mailer/reimbursement_email.html.erb +0 -7
  71. data/app/views/spree/reimbursement_mailer/reimbursement_email.text.erb +0 -5
  72. data/app/views/spree/shared/_error_messages.html.erb +1 -1
  73. data/app/views/spree/shipment_mailer/shipped_email.html.erb +1 -1
  74. data/config/initializers/assets.rb +1 -1
  75. data/config/initializers/friendly_id.rb +1 -1
  76. data/config/locales/en.yml +50 -12
  77. data/db/default/spree/store_credit.rb +2 -1
  78. data/db/migrate/20130826062534_add_depth_to_spree_taxons.rb +4 -6
  79. data/db/migrate/20160420044191_create_spree_wallet_payment_sources.rb +23 -0
  80. data/db/migrate/20160420181916_migrate_credit_cards_to_wallet_payment_sources.rb +26 -0
  81. data/db/migrate/20161017102621_create_spree_promotion_code_batch.rb +36 -0
  82. data/db/migrate/20161129035810_add_index_to_spree_payments_number.rb +5 -0
  83. data/db/migrate/20170223235001_remove_spree_store_credits_column.rb +5 -0
  84. data/lib/generators/spree/dummy/templates/rails/application.rb +1 -1
  85. data/lib/generators/spree/dummy/templates/rails/test.rb +1 -1
  86. data/lib/generators/spree/install/install_generator.rb +6 -5
  87. data/lib/spree/core/controller_helpers/payment_parameters.rb +54 -0
  88. data/lib/spree/core/engine.rb +6 -9
  89. data/lib/spree/core/version.rb +1 -1
  90. data/lib/spree/core.rb +0 -1
  91. data/lib/spree/money.rb +18 -0
  92. data/lib/spree/permission_sets/default_customer.rb +1 -1
  93. data/lib/spree/permitted_attributes.rb +1 -1
  94. data/lib/spree/testing_support/authorization_helpers.rb +1 -0
  95. data/lib/spree/testing_support/capybara_ext.rb +13 -0
  96. data/lib/spree/testing_support/factories/order_factory.rb +5 -1
  97. data/lib/spree/testing_support/factories/payment_factory.rb +1 -1
  98. data/lib/spree/testing_support/factories/shipment_factory.rb +0 -1
  99. data/solidus_core.gemspec +3 -3
  100. data/spec/jobs/promotion_code_batch_job_spec.rb +65 -0
  101. data/spec/lib/calculated_adjustments_spec.rb +105 -1
  102. data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +4 -1
  103. data/spec/lib/spree/core/testing_support/factories/payment_factory_spec.rb +8 -0
  104. data/spec/lib/spree/money_spec.rb +32 -0
  105. data/spec/lib/spree/permission_sets/default_customer_spec.rb +20 -0
  106. data/spec/mailers/promotion_code_batch_mailer_spec.rb +45 -0
  107. data/spec/models/spree/credit_card_spec.rb +86 -86
  108. data/spec/models/spree/gateway_spec.rb +3 -1
  109. data/spec/models/spree/inventory_unit_spec.rb +12 -4
  110. data/spec/models/spree/order/checkout_spec.rb +11 -32
  111. data/spec/models/spree/order/tax_spec.rb +2 -2
  112. data/spec/models/spree/order_contents_spec.rb +24 -1
  113. data/spec/models/spree/order_inventory_spec.rb +130 -83
  114. data/spec/models/spree/order_spec.rb +15 -117
  115. data/spec/models/spree/order_update_attributes_spec.rb +1 -44
  116. data/spec/models/spree/order_updater_spec.rb +10 -13
  117. data/spec/models/spree/payment_create_spec.rb +5 -1
  118. data/spec/models/spree/payment_method_spec.rb +16 -0
  119. data/spec/models/spree/payment_spec.rb +14 -8
  120. data/spec/models/spree/promotion_code/batch_builder_spec.rb +61 -0
  121. data/spec/models/spree/promotion_code_batch_spec.rb +58 -0
  122. data/spec/models/spree/promotion_code_spec.rb +4 -0
  123. data/spec/models/spree/promotion_spec.rb +3 -6
  124. data/spec/models/spree/return_authorization_spec.rb +0 -59
  125. data/spec/models/spree/shipment_spec.rb +4 -4
  126. data/spec/models/spree/stock/availability_validator_spec.rb +64 -9
  127. data/spec/models/spree/tax/item_adjuster_spec.rb +1 -2
  128. data/spec/models/spree/unit_cancel_spec.rb +0 -85
  129. data/spec/models/spree/user_spec.rb +3 -1
  130. data/spec/models/spree/variant/vat_price_generator_spec.rb +8 -2
  131. data/spec/models/spree/variant_spec.rb +16 -4
  132. data/spec/models/spree/wallet_payment_source_spec.rb +46 -0
  133. data/spec/models/spree/wallet_spec.rb +128 -0
  134. data/spec/support/concerns/payment_source.rb +64 -0
  135. metadata +51 -25
  136. data/app/assets/javascripts/spree.js.coffee.erb +0 -64
  137. data/app/models/spree/promotion_builder.rb +0 -55
  138. data/app/models/spree/promotion_code/code_builder.rb +0 -62
  139. data/config/initializers/premailer_assets.rb +0 -1
  140. data/lib/spree/core/unreturned_item_charger.rb +0 -106
  141. data/lib/tasks/exchanges.rake +0 -47
  142. data/spec/lib/spree/core/unreturned_item_charger_spec.rb +0 -126
  143. data/spec/lib/tasks/exchanges_spec.rb +0 -220
  144. data/spec/models/spree/promotion_builder_spec.rb +0 -120
  145. data/spec/models/spree/promotion_code/code_builder_spec.rb +0 -77
@@ -0,0 +1,46 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::WalletPaymentSource, type: :model do
4
+ subject { Spree::WalletPaymentSource }
5
+
6
+ describe "validation" do
7
+ context 'with a non-PaymentSource model' do
8
+ with_model 'NonPaymentSource', scope: :all do
9
+ model do
10
+ # We have to set this up or else `inverse_of` prevents us from testing our code
11
+ has_many :wallet_payment_sources, class_name: 'Spree::WalletPaymentSource', as: :payment_source, inverse_of: :payment_source
12
+ end
13
+ end
14
+
15
+ let(:payment_source) { NonPaymentSource.create! }
16
+
17
+ it "errors when `payment_source` is not a `Spree::PaymentSource`" do
18
+ wallet_payment_source = Spree::WalletPaymentSource.new(
19
+ payment_source: payment_source,
20
+ user: create(:user)
21
+ )
22
+
23
+ expect(wallet_payment_source).not_to be_valid
24
+ expect(wallet_payment_source.errors.messages).to eq(
25
+ { payment_source: ["has to be a Spree::PaymentSource"] }
26
+ )
27
+ end
28
+ end
29
+
30
+ it "is valid with a `credit_card` as `payment_source`" do
31
+ valid_attrs = {
32
+ payment_source: create(:credit_card),
33
+ user: create(:user)
34
+ }
35
+ expect(subject.new(valid_attrs)).to be_valid
36
+ end
37
+
38
+ it "is valid with `store_credit` as `payment_source`" do
39
+ valid_attrs = {
40
+ payment_source: create(:store_credit),
41
+ user: create(:user)
42
+ }
43
+ expect(subject.new(valid_attrs)).to be_valid
44
+ end
45
+ end
46
+ end
@@ -0,0 +1,128 @@
1
+ require 'spec_helper'
2
+
3
+ describe Spree::Wallet, type: :model do
4
+ let(:user) { create(:user) }
5
+ let(:credit_card) { create(:credit_card, user_id: user.id) }
6
+ let(:store_credit) { create(:store_credit, user_id: user.id) }
7
+ subject(:wallet) { Spree::Wallet.new(user) }
8
+
9
+ describe "#add" do
10
+ context "with valid payment source" do
11
+ it "creates a wallet_payment_source for this user's wallet" do
12
+ expect { subject.add(credit_card) }.to change(Spree::WalletPaymentSource, :count).by(1)
13
+ end
14
+
15
+ it "only creates the payment source once" do
16
+ subject.add(credit_card)
17
+ expect { subject.add(credit_card) }.to_not change(Spree::WalletPaymentSource, :count)
18
+ end
19
+ end
20
+ end
21
+
22
+ describe "#remove" do
23
+ context "with payment_source not in the wallet" do
24
+ it "will raise a RecordNotFound exception" do
25
+ expect { subject.remove(credit_card) }.to raise_error(ActiveRecord::RecordNotFound)
26
+ end
27
+ end
28
+
29
+ context "with the payment_source in the wallet" do
30
+ before { subject.add(credit_card) }
31
+ it "will remove the payment source from the wallet" do
32
+ expect { subject.remove(credit_card) }.to change(Spree::WalletPaymentSource, :count).by(-1)
33
+ end
34
+ end
35
+ end
36
+
37
+ describe "#wallet_payment_sources" do
38
+ context "with no payment sources" do
39
+ it "returns an empty Array" do
40
+ expect(subject.wallet_payment_sources).to eql []
41
+ end
42
+ end
43
+
44
+ context "with payment sources" do
45
+ let!(:wallet_credit_card) { subject.add(credit_card) }
46
+ let!(:wallet_store_credit) { subject.add(store_credit) }
47
+
48
+ it "returns all the payment sources" do
49
+ expect(subject.wallet_payment_sources).to include(wallet_credit_card, wallet_store_credit)
50
+ end
51
+ end
52
+ end
53
+
54
+ describe "#find" do
55
+ context "with no payment sources in the wallet" do
56
+ it "returns nil" do
57
+ expect(subject.find(1)).to be_nil
58
+ end
59
+ end
60
+
61
+ context "with payment sources in the wallet" do
62
+ let(:wallet_credit_card) { subject.add(credit_card) }
63
+
64
+ it "finds the wallet payment source by id" do
65
+ expect(subject.find(wallet_credit_card.id)).to eql wallet_credit_card
66
+ end
67
+ end
68
+ end
69
+
70
+ describe "#default_wallet_payment_source=" do
71
+ context "with no current default" do
72
+ let!(:wallet_credit_card) { subject.add(credit_card) }
73
+
74
+ it "marks the passed in payment source as default" do
75
+ expect { subject.default_wallet_payment_source = wallet_credit_card }.to(
76
+ change(subject, :default_wallet_payment_source).
77
+ from(nil).
78
+ to(wallet_credit_card)
79
+ )
80
+ end
81
+ end
82
+
83
+ context "with other payment source already default" do
84
+ let!(:wallet_credit_card) { subject.add(credit_card) }
85
+ let!(:wallet_store_credit) { subject.add(store_credit) }
86
+
87
+ before { subject.default_wallet_payment_source = wallet_credit_card }
88
+
89
+ it "sets the new payment source as the default" do
90
+ expect { subject.default_wallet_payment_source = wallet_store_credit }.to(
91
+ change(subject, :default_wallet_payment_source).
92
+ from(wallet_credit_card).
93
+ to(wallet_store_credit)
94
+ )
95
+ end
96
+ end
97
+
98
+ context 'with a wallet payment source that does not belong to the wallet' do
99
+ let(:other_wallet_credit_card) { other_wallet.add(credit_card) }
100
+ let(:other_wallet) { Spree::Wallet.new(other_user) }
101
+ let(:other_credit_card) { create(:credit_card, user_id: other_user.id) }
102
+ let(:other_user) { create(:user) }
103
+
104
+ it 'raises an error' do
105
+ expect {
106
+ wallet.default_wallet_payment_source = other_wallet_credit_card
107
+ }.to raise_error(Spree::Wallet::Unauthorized)
108
+ end
109
+ end
110
+ end
111
+
112
+ describe "#default_wallet_payment_source" do
113
+ context "with no default payment source present" do
114
+ it "will return nil" do
115
+ expect(subject.default_wallet_payment_source).to be_nil
116
+ end
117
+ end
118
+
119
+ context "with a default payment source" do
120
+ let!(:wallet_credit_card) { subject.add(credit_card) }
121
+ before { subject.default_wallet_payment_source = wallet_credit_card }
122
+
123
+ it "will return the wallet payment source" do
124
+ expect(subject.default_wallet_payment_source).to eql wallet_credit_card
125
+ end
126
+ end
127
+ end
128
+ end
@@ -0,0 +1,64 @@
1
+ RSpec.shared_examples "a payment source" do
2
+ subject(:payment_source) { described_class.new }
3
+
4
+ describe 'attributes' do
5
+ it { is_expected.to respond_to(:imported) }
6
+ it { is_expected.to respond_to(:name) }
7
+ end
8
+
9
+ describe "#associations" do
10
+ it { is_expected.to respond_to(:payments) }
11
+ it { is_expected.to respond_to(:user) }
12
+ end
13
+
14
+ describe "#can_capture?" do
15
+ it "should be true if payment is pending" do
16
+ payment = mock_model(Spree::Payment, pending?: true, created_at: Time.current)
17
+ expect(payment_source.can_capture?(payment)).to be true
18
+ end
19
+
20
+ it "should be true if payment is checkout" do
21
+ payment = mock_model(Spree::Payment, pending?: false, checkout?: true, created_at: Time.current)
22
+ expect(payment_source.can_capture?(payment)).to be true
23
+ end
24
+ end
25
+
26
+ describe "#can_void?" do
27
+ it "should be true if payment is not void" do
28
+ payment = mock_model(Spree::Payment, failed?: false, void?: false)
29
+ expect(payment_source.can_void?(payment)).to be true
30
+ end
31
+ end
32
+
33
+ describe "#can_credit?" do
34
+ it "should be false if payment is not completed" do
35
+ payment = mock_model(Spree::Payment, completed?: false)
36
+ expect(payment_source.can_credit?(payment)).to be false
37
+ end
38
+
39
+ it "should be false when credit_allowed is zero" do
40
+ payment = mock_model(Spree::Payment, completed?: true, credit_allowed: 0, order: mock_model(Spree::Order, payment_state: 'credit_owed'))
41
+ expect(payment_source.can_credit?(payment)).to be false
42
+ end
43
+ end
44
+
45
+ describe "#first_name" do
46
+ before do
47
+ payment_source.name = "Ludwig van Beethoven"
48
+ end
49
+
50
+ it "extracts the first name" do
51
+ expect(payment_source.first_name).to eq "Ludwig"
52
+ end
53
+ end
54
+
55
+ describe "#last_name" do
56
+ before do
57
+ payment_source.name = "Ludwig van Beethoven"
58
+ end
59
+
60
+ it "extracts the last name" do
61
+ expect(payment_source.last_name).to eq "van Beethoven"
62
+ end
63
+ end
64
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: solidus_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.1.1
4
+ version: 2.2.0.beta1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Solidus Team
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-12-12 00:00:00.000000000 Z
11
+ date: 2017-04-11 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemerchant
@@ -132,22 +132,22 @@ dependencies:
132
132
  name: kaminari
133
133
  requirement: !ruby/object:Gem::Requirement
134
134
  requirements:
135
- - - "~>"
136
- - !ruby/object:Gem::Version
137
- version: '0.15'
138
135
  - - ">="
139
136
  - !ruby/object:Gem::Version
140
- version: 0.15.1
137
+ version: '0.17'
138
+ - - "<"
139
+ - !ruby/object:Gem::Version
140
+ version: '2.0'
141
141
  type: :runtime
142
142
  prerelease: false
143
143
  version_requirements: !ruby/object:Gem::Requirement
144
144
  requirements:
145
- - - "~>"
146
- - !ruby/object:Gem::Version
147
- version: '0.15'
148
145
  - - ">="
149
146
  - !ruby/object:Gem::Version
150
- version: 0.15.1
147
+ version: '0.17'
148
+ - - "<"
149
+ - !ruby/object:Gem::Version
150
+ version: '2.0'
151
151
  - !ruby/object:Gem::Dependency
152
152
  name: monetize
153
153
  requirement: !ruby/object:Gem::Requirement
@@ -166,16 +166,22 @@ dependencies:
166
166
  name: paperclip
167
167
  requirement: !ruby/object:Gem::Requirement
168
168
  requirements:
169
- - - "~>"
169
+ - - ">="
170
170
  - !ruby/object:Gem::Version
171
171
  version: '4.2'
172
+ - - "<"
173
+ - !ruby/object:Gem::Version
174
+ version: '6'
172
175
  type: :runtime
173
176
  prerelease: false
174
177
  version_requirements: !ruby/object:Gem::Requirement
175
178
  requirements:
176
- - - "~>"
179
+ - - ">="
177
180
  - !ruby/object:Gem::Version
178
181
  version: '4.2'
182
+ - - "<"
183
+ - !ruby/object:Gem::Version
184
+ version: '6'
179
185
  - !ruby/object:Gem::Dependency
180
186
  name: paranoia
181
187
  requirement: !ruby/object:Gem::Requirement
@@ -298,16 +304,22 @@ dependencies:
298
304
  name: twitter_cldr
299
305
  requirement: !ruby/object:Gem::Requirement
300
306
  requirements:
301
- - - "~>"
307
+ - - ">="
302
308
  - !ruby/object:Gem::Version
303
309
  version: '3.0'
310
+ - - "<"
311
+ - !ruby/object:Gem::Version
312
+ version: '5'
304
313
  type: :runtime
305
314
  prerelease: false
306
315
  version_requirements: !ruby/object:Gem::Requirement
307
316
  requirements:
308
- - - "~>"
317
+ - - ">="
309
318
  - !ruby/object:Gem::Version
310
319
  version: '3.0'
320
+ - - "<"
321
+ - !ruby/object:Gem::Version
322
+ version: '5'
311
323
  - !ruby/object:Gem::Dependency
312
324
  name: email_spec
313
325
  requirement: !ruby/object:Gem::Requirement
@@ -332,12 +344,13 @@ files:
332
344
  - LICENSE
333
345
  - README.md
334
346
  - Rakefile
347
+ - app/assets/config/solidus_core_manifest.js
335
348
  - app/assets/images/logo/solidus_logo.png
336
349
  - app/assets/images/noimage/large.png
337
350
  - app/assets/images/noimage/mini.png
338
351
  - app/assets/images/noimage/product.png
339
352
  - app/assets/images/noimage/small.png
340
- - app/assets/javascripts/spree.js.coffee.erb
353
+ - app/assets/javascripts/spree.js.erb
341
354
  - app/controllers/spree/base_controller.rb
342
355
  - app/helpers/spree/base_helper.rb
343
356
  - app/helpers/spree/checkout_helper.rb
@@ -345,9 +358,11 @@ files:
345
358
  - app/helpers/spree/products_helper.rb
346
359
  - app/helpers/spree/store_helper.rb
347
360
  - app/helpers/spree/taxons_helper.rb
361
+ - app/jobs/spree/promotion_code_batch_job.rb
348
362
  - app/mailers/spree/base_mailer.rb
349
363
  - app/mailers/spree/carton_mailer.rb
350
364
  - app/mailers/spree/order_mailer.rb
365
+ - app/mailers/spree/promotion_code_batch_mailer.rb
351
366
  - app/mailers/spree/reimbursement_mailer.rb
352
367
  - app/mailers/spree/test_mailer.rb
353
368
  - app/models/concerns/spree/adjustment_source.rb
@@ -426,6 +441,7 @@ files:
426
441
  - app/models/spree/payment_method.rb
427
442
  - app/models/spree/payment_method/check.rb
428
443
  - app/models/spree/payment_method/store_credit.rb
444
+ - app/models/spree/payment_source.rb
429
445
  - app/models/spree/preference.rb
430
446
  - app/models/spree/preferences/configuration.rb
431
447
  - app/models/spree/preferences/preferable.rb
@@ -457,11 +473,11 @@ files:
457
473
  - app/models/spree/promotion/rules/user_logged_in.rb
458
474
  - app/models/spree/promotion/rules/user_role.rb
459
475
  - app/models/spree/promotion_action.rb
460
- - app/models/spree/promotion_builder.rb
461
476
  - app/models/spree/promotion_category.rb
462
477
  - app/models/spree/promotion_chooser.rb
463
478
  - app/models/spree/promotion_code.rb
464
- - app/models/spree/promotion_code/code_builder.rb
479
+ - app/models/spree/promotion_code/batch_builder.rb
480
+ - app/models/spree/promotion_code_batch.rb
465
481
  - app/models/spree/promotion_handler/cart.rb
466
482
  - app/models/spree/promotion_handler/coupon.rb
467
483
  - app/models/spree/promotion_handler/free_shipping.rb
@@ -564,8 +580,10 @@ files:
564
580
  - app/models/spree/variant_property_rule.rb
565
581
  - app/models/spree/variant_property_rule_condition.rb
566
582
  - app/models/spree/variant_property_rule_value.rb
583
+ - app/models/spree/wallet.rb
567
584
  - app/models/spree/wallet/add_payment_sources_to_wallet.rb
568
585
  - app/models/spree/wallet/default_payment_builder.rb
586
+ - app/models/spree/wallet_payment_source.rb
569
587
  - app/models/spree/zone.rb
570
588
  - app/models/spree/zone_member.rb
571
589
  - app/views/layouts/spree/base_mailer.html.erb
@@ -575,6 +593,8 @@ files:
575
593
  - app/views/spree/order_mailer/confirm_email.html.erb
576
594
  - app/views/spree/order_mailer/confirm_email.text.erb
577
595
  - app/views/spree/order_mailer/inventory_cancellation_email.text.erb
596
+ - app/views/spree/promotion_code_batch_mailer/promotion_code_batch_errored.text.erb
597
+ - app/views/spree/promotion_code_batch_mailer/promotion_code_batch_finished.text.erb
578
598
  - app/views/spree/reimbursement_mailer/reimbursement_email.html.erb
579
599
  - app/views/spree/reimbursement_mailer/reimbursement_email.text.erb
580
600
  - app/views/spree/shared/_base_mailer_footer.html.erb
@@ -585,7 +605,6 @@ files:
585
605
  - app/views/spree/test_mailer/test_email.text.erb
586
606
  - config/initializers/assets.rb
587
607
  - config/initializers/friendly_id.rb
588
- - config/initializers/premailer_assets.rb
589
608
  - config/locales/en.yml
590
609
  - db/default/spree/countries.rb
591
610
  - db/default/spree/return_reasons.rb
@@ -883,6 +902,8 @@ files:
883
902
  - db/migrate/20160308000300_disallow_adjustment_finalized_nulls.rb
884
903
  - db/migrate/20160318145302_add_timestamps_to_prices.rb
885
904
  - db/migrate/20160330204846_add_missing_timestamp_columns.rb
905
+ - db/migrate/20160420044191_create_spree_wallet_payment_sources.rb
906
+ - db/migrate/20160420181916_migrate_credit_cards_to_wallet_payment_sources.rb
886
907
  - db/migrate/20160509181311_add_country_iso_to_prices.rb
887
908
  - db/migrate/20160527070401_rename_shipment_address_field.rb
888
909
  - db/migrate/20160608162651_ensure_default_store.rb
@@ -893,7 +914,10 @@ files:
893
914
  - db/migrate/20160924135758_remove_is_default_from_prices.rb
894
915
  - db/migrate/20161009141333_remove_currency_from_line_items.rb
895
916
  - db/migrate/20161014221052_add_available_to_columns_and_remove_display_on_from_payment_methods.rb
917
+ - db/migrate/20161017102621_create_spree_promotion_code_batch.rb
896
918
  - db/migrate/20161123154034_add_available_to_users_and_remove_display_on_from_shipping_methods.rb
919
+ - db/migrate/20161129035810_add_index_to_spree_payments_number.rb
920
+ - db/migrate/20170223235001_remove_spree_store_credits_column.rb
897
921
  - db/seeds.rb
898
922
  - lib/generators/spree/custom_user/custom_user_generator.rb
899
923
  - lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt
@@ -940,7 +964,6 @@ files:
940
964
  - lib/spree/core/search/base.rb
941
965
  - lib/spree/core/search/variant.rb
942
966
  - lib/spree/core/stock_configuration.rb
943
- - lib/spree/core/unreturned_item_charger.rb
944
967
  - lib/spree/core/validators/email.rb
945
968
  - lib/spree/core/version.rb
946
969
  - lib/spree/deprecation.rb
@@ -1057,7 +1080,6 @@ files:
1057
1080
  - lib/spree_core.rb
1058
1081
  - lib/tasks/core.rake
1059
1082
  - lib/tasks/email.rake
1060
- - lib/tasks/exchanges.rake
1061
1083
  - lib/tasks/migrations/copy_order_bill_address_to_credit_card.rake
1062
1084
  - lib/tasks/migrations/copy_shipped_shipments_to_cartons.rake
1063
1085
  - lib/tasks/migrations/create_vat_prices.rake
@@ -1072,6 +1094,7 @@ files:
1072
1094
  - spec/helpers/order_helper_spec.rb
1073
1095
  - spec/helpers/products_helper_spec.rb
1074
1096
  - spec/helpers/taxons_helper_spec.rb
1097
+ - spec/jobs/promotion_code_batch_job_spec.rb
1075
1098
  - spec/lib/calculated_adjustments_spec.rb
1076
1099
  - spec/lib/i18n_spec.rb
1077
1100
  - spec/lib/search/base_spec.rb
@@ -1151,15 +1174,14 @@ files:
1151
1174
  - spec/lib/spree/core/testing_support/factories/variant_property_rule_value_factory_spec.rb
1152
1175
  - spec/lib/spree/core/testing_support/factories/zone_factory_spec.rb
1153
1176
  - spec/lib/spree/core/testing_support/preferences_spec.rb
1154
- - spec/lib/spree/core/unreturned_item_charger_spec.rb
1155
1177
  - spec/lib/spree/core/validators/email_spec.rb
1156
1178
  - spec/lib/spree/core/version_spec.rb
1157
1179
  - spec/lib/spree/localized_number_spec.rb
1158
1180
  - spec/lib/spree/migrations_spec.rb
1159
1181
  - spec/lib/spree/money_spec.rb
1182
+ - spec/lib/spree/permission_sets/default_customer_spec.rb
1160
1183
  - spec/lib/tasks/dummy_task.rake
1161
1184
  - spec/lib/tasks/dummy_task_spec.rb
1162
- - spec/lib/tasks/exchanges_spec.rb
1163
1185
  - spec/lib/tasks/migrations/copy_shipped_shipments_to_cartons_spec.rb
1164
1186
  - spec/lib/tasks/migrations/create_vat_prices_spec.rb
1165
1187
  - spec/lib/tasks/migrations/migrate_shipping_rate_taxes_spec.rb
@@ -1167,6 +1189,7 @@ files:
1167
1189
  - spec/lib/tasks/upgrade_spec.rb
1168
1190
  - spec/mailers/carton_mailer_spec.rb
1169
1191
  - spec/mailers/order_mailer_spec.rb
1192
+ - spec/mailers/promotion_code_batch_mailer_spec.rb
1170
1193
  - spec/mailers/reimbursement_mailer_spec.rb
1171
1194
  - spec/mailers/test_mailer_spec.rb
1172
1195
  - spec/models/spree/ability_spec.rb
@@ -1287,9 +1310,9 @@ files:
1287
1310
  - spec/models/spree/promotion/rules/user_role_spec.rb
1288
1311
  - spec/models/spree/promotion/rules/user_spec.rb
1289
1312
  - spec/models/spree/promotion_action_spec.rb
1290
- - spec/models/spree/promotion_builder_spec.rb
1291
1313
  - spec/models/spree/promotion_category_spec.rb
1292
- - spec/models/spree/promotion_code/code_builder_spec.rb
1314
+ - spec/models/spree/promotion_code/batch_builder_spec.rb
1315
+ - spec/models/spree/promotion_code_batch_spec.rb
1293
1316
  - spec/models/spree/promotion_code_spec.rb
1294
1317
  - spec/models/spree/promotion_handler/cart_spec.rb
1295
1318
  - spec/models/spree/promotion_handler/coupon_spec.rb
@@ -1370,11 +1393,14 @@ files:
1370
1393
  - spec/models/spree/variant_property_rule_spec.rb
1371
1394
  - spec/models/spree/variant_property_rule_value_spec.rb
1372
1395
  - spec/models/spree/variant_spec.rb
1396
+ - spec/models/spree/wallet_payment_source_spec.rb
1397
+ - spec/models/spree/wallet_spec.rb
1373
1398
  - spec/models/spree/zone_spec.rb
1374
1399
  - spec/shared_examples/calculator_shared_examples.rb
1375
1400
  - spec/spec_helper.rb
1376
1401
  - spec/support/big_decimal.rb
1377
1402
  - spec/support/concerns/default_price.rb
1403
+ - spec/support/concerns/payment_source.rb
1378
1404
  - spec/support/concerns/working_factories.rb
1379
1405
  - spec/support/dummy_ability.rb
1380
1406
  - spec/support/shared_contexts/rake.rb
@@ -1402,7 +1428,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
1402
1428
  version: 1.8.23
1403
1429
  requirements: []
1404
1430
  rubyforge_project:
1405
- rubygems_version: 2.6.11
1431
+ rubygems_version: 2.6.10
1406
1432
  signing_key:
1407
1433
  specification_version: 4
1408
1434
  summary: Essential models, mailers, and classes for the Solidus e-commerce project.
@@ -1,64 +0,0 @@
1
- #= require jsuri
2
- class window.Spree
3
- @ready: (callback) ->
4
- if typeof Turbolinks isnt 'undefined' and Turbolinks.supported
5
- jQuery(document).on 'turbolinks:load', -> callback(jQuery)
6
- else
7
- jQuery(document).ready(callback)
8
-
9
- @mountedAt: ->
10
- "<%= Rails.application.routes.url_helpers.spree_path(trailing_slash: true) %>"
11
-
12
- @pathFor: (path) ->
13
- locationOrigin = "#{window.location.protocol}//#{window.location.hostname}" + (if window.location.port then ":#{window.location.port}" else "")
14
- "#{locationOrigin}#{@mountedAt()}#{path}"
15
-
16
- # Helper function to take a URL and add query parameters to it
17
- # Uses the JSUri library from here: https://github.com/derek-watson/jsUri
18
- # Thanks to Jake Moffat for the suggestion: https://twitter.com/jakeonrails/statuses/321776992221544449
19
- @url: (uri, query) ->
20
- if Spree.env == 'development' || Spree.env == 'test'
21
- console.warn 'Spree.url is deprecated, please use Spree.ajax for your request instead.'
22
- if uri.path == undefined
23
- uri = new Uri(uri)
24
- if query
25
- $.each query, (key, value) ->
26
- uri.addQueryParam(key, value)
27
- return uri
28
-
29
- # This function automatically appends the API token
30
- # for the user to the end of any URL.
31
- # Immediately after, this string is then passed to jQuery.ajax.
32
- #
33
- # Spree.ajax works in two ways to support common jQuery syntax:
34
- #
35
- # Spree.ajax("url", {settings: 'go here'})
36
- # or:
37
- # Spree.ajax({url: "url", settings: 'go here'})
38
- #
39
- # Spree.getJSON has the same method signature as $.getJSON
40
- @ajax: (url, options) ->
41
- if typeof(url) == "object"
42
- options = url
43
- url = undefined
44
-
45
- options = options || {}
46
-
47
- options = $.extend(options, { headers: { "X-Spree-Token": Spree.api_key } })
48
- $.ajax(url, options)
49
-
50
- @routes:
51
- states_search: @pathFor('api/states')
52
- apply_coupon_code: (order_id) ->
53
- Spree.pathFor("api/orders/#{order_id}/apply_coupon_code")
54
-
55
- @getJSON: (url, data, success) ->
56
- if typeof data is 'function'
57
- success = data
58
- data = undefined
59
- @ajax(
60
- dataType: "json",
61
- url: url,
62
- data: data,
63
- success: success
64
- )
@@ -1,55 +0,0 @@
1
- class Spree::PromotionBuilder
2
- include ActiveModel::Model
3
-
4
- attr_reader :promotion
5
- attr_accessor :base_code, :number_of_codes, :user
6
-
7
- validates :number_of_codes,
8
- numericality: { only_integer: true, greater_than: 0 },
9
- allow_nil: true
10
-
11
- validate :promotion_validity
12
-
13
- class_attribute :code_builder_class
14
- self.code_builder_class = ::Spree::PromotionCode::CodeBuilder
15
-
16
- # @param promotion_attrs [Hash] The desired attributes for the newly promotion
17
- # @param attributes [Hash] The desired attributes for this builder
18
- # @param user [Spree::User] The user who triggered this promotion build
19
- def initialize(attributes = {}, promotion_attributes = {})
20
- @promotion = Spree::Promotion.new(promotion_attributes)
21
- super(attributes)
22
- end
23
-
24
- def perform
25
- if can_build_codes?
26
- @promotion.codes = code_builder.build_promotion_codes
27
- end
28
-
29
- return false unless valid?
30
-
31
- @promotion.save
32
- end
33
-
34
- def number_of_codes=(value)
35
- @number_of_codes = value.presence.try(:to_i)
36
- end
37
-
38
- private
39
-
40
- def promotion_validity
41
- if !@promotion.valid?
42
- @promotion.errors.each do |attribute, error|
43
- errors[attribute].push error
44
- end
45
- end
46
- end
47
-
48
- def can_build_codes?
49
- @base_code && @number_of_codes
50
- end
51
-
52
- def code_builder
53
- self.class.code_builder_class.new(@promotion, @base_code, @number_of_codes)
54
- end
55
- end
@@ -1,62 +0,0 @@
1
- # A class responsible for building PromotionCodes
2
- class ::Spree::PromotionCode::CodeBuilder
3
- attr_reader :promotion, :num_codes, :base_code
4
-
5
- class_attribute :random_code_length
6
- self.random_code_length = 6
7
-
8
- # Requres a +promotion+, +base_code+ and +num_codes+
9
- #
10
- # +promotion+ Must be a Spree::Promotion.
11
- # +base_code+ Must be a String.
12
- # +num_codes+ Must be a positive integer greater than zero.
13
- def initialize(promotion, base_code, num_codes)
14
- @base_code = base_code
15
- @num_codes = num_codes
16
- @promotion = promotion
17
- end
18
-
19
- # Builds and returns an array of Spree::PromotionCode's
20
- def build_promotion_codes
21
- codes.map do |code|
22
- promotion.codes.build(value: code)
23
- end
24
- end
25
-
26
- private
27
-
28
- def codes
29
- if num_codes > 1
30
- generate_random_codes
31
- else
32
- [base_code]
33
- end
34
- end
35
-
36
- def generate_random_codes
37
- valid_codes = Set.new
38
-
39
- while valid_codes.size < num_codes
40
- new_codes = Array.new(num_codes) { generate_random_code }.to_set
41
- valid_codes += get_unique_codes(new_codes)
42
- end
43
-
44
- valid_codes.to_a.take(num_codes)
45
- end
46
-
47
- def generate_random_code
48
- suffix = Array.new(self.class.random_code_length) do
49
- sample_characters.sample
50
- end.join
51
-
52
- "#{@base_code}_#{suffix}"
53
- end
54
-
55
- def sample_characters
56
- @sample_characters ||= ('a'..'z').to_a
57
- end
58
-
59
- def get_unique_codes(code_set)
60
- code_set - Spree::PromotionCode.where(value: code_set.to_a).pluck(:value)
61
- end
62
- end