spree_core 2.2.0 → 2.2.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/LICENSE +26 -0
  3. data/app/helpers/spree/taxons_helper.rb +2 -2
  4. data/app/models/concerns/spree/user_api_authentication.rb +13 -0
  5. data/app/models/concerns/spree/user_reporting.rb +27 -0
  6. data/app/models/spree/adjustment.rb +3 -2
  7. data/app/models/spree/app_configuration.rb +1 -0
  8. data/app/models/spree/calculator/default_tax.rb +5 -1
  9. data/app/models/spree/calculator.rb +2 -2
  10. data/app/models/spree/credit_card.rb +11 -5
  11. data/app/models/spree/gateway.rb +25 -0
  12. data/app/models/spree/item_adjustments.rb +2 -0
  13. data/app/models/spree/legacy_user.rb +2 -3
  14. data/app/models/spree/line_item.rb +7 -0
  15. data/app/models/spree/order/checkout.rb +19 -7
  16. data/app/models/spree/order/currency_updater.rb +40 -0
  17. data/app/models/spree/order.rb +19 -3
  18. data/app/models/spree/order_updater.rb +1 -1
  19. data/app/models/spree/payment.rb +5 -2
  20. data/app/models/spree/payment_method.rb +1 -0
  21. data/app/models/spree/product/scopes.rb +13 -17
  22. data/app/models/spree/product.rb +10 -2
  23. data/app/models/spree/promotion/actions/free_shipping.rb +4 -2
  24. data/app/models/spree/promotion/rules/product.rb +0 -9
  25. data/app/models/spree/promotion.rb +1 -1
  26. data/app/models/spree/shipment.rb +19 -14
  27. data/app/models/spree/shipping_method.rb +2 -2
  28. data/app/models/spree/shipping_rate.rb +15 -9
  29. data/app/models/spree/stock/estimator.rb +4 -1
  30. data/app/models/spree/stock_location.rb +1 -0
  31. data/app/models/spree/tax_rate.rb +81 -7
  32. data/config/initializers/user_class_extensions.rb +3 -0
  33. data/config/locales/en.yml +26 -0
  34. data/db/default/spree/countries.rb +2 -1
  35. data/db/migrate/20130213191427_create_default_stock.rb +3 -3
  36. data/db/migrate/20130417120035_update_adjustment_states.rb +2 -2
  37. data/db/migrate/20130417123427_add_shipping_rates_to_shipments.rb +1 -1
  38. data/db/migrate/20130509115210_add_number_to_stock_transfer.rb +1 -1
  39. data/db/migrate/20130802022321_migrate_tax_categories_to_line_items.rb +5 -7
  40. data/db/migrate/20140307235515_add_user_id_to_spree_credit_cards.rb +13 -0
  41. data/lib/generators/spree/dummy/templates/rails/database.yml +6 -6
  42. data/lib/spree/core/controller_helpers/auth.rb +10 -1
  43. data/lib/spree/core/controller_helpers/order.rb +1 -1
  44. data/lib/spree/core/controller_helpers/respond_with.rb +6 -1
  45. data/lib/spree/core/importer/order.rb +168 -0
  46. data/lib/spree/core/importer.rb +8 -0
  47. data/lib/spree/core/product_duplicator.rb +1 -1
  48. data/lib/spree/core/user_address.rb +2 -0
  49. data/lib/spree/core/user_payment_source.rb +20 -0
  50. data/lib/spree/core/version.rb +1 -1
  51. data/lib/spree/core.rb +4 -0
  52. data/lib/spree/migrations.rb +1 -1
  53. data/lib/spree/permitted_attributes.rb +1 -1
  54. data/lib/spree/testing_support/capybara_ext.rb +23 -1
  55. data/lib/spree/testing_support/factories/credit_card_factory.rb +1 -6
  56. data/lib/spree/testing_support/factories/order_factory.rb +8 -8
  57. data/lib/spree/testing_support/factories/shipping_method_factory.rb +3 -1
  58. data/lib/spree/testing_support/factories/user_factory.rb +5 -0
  59. metadata +11 -3
@@ -0,0 +1,168 @@
1
+ module Spree
2
+ module Core
3
+ module Importer
4
+ class Order
5
+
6
+ def self.import(user, params)
7
+ begin
8
+ ensure_country_id_from_params params[:ship_address_attributes]
9
+ ensure_state_id_from_params params[:ship_address_attributes]
10
+ ensure_country_id_from_params params[:bill_address_attributes]
11
+ ensure_state_id_from_params params[:bill_address_attributes]
12
+
13
+ order = Spree::Order.create!
14
+ order.associate_user!(user)
15
+
16
+ create_shipments_from_params(params.delete(:shipments_attributes), order)
17
+ create_line_items_from_params(params.delete(:line_items_attributes),order)
18
+ create_adjustments_from_params(params.delete(:adjustments_attributes), order)
19
+ create_payments_from_params(params.delete(:payments_attributes), order)
20
+
21
+ if(completed_at = params.delete(:completed_at))
22
+ order.completed_at = completed_at
23
+ order.state = 'complete'
24
+ end
25
+
26
+ order.update_attributes!(params)
27
+ order.reload
28
+ rescue Exception => e
29
+ order.destroy if order && order.persisted?
30
+ raise e.message
31
+ end
32
+ end
33
+
34
+ def self.create_shipments_from_params(shipments_hash, order)
35
+ return [] unless shipments_hash
36
+ shipments_hash.each do |s|
37
+ begin
38
+ shipment = order.shipments.build
39
+ shipment.tracking = s[:tracking]
40
+ shipment.stock_location = Spree::StockLocation.find_by_name!(s[:stock_location])
41
+
42
+ inventory_units = s[:inventory_units] || []
43
+ inventory_units.each do |iu|
44
+ ensure_variant_id_from_params(iu)
45
+
46
+ unit = shipment.inventory_units.build
47
+ unit.order = order
48
+ unit.variant_id = iu[:variant_id]
49
+ end
50
+
51
+ shipment.save!
52
+
53
+ shipping_method = Spree::ShippingMethod.find_by_name!(s[:shipping_method])
54
+ shipment.shipping_rates.create!(:shipping_method => shipping_method,
55
+ :cost => s[:cost])
56
+ rescue Exception => e
57
+ raise "Order import shipments: #{e.message} #{s}"
58
+ end
59
+ end
60
+ end
61
+
62
+ def self.create_line_items_from_params(line_items_hash, order)
63
+ return {} unless line_items_hash
64
+ line_items_hash.each_key do |k|
65
+ begin
66
+ line_item = line_items_hash[k]
67
+ ensure_variant_id_from_params(line_item)
68
+
69
+ extra_params = line_item.except(:variant_id, :quantity)
70
+ line_item = order.contents.add(Spree::Variant.find(line_item[:variant_id]), line_item[:quantity])
71
+ line_item.update_attributes(extra_params) unless extra_params.empty?
72
+ rescue Exception => e
73
+ raise "Order import line items: #{e.message} #{line_item}"
74
+ end
75
+ end
76
+ end
77
+
78
+ def self.create_adjustments_from_params(adjustments, order)
79
+ return [] unless adjustments
80
+ adjustments.each do |a|
81
+ begin
82
+ adjustment = order.adjustments.build(:amount => a[:amount].to_f,
83
+ :label => a[:label])
84
+ adjustment.save!
85
+ adjustment.close!
86
+ rescue Exception => e
87
+ raise "Order import adjustments: #{e.message} #{a}"
88
+ end
89
+ end
90
+ end
91
+
92
+ def self.create_payments_from_params(payments_hash, order)
93
+ return [] unless payments_hash
94
+ payments_hash.each do |p|
95
+ begin
96
+ payment = order.payments.build
97
+ payment.amount = p[:amount].to_f
98
+ payment.state = p.fetch(:state, 'completed')
99
+ payment.payment_method = Spree::PaymentMethod.find_by_name!(p[:payment_method])
100
+ payment.save!
101
+ rescue Exception => e
102
+ raise "Order import payments: #{e.message} #{p}"
103
+ end
104
+ end
105
+ end
106
+
107
+ def self.ensure_variant_id_from_params(hash)
108
+ begin
109
+ unless hash[:variant_id].present?
110
+ hash[:variant_id] = Spree::Variant.active.find_by_sku!(hash[:sku]).id
111
+ hash.delete(:sku)
112
+ end
113
+ rescue Exception => e
114
+ raise "Ensure order import variant: #{e.message} #{hash}"
115
+ end
116
+ end
117
+
118
+ def self.ensure_country_id_from_params(address)
119
+ return if address.nil? or address[:country_id].present? or address[:country].nil?
120
+
121
+ begin
122
+ search = {}
123
+ if name = address[:country]['name']
124
+ search[:name] = name
125
+ elsif iso_name = address[:country]['iso_name']
126
+ search[:iso_name] = iso_name.upcase
127
+ elsif iso = address[:country]['iso']
128
+ search[:iso] = iso.upcase
129
+ elsif iso3 = address[:country]['iso3']
130
+ search[:iso3] = iso3.upcase
131
+ end
132
+
133
+ address.delete(:country)
134
+ address[:country_id] = Spree::Country.where(search).first!.id
135
+
136
+ rescue Exception => e
137
+ raise "Ensure order import address country: #{e.message} #{search}"
138
+ end
139
+ end
140
+
141
+ def self.ensure_state_id_from_params(address)
142
+ return if address.nil? or address[:state_id].present? or address[:state].nil?
143
+
144
+ begin
145
+ search = {}
146
+ if name = address[:state]['name']
147
+ search[:name] = name
148
+ elsif abbr = address[:state]['abbr']
149
+ search[:abbr] = abbr.upcase
150
+ end
151
+
152
+ address.delete(:state)
153
+ search[:country_id] = address[:country_id]
154
+
155
+ if state = Spree::State.where(search).first
156
+ address[:state_id] = state.id
157
+ else
158
+ address[:state_name] = search[:name] || search[:abbr]
159
+ end
160
+ rescue Exception => e
161
+ raise "Ensure order import address state: #{e.message} #{search}"
162
+ end
163
+ end
164
+
165
+ end
166
+ end
167
+ end
168
+ end
@@ -0,0 +1,8 @@
1
+ module Spree
2
+ module Core
3
+ module Importer
4
+ end
5
+ end
6
+ end
7
+
8
+ require 'spree/core/importer/order'
@@ -48,7 +48,7 @@ module Spree
48
48
  new_variant = variant.dup
49
49
  new_variant.sku = "COPY OF #{new_variant.sku}"
50
50
  new_variant.deleted_at = nil
51
- new_variant.option_values = variant.option_values.map { |option_value| option_value.dup}
51
+ new_variant.option_values = variant.option_values.map { |option_value| option_value}
52
52
  new_variant
53
53
  end
54
54
 
@@ -10,6 +10,8 @@ module Spree
10
10
  belongs_to :ship_address, foreign_key: :ship_address_id, class_name: 'Spree::Address'
11
11
  alias_attribute :shipping_address, :ship_address
12
12
 
13
+ accepts_nested_attributes_for :ship_address, :bill_address
14
+
13
15
  def persist_order_address(order)
14
16
  b_address = self.bill_address || self.build_bill_address
15
17
  b_address.attributes = order.bill_address.attributes.except('id', 'updated_at', 'created_at')
@@ -0,0 +1,20 @@
1
+ module Spree
2
+ module Core
3
+ module UserPaymentSource
4
+ extend ActiveSupport::Concern
5
+
6
+ included do
7
+ has_many :credit_cards, class_name: "Spree::CreditCard", foreign_key: :user_id
8
+
9
+ def payment_sources
10
+ credit_cards.with_payment_profile
11
+ end
12
+
13
+ def drop_payment_source(source)
14
+ gateway = source.payment_method
15
+ gateway.disable_customer_profile(source)
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
@@ -1,5 +1,5 @@
1
1
  module Spree
2
2
  def self.version
3
- "2.2.0"
3
+ "2.2.1"
4
4
  end
5
5
  end
data/lib/spree/core.rb CHANGED
@@ -41,6 +41,7 @@ module Spree
41
41
  autoload :ProductFilters, "spree/core/product_filters"
42
42
 
43
43
  class GatewayError < RuntimeError; end
44
+ class DestroyWithOrdersError < StandardError; end
44
45
  end
45
46
  end
46
47
 
@@ -61,6 +62,7 @@ require 'spree/money'
61
62
 
62
63
  require 'spree/permitted_attributes'
63
64
  require 'spree/core/user_address'
65
+ require 'spree/core/user_payment_source'
64
66
  require 'spree/core/delegate_belongs_to'
65
67
  require 'spree/core/permalinks'
66
68
  require 'spree/core/token_resource'
@@ -70,3 +72,5 @@ require 'spree/core/controller_helpers'
70
72
  require 'spree/core/controller_helpers/strong_parameters'
71
73
  require 'spree/core/controller_helpers/ssl'
72
74
  require 'spree/core/controller_helpers/search'
75
+
76
+ require 'spree/core/importer'
@@ -30,7 +30,7 @@ module Spree
30
30
 
31
31
  unless (engine_migrations.sort - engine_in_app.sort).empty?
32
32
  puts "[#{engine_name.capitalize} WARNING] Missing migrations." \
33
- "Run `bundle exec rake railties:install:migrations` to get them.\n\n"
33
+ " Run `bundle exec rake railties:install:migrations` to get them.\n\n"
34
34
  true
35
35
  end
36
36
  end
@@ -69,7 +69,7 @@ module Spree
69
69
  @@source_attributes = [
70
70
  :number, :month, :year, :expiry, :verification_value,
71
71
  :first_name, :last_name, :cc_type, :gateway_customer_profile_id,
72
- :gateway_payment_profile_id, :last_digits, :name]
72
+ :gateway_payment_profile_id, :last_digits, :name, :encrypted_data]
73
73
 
74
74
  @@stock_item_attributes = [:variant, :stock_location, :backorderable, :variant_id]
75
75
 
@@ -103,12 +103,34 @@ module CapybaraExt
103
103
 
104
104
  def wait_for_ajax
105
105
  counter = 0
106
- while page.evaluate_script("$.active").to_i > 0
106
+ while page.evaluate_script("typeof($) === 'undefined' || $.active > 0")
107
107
  counter += 1
108
108
  sleep(0.1)
109
109
  raise "AJAX request took longer than 5 seconds." if counter >= 50
110
110
  end
111
111
  end
112
+
113
+ def accept_alert
114
+ if page.driver === Capybara::Selenium::Driver
115
+ yield
116
+ page.driver.browser.switch_to.alert.accept
117
+ else
118
+ page.evaluate_script('window.confirm = function() { return true; }')
119
+ yield
120
+ end
121
+ end
122
+ def dismiss_alert
123
+ if page.driver === Capybara::Selenium::Driver
124
+ yield
125
+ page.driver.browser.switch_to.alert.dismiss
126
+ else
127
+ page.evaluate_script('window.confirm = function() { return false; }')
128
+ yield
129
+
130
+ # Restore existing default
131
+ page.evaluate_script('window.confirm = function() { return true; }')
132
+ end
133
+ end
112
134
  end
113
135
 
114
136
  Capybara.configure do |config|
@@ -1,10 +1,5 @@
1
- # allows credit card info to be saved to the database which is needed for factories to work properly
2
- class TestCard < Spree::CreditCard
3
- def remove_readonly_attributes(attributes) attributes; end
4
- end
5
-
6
1
  FactoryGirl.define do
7
- factory :credit_card, class: TestCard do
2
+ factory :credit_card, class: Spree::CreditCard do
8
3
  verification_value 123
9
4
  month 12
10
5
  year { Time.now.year }
@@ -55,17 +55,17 @@ FactoryGirl.define do
55
55
  end
56
56
  order.reload
57
57
  end
58
- end
59
-
60
- factory :shipped_order do
61
- after(:create) do |order|
62
- order.shipments.each do |shipment|
63
- shipment.inventory_units.each { |u| u.update_column('state', 'shipped') }
64
- shipment.update_column('state', 'shipped')
58
+ factory :shipped_order do
59
+ after(:create) do |order|
60
+ order.shipments.each do |shipment|
61
+ shipment.inventory_units.each { |u| u.update_column('state', 'shipped') }
62
+ shipment.update_column('state', 'shipped')
63
+ end
64
+ order.reload
65
65
  end
66
- order.reload
67
66
  end
68
67
  end
68
+
69
69
  end
70
70
  end
71
71
  end
@@ -4,7 +4,9 @@ FactoryGirl.define do
4
4
  name 'UPS Ground'
5
5
 
6
6
  before(:create) do |shipping_method, evaluator|
7
- shipping_method.shipping_categories << (Spree::ShippingCategory.first || create(:shipping_category))
7
+ if shipping_method.shipping_categories.empty?
8
+ shipping_method.shipping_categories << (Spree::ShippingCategory.first || create(:shipping_category))
9
+ end
8
10
  end
9
11
 
10
12
  factory :shipping_method, class: Spree::ShippingMethod do
@@ -13,5 +13,10 @@ FactoryGirl.define do
13
13
  factory :admin_user do
14
14
  spree_roles { [Spree::Role.find_by(name: 'admin') || create(:role, name: 'admin')] }
15
15
  end
16
+
17
+ factory :user_with_addreses do
18
+ ship_address
19
+ bill_address
20
+ end
16
21
  end
17
22
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_core
3
3
  version: !ruby/object:Gem::Version
4
- version: 2.2.0
4
+ version: 2.2.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Schofield
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-02-26 00:00:00.000000000 Z
11
+ date: 2014-03-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemerchant
@@ -282,6 +282,7 @@ executables: []
282
282
  extensions: []
283
283
  extra_rdoc_files: []
284
284
  files:
285
+ - LICENSE
285
286
  - app/assets/images/logo/spree_50.png
286
287
  - app/assets/images/noimage/large.png
287
288
  - app/assets/images/noimage/mini.png
@@ -299,6 +300,8 @@ files:
299
300
  - app/mailers/spree/order_mailer.rb
300
301
  - app/mailers/spree/shipment_mailer.rb
301
302
  - app/mailers/spree/test_mailer.rb
303
+ - app/models/concerns/spree/user_api_authentication.rb
304
+ - app/models/concerns/spree/user_reporting.rb
302
305
  - app/models/spree/ability.rb
303
306
  - app/models/spree/address.rb
304
307
  - app/models/spree/adjustment.rb
@@ -337,6 +340,7 @@ files:
337
340
  - app/models/spree/option_value.rb
338
341
  - app/models/spree/order.rb
339
342
  - app/models/spree/order/checkout.rb
343
+ - app/models/spree/order/currency_updater.rb
340
344
  - app/models/spree/order_contents.rb
341
345
  - app/models/spree/order_inventory.rb
342
346
  - app/models/spree/order_populator.rb
@@ -556,6 +560,7 @@ files:
556
560
  - db/migrate/20140211040159_add_pre_tax_amount_to_line_items_and_shipments.rb
557
561
  - db/migrate/20140213184916_add_more_indexes.rb
558
562
  - db/migrate/20140219060952_add_considered_risky_to_orders.rb
563
+ - db/migrate/20140307235515_add_user_id_to_spree_credit_cards.rb
559
564
  - db/seeds.rb
560
565
  - lib/generators/spree/custom_user/custom_user_generator.rb
561
566
  - lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt
@@ -590,6 +595,8 @@ files:
590
595
  - lib/spree/core/environment.rb
591
596
  - lib/spree/core/environment/calculators.rb
592
597
  - lib/spree/core/environment_extension.rb
598
+ - lib/spree/core/importer.rb
599
+ - lib/spree/core/importer/order.rb
593
600
  - lib/spree/core/mail_interceptor.rb
594
601
  - lib/spree/core/mail_method.rb
595
602
  - lib/spree/core/mail_settings.rb
@@ -600,6 +607,7 @@ files:
600
607
  - lib/spree/core/search/base.rb
601
608
  - lib/spree/core/token_resource.rb
602
609
  - lib/spree/core/user_address.rb
610
+ - lib/spree/core/user_payment_source.rb
603
611
  - lib/spree/core/validators/email.rb
604
612
  - lib/spree/core/version.rb
605
613
  - lib/spree/i18n.rb
@@ -707,7 +715,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
707
715
  version: '0'
708
716
  requirements: []
709
717
  rubyforge_project:
710
- rubygems_version: 2.2.0
718
+ rubygems_version: 2.2.2
711
719
  signing_key:
712
720
  specification_version: 4
713
721
  summary: The bare bones necessary for Spree.