spree_core 2.1.2 → 2.1.3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (34) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/images/logo/spree_50.png +0 -0
  3. data/app/helpers/spree/base_helper.rb +1 -1
  4. data/app/models/spree/adjustment.rb +6 -2
  5. data/app/models/spree/app_configuration.rb +1 -0
  6. data/app/models/spree/credit_card.rb +26 -14
  7. data/app/models/spree/gateway/bogus_simple.rb +8 -0
  8. data/app/models/spree/option_type.rb +1 -0
  9. data/app/models/spree/order/checkout.rb +9 -3
  10. data/app/models/spree/order.rb +1 -11
  11. data/app/models/spree/order_inventory.rb +7 -3
  12. data/app/models/spree/order_updater.rb +5 -11
  13. data/app/models/spree/payment/processing.rb +4 -3
  14. data/app/models/spree/product.rb +6 -1
  15. data/app/models/spree/promotion/rules/user.rb +1 -1
  16. data/app/models/spree/shipment.rb +7 -10
  17. data/app/models/spree/tax_rate.rb +29 -3
  18. data/app/models/spree/taxon.rb +10 -1
  19. data/app/views/spree/payments/_payment.html.erb +3 -1
  20. data/config/initializers/user_class_extensions.rb +0 -1
  21. data/config/locales/en.yml +10 -0
  22. data/db/migrate/20131113035136_add_channel_to_spree_orders.rb +5 -0
  23. data/db/migrate/20131118041203_add_tax_total_to_spree_orders.rb +5 -0
  24. data/db/migrate/20131118043021_add_order_id_to_spree_adjustments.rb +6 -0
  25. data/db/migrate/20131118074808_add_included_to_spree_adjustments.rb +5 -0
  26. data/lib/spree/core/version.rb +1 -1
  27. data/lib/spree/core.rb +3 -4
  28. data/lib/spree/money.rb +1 -0
  29. data/lib/spree/permitted_attributes.rb +7 -3
  30. data/lib/spree/testing_support/capybara_ext.rb +11 -3
  31. data/lib/spree/testing_support/controller_requests.rb +2 -2
  32. metadata +26 -24
  33. data/lib/spree/core/ext/active_record.rb +0 -8
  34. data/lib/spree/core/user_banners.rb +0 -25
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3ab1a9b77dfdfc7b40bb62c108eadc067ea71124
4
- data.tar.gz: c2183c55225bf1d1d23c06e61807ee0c08690c39
3
+ metadata.gz: b8194bdbcc2f3d26d2662205e0deed23ed0bf800
4
+ data.tar.gz: 232ddcdb7e3b3b8cb25b1029f77015331b2b7043
5
5
  SHA512:
6
- metadata.gz: 723eadefb8438e4953836ff989f6c95e12b2c5b4a677e38b2402994c58e346886f45c7c7389b888a9ad1fafc0bdf60d1d7788982df9296fbf9a155e929053f59
7
- data.tar.gz: 664c6401e80f75ecac438efc557ac374578b933f5c453a439e075a8a9046b0c65abf9dcecfcfa1a8d0167a6d818f2f711273af5b5d108fd01991df6ac7f42994
6
+ metadata.gz: da652bb0512643d231a1826e0af01ea36fffc76b2b9f91bffe1ada65133b6ec8d2a6c365f38d88235209db209565816dc44fbfc5868f79dd1b7a111a5c9cc2de
7
+ data.tar.gz: 9db7c280e5907596695bdb35b9098611ff778b27cbb5fc8f10ca789b3cf86bc7e0aeeda0e6a62b01dc01da7d0fc88ba23ca74a193c301bec105f5f4bfe7805cd
Binary file
@@ -117,7 +117,7 @@ module Spree
117
117
  countries.collect do |country|
118
118
  country.name = Spree.t(country.iso, scope: 'country_names', default: country.name)
119
119
  country
120
- end.sort { |a, b| a.name <=> b.name }
120
+ end.sort { |a, b| a.name.parameterize <=> b.name.parameterize }
121
121
  end
122
122
 
123
123
  def seo_url(taxon)
@@ -27,6 +27,7 @@ module Spree
27
27
  belongs_to :adjustable, polymorphic: true
28
28
  belongs_to :source, polymorphic: true
29
29
  belongs_to :originator, polymorphic: true
30
+ belongs_to :order, :class_name => 'Spree::Order'
30
31
 
31
32
  validates :label, presence: true
32
33
  validates :amount, numericality: true
@@ -48,7 +49,7 @@ module Spree
48
49
  end
49
50
  end
50
51
 
51
- scope :tax, -> { where(originator_type: 'Spree::TaxRate', adjustable_type: 'Spree::Order') }
52
+ scope :tax, -> { where(originator_type: 'Spree::TaxRate') }
52
53
  scope :price, -> { where(adjustable_type: 'Spree::LineItem') }
53
54
  scope :shipping, -> { where(originator_type: 'Spree::ShippingMethod') }
54
55
  scope :optional, -> { where(mandatory: false) }
@@ -58,6 +59,8 @@ module Spree
58
59
  scope :promotion, -> { where(originator_type: 'Spree::PromotionAction') }
59
60
  scope :manual, -> { where(originator_type: nil) }
60
61
  scope :return_authorization, -> { where(source_type: "Spree::ReturnAuthorization") }
62
+ scope :included, -> { where(included: true) }
63
+ scope :additional, -> { where(included: false) }
61
64
 
62
65
  def promotion?
63
66
  originator_type == 'Spree::PromotionAction'
@@ -97,7 +100,8 @@ module Spree
97
100
  # If we attempt to call 'source' before the reload, then source is currently
98
101
  # the order object. After calling a reload, the source is the Shipment.
99
102
  reload
100
- originator.update_adjustment(self, calculable || source) if originator.present?
103
+ calculable = source unless calculable == source
104
+ originator.update_adjustment(self, calculable) if originator.present?
101
105
  set_eligibility
102
106
  end
103
107
 
@@ -41,6 +41,7 @@ module Spree
41
41
  preference :currency, :string, default: "USD"
42
42
  preference :currency_decimal_mark, :string, default: "."
43
43
  preference :currency_symbol_position, :string, default: "before"
44
+ preference :currency_sign_before_symbol, :boolean, default: true
44
45
  preference :currency_thousands_separator, :string, default: ","
45
46
  preference :display_currency, :boolean, default: false
46
47
  preference :default_country_id, :integer
@@ -6,7 +6,7 @@ module Spree
6
6
 
7
7
  attr_accessor :number, :verification_value
8
8
 
9
- validates :month, :year, numericality: { only_integer: true }
9
+ validates :month, :year, numericality: { only_integer: true }, unless: :has_payment_profile?
10
10
  validates :number, presence: true, unless: :has_payment_profile?, on: :create
11
11
  validates :verification_value, presence: true, unless: :has_payment_profile?, on: :create
12
12
  validate :expiry_not_in_the_past
@@ -16,9 +16,20 @@ module Spree
16
16
  # needed for some of the ActiveMerchant gateways (eg. SagePay)
17
17
  alias_attribute :brand, :cc_type
18
18
 
19
+ CARD_TYPES = {
20
+ visa: /^4[0-9]{12}(?:[0-9]{3})?$/,
21
+ master: /(^5[1-5][0-9]{14}$)|(^6759[0-9]{2}([0-9]{10})$)|(^6759[0-9]{2}([0-9]{12})$)|(^6759[0-9]{2}([0-9]{13})$)/,
22
+ diners_club: /^3(?:0[0-5]|[68][0-9])[0-9]{11}$/,
23
+ american_express: /^3[47][0-9]{13}$/,
24
+ discover: /^6(?:011|5[0-9]{2})[0-9]{12}$/,
25
+ jcb: /^(?:2131|1800|35\d{3})\d{11}$/
26
+ }
27
+
19
28
  def expiry=(expiry)
20
- self[:month], self[:year] = expiry.split(" / ")
21
- self[:year] = "20" + self[:year]
29
+ if expiry.present?
30
+ self[:month], self[:year] = expiry.delete(' ').split('/')
31
+ self[:year] = "20" + self[:year] if self[:year].length == 2
32
+ end
22
33
  end
23
34
 
24
35
  def number=(num)
@@ -28,17 +39,13 @@ module Spree
28
39
  # cc_type is set by jquery.payment, which helpfully provides different
29
40
  # types from Active Merchant. Converting them is necessary.
30
41
  def cc_type=(type)
31
- real_type = case type
32
- when 'mastercard', 'maestro'
33
- 'master'
34
- when 'amex'
35
- 'american_express'
36
- when 'dinersclub'
37
- 'diners_club'
38
- else
39
- type
42
+ self[:cc_type] = case type
43
+ when 'mastercard', 'maestro' then 'master'
44
+ when 'amex' then 'american_express'
45
+ when 'dinersclub' then 'diners_club'
46
+ when '' then try_type_from_number
47
+ else type
40
48
  end
41
- self[:cc_type] = real_type
42
49
  end
43
50
 
44
51
  def set_last_digits
@@ -47,6 +54,11 @@ module Spree
47
54
  self.last_digits ||= number.to_s.length <= 4 ? number : number.to_s.slice(-4..-1)
48
55
  end
49
56
 
57
+ def try_type_from_number
58
+ numbers = number.delete(' ') if number
59
+ CARD_TYPES.find{|type, pattern| return type.to_s if numbers =~ pattern}.to_s
60
+ end
61
+
50
62
  def name?
51
63
  first_name? && last_name?
52
64
  end
@@ -87,7 +99,7 @@ module Spree
87
99
  end
88
100
 
89
101
  def has_payment_profile?
90
- gateway_customer_profile_id.present?
102
+ gateway_customer_profile_id.present? || gateway_payment_profile_id.present?
91
103
  end
92
104
 
93
105
  def to_active_merchant
@@ -6,6 +6,14 @@ module Spree
6
6
  false
7
7
  end
8
8
 
9
+ def capture(money, response_code, options = {})
10
+ if response_code == '12345'
11
+ ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, :test => true, :authorization => '67890')
12
+ else
13
+ ActiveMerchant::Billing::Response.new(false, 'Bogus Gateway: Forced failure', :error => 'Bogus Gateway: Forced failure', :test => true)
14
+ end
15
+ end
16
+
9
17
  def authorize(money, credit_card, options = {})
10
18
  if VALID_CCS.include? credit_card.number
11
19
  ActiveMerchant::Billing::Response.new(true, 'Bogus Gateway: Forced success', {}, :test => true, :authorization => '12345', :avs_result => { :code => 'A' })
@@ -2,6 +2,7 @@ module Spree
2
2
  class OptionType < ActiveRecord::Base
3
3
  has_many :option_values, -> { order(:position) }, dependent: :destroy
4
4
  has_many :product_option_types, dependent: :destroy
5
+ has_many :products, through: :product_option_types
5
6
  has_and_belongs_to_many :prototypes, join_table: 'spree_option_types_prototypes'
6
7
 
7
8
  validates :name, :presentation, presence: true
@@ -42,8 +42,14 @@ module Spree
42
42
  klass.next_event_transitions.each { |t| transition(t.merge(:on => :next)) }
43
43
 
44
44
  # Persist the state on the order
45
- after_transition do |order|
45
+ after_transition do |order, transition|
46
46
  order.state = order.state
47
+ order.state_changes.create(
48
+ previous_state: transition.from,
49
+ next_state: transition.to,
50
+ name: 'order',
51
+ user_id: order.user_id
52
+ )
47
53
  order.save
48
54
  end
49
55
 
@@ -160,7 +166,7 @@ module Spree
160
166
  end
161
167
 
162
168
  def has_checkout_step?(step)
163
- step.present? ? self.checkout_steps.include?(step) : false
169
+ step.present? && self.checkout_steps.include?(step)
164
170
  end
165
171
 
166
172
  def checkout_step_index(step)
@@ -172,7 +178,7 @@ module Spree
172
178
  end
173
179
 
174
180
  def can_go_to_state?(state)
175
- return false unless self.state.present? && has_checkout_step?(state) && has_checkout_step?(self.state)
181
+ return false unless has_checkout_step?(self.state) && has_checkout_step?(state)
176
182
  checkout_step_index(state) > checkout_step_index(self.state)
177
183
  end
178
184
  end
@@ -41,6 +41,7 @@ module Spree
41
41
  has_many :return_authorizations, dependent: :destroy
42
42
  has_many :adjustments, -> { order("#{Adjustment.table_name}.created_at ASC") }, as: :adjustable, dependent: :destroy
43
43
  has_many :line_item_adjustments, through: :line_items, source: :adjustments
44
+ has_many :all_adjustments, class_name: 'Spree::Adjustment'
44
45
  has_many :inventory_units
45
46
 
46
47
  has_many :shipments, dependent: :destroy do
@@ -283,10 +284,6 @@ module Spree
283
284
  adjustments.shipping.sum(:amount)
284
285
  end
285
286
 
286
- def tax_total
287
- adjustments.tax.sum(:amount)
288
- end
289
-
290
287
  # Creates new tax charges if there are any applicable rates. If prices already
291
288
  # include taxes then price adjustments are created instead.
292
289
  def create_tax_charge!
@@ -336,13 +333,6 @@ module Spree
336
333
  updater.run_hooks
337
334
 
338
335
  deliver_order_confirmation_email
339
-
340
- self.state_changes.create(
341
- previous_state: 'cart',
342
- next_state: 'complete',
343
- name: 'order' ,
344
- user_id: self.user_id
345
- )
346
336
  end
347
337
 
348
338
  def deliver_order_confirmation_email
@@ -65,10 +65,14 @@ module Spree
65
65
  end
66
66
 
67
67
  def add_to_shipment(shipment, variant, quantity)
68
- on_hand, back_order = shipment.stock_location.fill_status(variant, quantity)
68
+ if Config.track_inventory_levels
69
+ on_hand, back_order = shipment.stock_location.fill_status(variant, quantity)
69
70
 
70
- on_hand.times { shipment.set_up_inventory('on_hand', variant, order) }
71
- back_order.times { shipment.set_up_inventory('backordered', variant, order) }
71
+ on_hand.times { shipment.set_up_inventory('on_hand', variant, order) }
72
+ back_order.times { shipment.set_up_inventory('backordered', variant, order) }
73
+ else
74
+ quantity.times { shipment.set_up_inventory('on_hand', variant, order) }
75
+ end
72
76
 
73
77
  # adding to this shipment, and removing from stock_location
74
78
  if order.completed?
@@ -25,12 +25,11 @@ module Spree
25
25
  update_shipment_state
26
26
  end
27
27
 
28
- update_promotion_adjustments
29
- update_shipping_adjustments
28
+ update_adjustments
30
29
  # update totals a second time in case updated adjustments have an effect on the total
31
30
  update_totals
32
31
 
33
- order.update_attributes_without_callbacks({
32
+ order.update_columns({
34
33
  payment_state: order.payment_state,
35
34
  shipment_state: order.shipment_state,
36
35
  item_total: order.item_total,
@@ -56,6 +55,7 @@ module Spree
56
55
  order.payment_total = payments.completed.map(&:amount).sum
57
56
  order.item_total = line_items.map(&:amount).sum
58
57
  order.adjustment_total = adjustments.eligible.map(&:amount).sum
58
+ order.tax_total = order.all_adjustments.tax.map(&:amount).sum
59
59
  order.total = order.item_total + order.adjustment_total
60
60
  end
61
61
 
@@ -125,17 +125,11 @@ module Spree
125
125
  #
126
126
  # Adjustments will check if they are still eligible. Ineligible adjustments
127
127
  # are preserved but not counted towards adjustment_total.
128
- def update_promotion_adjustments
129
- order.adjustments.reload.promotion.each { |adjustment| adjustment.update!(order) }
128
+ def update_adjustments
129
+ order.adjustments.reload.each { |adjustment| adjustment.update!(order) }
130
130
  choose_best_promotion_adjustment
131
131
  end
132
132
 
133
- # Shipping adjustments don't receive order on update! because they calculated
134
- # over a shipping / package object rather than an order object
135
- def update_shipping_adjustments
136
- order.adjustments.reload.shipping.each { |adjustment| adjustment.update! }
137
- end
138
-
139
133
  private
140
134
 
141
135
  # Picks one (and only one) promotion to be eligible for this order
@@ -83,11 +83,12 @@ module Spree
83
83
 
84
84
  credit_amount ||= credit_allowed >= order.outstanding_balance.abs ? order.outstanding_balance.abs : credit_allowed.abs
85
85
  credit_amount = credit_amount.to_f
86
+ credit_cents = Spree::Money.new(credit_amount, currency: currency).money.cents
86
87
 
87
88
  if payment_method.payment_profiles_supported?
88
- response = payment_method.credit((credit_amount * 100).round, source, response_code, gateway_options)
89
+ response = payment_method.credit(credit_cents, source, response_code, gateway_options)
89
90
  else
90
- response = payment_method.credit((credit_amount * 100).round, response_code, gateway_options)
91
+ response = payment_method.credit(credit_cents, response_code, gateway_options)
91
92
  end
92
93
 
93
94
  record_response(response)
@@ -141,7 +142,7 @@ module Spree
141
142
  protect_from_connection_error do
142
143
  check_environment
143
144
 
144
- response = payment_method.send(action, (amount * 100).round,
145
+ response = payment_method.send(action, money.money.cents,
145
146
  source,
146
147
  gateway_options)
147
148
  handle_response(response, success_state, :failure)
@@ -173,7 +173,12 @@ module Spree
173
173
 
174
174
  def set_property(property_name, property_value)
175
175
  ActiveRecord::Base.transaction do
176
- property = Property.where(name: property_name).first_or_create!(presentation: property_name)
176
+ # Works around spree_i18n #301
177
+ property = if Property.exists?(name: property_name)
178
+ Property.where(name: property_name).first
179
+ else
180
+ Property.create(name: property_name, presentation: property_name)
181
+ end
177
182
  product_property = ProductProperty.where(product: self, property: property).first_or_initialize
178
183
  product_property.value = property_value
179
184
  product_property.save!
@@ -7,7 +7,7 @@ module Spree
7
7
  has_and_belongs_to_many :users, class_name: Spree.user_class.to_s, join_table: 'spree_promotion_rules_users', foreign_key: 'promotion_rule_id'
8
8
  else
9
9
  belongs_to :user
10
- has_and_belongs_to_many :users, join_table: 'spree_promotion_rules_users', foreign_key: 'promotion_rule_id'
10
+ has_and_belongs_to_many :users, join_table: 'spree_promotion_rules_users', foreign_key: 'promotion_rule_id', :class_name => Spree.user_class
11
11
  end
12
12
 
13
13
  def eligible?(order, options = {})
@@ -64,9 +64,7 @@ module Spree
64
64
  end
65
65
 
66
66
  def to_param
67
- number if number
68
- generate_shipment_number unless number
69
- number.to_s.to_url.upcase
67
+ number
70
68
  end
71
69
 
72
70
  def backordered?
@@ -102,6 +100,7 @@ module Spree
102
100
 
103
101
  def refresh_rates
104
102
  return shipping_rates if shipped?
103
+ return [] unless can_get_rates?
105
104
 
106
105
  # StockEstimator.new assigment below will replace the current shipping_method
107
106
  original_shipping_method_id = shipping_method.try(:id)
@@ -157,7 +156,7 @@ module Spree
157
156
  end
158
157
 
159
158
  def manifest
160
- inventory_units.joins(:variant).includes(:variant).group_by(&:variant).map do |variant, units|
159
+ inventory_units.group_by(&:variant).map do |variant, units|
161
160
  states = {}
162
161
  units.group_by(&:state).each { |state, iu| states[state] = iu.count }
163
162
  OpenStruct.new(variant: variant, quantity: units.length, states: states)
@@ -256,12 +255,6 @@ module Spree
256
255
  "#{Spree.t(:shipping)} (#{shipping_method.name})"
257
256
  end
258
257
 
259
- def validate_shipping_method
260
- unless shipping_method.nil?
261
- errors.add :shipping_method, Spree.t(:is_not_available_to_shipment_address) unless shipping_method.include?(address)
262
- end
263
- end
264
-
265
258
  def after_ship
266
259
  inventory_units.each &:ship!
267
260
  adjustment.finalize!
@@ -289,5 +282,9 @@ module Spree
289
282
  def update_order
290
283
  order.update!
291
284
  end
285
+
286
+ def can_get_rates?
287
+ order.ship_address && order.ship_address.valid?
288
+ end
292
289
  end
293
290
  end
@@ -26,7 +26,7 @@ module Spree
26
26
  return [] unless order.tax_zone
27
27
  all.select do |rate|
28
28
  (!rate.included_in_price && (rate.zone == order.tax_zone || rate.zone.contains?(order.tax_zone) || (order.tax_address.nil? && rate.zone.default_tax))) ||
29
- (rate.included_in_price && !order.tax_address.nil? && !rate.zone.contains?(order.tax_zone) && rate.zone.default_tax)
29
+ rate.included_in_price
30
30
  end
31
31
  end
32
32
 
@@ -54,15 +54,31 @@ module Spree
54
54
 
55
55
  # Creates necessary tax adjustments for the order.
56
56
  def adjust(order)
57
+ # (rate.included_in_price && !order.tax_address.nil? && !rate.zone.contains?(order.tax_zone) && rate.zone.default_tax)
57
58
  label = create_label
58
59
  if included_in_price
59
60
  if Zone.default_tax.contains? order.tax_zone
60
- order.line_items.each { |line_item| create_adjustment(label, line_item, line_item) }
61
+ order.line_items.each do |line_item|
62
+ amount = calculator.compute(line_item)
63
+ unless amount == 0
64
+ line_item.adjustments.create(
65
+ order: order,
66
+ amount: amount,
67
+ source: line_item,
68
+ originator: self,
69
+ label: label,
70
+ mandatory: false,
71
+ state: "closed",
72
+ included: true
73
+ )
74
+ end
75
+ end
61
76
  else
62
77
  amount = -1 * calculator.compute(order)
63
78
  label = Spree.t(:refund) + label
64
79
 
65
80
  order.adjustments.create(
81
+ order: order,
66
82
  amount: amount,
67
83
  source: order,
68
84
  originator: self,
@@ -71,7 +87,17 @@ module Spree
71
87
  )
72
88
  end
73
89
  else
74
- create_adjustment(label, order, order)
90
+ amount = calculator.compute(order)
91
+ unless amount == 0
92
+ order.adjustments.create(
93
+ order: order,
94
+ amount: amount,
95
+ source: order,
96
+ originator: self,
97
+ state: "closed",
98
+ label: label
99
+ )
100
+ end
75
101
  end
76
102
  end
77
103
 
@@ -16,7 +16,7 @@ module Spree
16
16
  url: '/spree/taxons/:id/:style/:basename.:extension',
17
17
  path: ':rails_root/public/spree/taxons/:id/:style/:basename.:extension',
18
18
  default_url: '/assets/default_taxon.png'
19
-
19
+
20
20
  include Spree::Core::S3Support
21
21
  supports_s3 :icon
22
22
 
@@ -69,5 +69,14 @@ module Spree
69
69
  ancestor_chain + "#{name}"
70
70
  end
71
71
 
72
+ # awesome_nested_set sorts by :lft and :rgt. This call re-inserts the child
73
+ # node so that its resulting position matches the observable 0-indexed position.
74
+ # ** Note ** no :position column needed - a_n_s doesn't handle the reordering if
75
+ # you bring your own :order_column.
76
+ #
77
+ # See #3390 for background.
78
+ def child_index=(idx)
79
+ move_to_child_with_index(parent, idx.to_i)
80
+ end
72
81
  end
73
82
  end
@@ -4,7 +4,9 @@
4
4
  <% unless (cc_type = source.cc_type).blank? %>
5
5
  <%= image_tag "credit_cards/icons/#{cc_type}.png" %>
6
6
  <% end %>
7
- <%= Spree.t(:ending_in) %> <%= source.last_digits %>
7
+ <% if source.last_digits %>
8
+ <%= Spree.t(:ending_in) %> <%= source.last_digits %>
9
+ <% end %>
8
10
  </span>
9
11
  <br />
10
12
  <span class="full-name">
@@ -1,7 +1,6 @@
1
1
  Spree::Core::Engine.config.to_prepare do
2
2
  if Spree.user_class
3
3
  Spree.user_class.class_eval do
4
- include Spree::Core::UserBanners
5
4
  has_and_belongs_to_many :spree_roles,
6
5
  :join_table => 'spree_roles_users',
7
6
  :foreign_key => "user_id",
@@ -646,6 +646,15 @@ en:
646
646
  look_for_similar_items: Look for similar items
647
647
  mail_method_settings: Mail Method Settings
648
648
  mail_methods: Mail Methods
649
+ mail_settings:
650
+ auth:
651
+ none: "None"
652
+ plain: "Plain"
653
+ login: "Login"
654
+ cram_md5: "cram_md5"
655
+ security:
656
+ ssl: "SSL"
657
+ tls: "TLS"
649
658
  make_refund: Make refund
650
659
  master_price: Master Price
651
660
  match_choices:
@@ -666,6 +675,7 @@ en:
666
675
  new: New
667
676
  new_adjustment: New Adjustment
668
677
  new_customer: New Customer
678
+ new_country: New Country
669
679
  new_image: New Image
670
680
  new_option_type: New Option Type
671
681
  new_order: New Order
@@ -0,0 +1,5 @@
1
+ class AddChannelToSpreeOrders < ActiveRecord::Migration
2
+ def change
3
+ add_column :spree_orders, :channel, :string, default: "spree"
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddTaxTotalToSpreeOrders < ActiveRecord::Migration
2
+ def change
3
+ add_column :spree_orders, :tax_total, :decimal, precision: 10, scale: 2, default: 0.0, null: false
4
+ end
5
+ end
@@ -0,0 +1,6 @@
1
+ class AddOrderIdToSpreeAdjustments < ActiveRecord::Migration
2
+ def change
3
+ add_column :spree_adjustments, :order_id, :integer
4
+ add_index :spree_adjustments, :order_id
5
+ end
6
+ end
@@ -0,0 +1,5 @@
1
+ class AddIncludedToSpreeAdjustments < ActiveRecord::Migration
2
+ def change
3
+ add_column :spree_adjustments, :included, :boolean, :default => false
4
+ end
5
+ end
@@ -1,5 +1,5 @@
1
1
  module Spree
2
2
  def self.version
3
- "2.1.2"
3
+ "2.1.3"
4
4
  end
5
5
  end
data/lib/spree/core.rb CHANGED
@@ -16,9 +16,9 @@ module Spree
16
16
 
17
17
  def self.user_class
18
18
  if @@user_class.is_a?(Class)
19
- raise "Spree.user_class MUST be a String object, not a Class object."
20
- elsif @@user_class.is_a?(String)
21
- @@user_class.constantize
19
+ raise "Spree.user_class MUST be a String or Symbol object, not a Class object."
20
+ elsif @@user_class.is_a?(String) || @@user_class.is_a?(Symbol)
21
+ @@user_class.to_s.constantize
22
22
  end
23
23
  end
24
24
 
@@ -45,7 +45,6 @@ require 'spree/money'
45
45
  require 'spree/promo/coupon_applicator'
46
46
 
47
47
  require 'spree/core/delegate_belongs_to'
48
- require 'spree/core/ext/active_record'
49
48
  require 'spree/core/permalinks'
50
49
  require 'spree/core/token_resource'
51
50
  require 'spree/core/calculated_adjustments'
data/lib/spree/money.rb CHANGED
@@ -14,6 +14,7 @@ module Spree
14
14
  @options[:no_cents] = Spree::Config[:hide_cents]
15
15
  @options[:decimal_mark] = Spree::Config[:currency_decimal_mark]
16
16
  @options[:thousands_separator] = Spree::Config[:currency_thousands_separator]
17
+ @options[:sign_before_symbol] = Spree::Config[:currency_sign_before_symbol]
17
18
  @options.merge!(options)
18
19
  # Must be a symbol because the Money gem doesn't do the conversion
19
20
  @options[:symbol_position] = @options[:symbol_position].to_sym
@@ -29,7 +29,10 @@ module Spree
29
29
  @@address_attributes = [
30
30
  :firstname, :lastname, :address1, :address2,
31
31
  :city, :country_id, :state_id, :zipcode, :phone,
32
- :state_name, :alternative_phone, :company]
32
+ :state_name, :alternative_phone, :company,
33
+ :country => [:iso, :name, :iso3, :iso_name],
34
+ :state => [:name, :abbr]
35
+ ]
33
36
 
34
37
  @@checkout_attributes = [:email, :use_billing, :shipping_method_id, :coupon_code, :special_instructions]
35
38
 
@@ -43,7 +46,7 @@ module Spree
43
46
 
44
47
  @@option_value_attributes = [:name, :presentation]
45
48
 
46
- @@payment_attributes = [:amount, :payment_method_id]
49
+ @@payment_attributes = [:amount, :payment_method_id, :payment_method]
47
50
 
48
51
  @@product_properties_attributes = [:property_name, :value, :position]
49
52
 
@@ -65,7 +68,8 @@ module Spree
65
68
  # month / year may be provided by some sources, or others may elect to use one field
66
69
  @@source_attributes = [
67
70
  :number, :month, :year, :expiry, :verification_value,
68
- :first_name, :last_name, :cc_type]
71
+ :first_name, :last_name, :cc_type, :gateway_customer_profile_id,
72
+ :gateway_payment_profile_id, :last_digits]
69
73
 
70
74
  @@stock_item_attributes = [:variant, :stock_location, :backorderable, :variant_id]
71
75
 
@@ -13,11 +13,19 @@ module CapybaraExt
13
13
  end
14
14
 
15
15
  def within_row(num, &block)
16
- within("table.index tbody tr:nth-child(#{num})", &block)
16
+ if example.metadata[:js]
17
+ within("table.index tbody tr:nth-child(#{num})", &block)
18
+ else
19
+ within(:xpath, all("table.index tbody tr")[num-1].path, &block)
20
+ end
17
21
  end
18
22
 
19
23
  def column_text(num)
20
- find("td:nth-child(#{num})").text
24
+ if example.metadata[:js]
25
+ find("td:nth-child(#{num})").text
26
+ else
27
+ all("td")[num-1].text
28
+ end
21
29
  end
22
30
 
23
31
  def set_select2_field(field, value)
@@ -94,7 +102,7 @@ module CapybaraExt
94
102
 
95
103
  def wait_for_ajax
96
104
  counter = 0
97
- while page.execute_script("return $.active").to_i > 0
105
+ while page.evaluate_script("$.active").to_i > 0
98
106
  counter += 1
99
107
  sleep(0.1)
100
108
  raise "AJAX request took longer than 5 seconds." if counter >= 50
@@ -4,9 +4,9 @@
4
4
  # Inside your spec_helper.rb, include this module inside the RSpec.configure
5
5
  # block by doing this:
6
6
  #
7
- # require 'spree/core/testing_support/controller_requests'
7
+ # require 'spree/testing_support/controller_requests'
8
8
  # RSpec.configure do |c|
9
- # c.include Spree::Core::TestingSupport::ControllerRequests, :type => :controller
9
+ # c.include Spree::TestingSupport::ControllerRequests, :type => :controller
10
10
  # end
11
11
  #
12
12
  # Then, in your controller tests, you can access spree routes like this:
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.1.2
4
+ version: 2.1.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Sean Schofield
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2013-10-15 00:00:00.000000000 Z
11
+ date: 2013-11-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemerchant
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - '='
18
18
  - !ruby/object:Gem::Version
19
- version: 1.39.2
19
+ version: 1.42.2
20
20
  type: :runtime
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - '='
25
25
  - !ruby/object:Gem::Version
26
- version: 1.39.2
26
+ version: 1.42.2
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: acts_as_list
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -58,14 +58,14 @@ dependencies:
58
58
  requirements:
59
59
  - - '='
60
60
  - !ruby/object:Gem::Version
61
- version: 1.11.1
61
+ version: 1.27.0
62
62
  type: :runtime
63
63
  prerelease: false
64
64
  version_requirements: !ruby/object:Gem::Requirement
65
65
  requirements:
66
66
  - - '='
67
67
  - !ruby/object:Gem::Version
68
- version: 1.11.1
68
+ version: 1.27.0
69
69
  - !ruby/object:Gem::Dependency
70
70
  name: cancan
71
71
  requirement: !ruby/object:Gem::Requirement
@@ -84,16 +84,16 @@ dependencies:
84
84
  name: deface
85
85
  requirement: !ruby/object:Gem::Requirement
86
86
  requirements:
87
- - - '>='
87
+ - - ~>
88
88
  - !ruby/object:Gem::Version
89
- version: 1.0.0.rc3
89
+ version: 1.0.0
90
90
  type: :runtime
91
91
  prerelease: false
92
92
  version_requirements: !ruby/object:Gem::Requirement
93
93
  requirements:
94
- - - '>='
94
+ - - ~>
95
95
  - !ruby/object:Gem::Version
96
- version: 1.0.0.rc3
96
+ version: 1.0.0
97
97
  - !ruby/object:Gem::Dependency
98
98
  name: ffaker
99
99
  requirement: !ruby/object:Gem::Requirement
@@ -112,14 +112,14 @@ dependencies:
112
112
  name: highline
113
113
  requirement: !ruby/object:Gem::Requirement
114
114
  requirements:
115
- - - '='
115
+ - - ~>
116
116
  - !ruby/object:Gem::Version
117
117
  version: 1.6.18
118
118
  type: :runtime
119
119
  prerelease: false
120
120
  version_requirements: !ruby/object:Gem::Requirement
121
121
  requirements:
122
- - - '='
122
+ - - ~>
123
123
  - !ruby/object:Gem::Version
124
124
  version: 1.6.18
125
125
  - !ruby/object:Gem::Dependency
@@ -140,16 +140,16 @@ dependencies:
140
140
  name: json
141
141
  requirement: !ruby/object:Gem::Requirement
142
142
  requirements:
143
- - - '>='
143
+ - - ~>
144
144
  - !ruby/object:Gem::Version
145
- version: 1.7.7
145
+ version: '1.7'
146
146
  type: :runtime
147
147
  prerelease: false
148
148
  version_requirements: !ruby/object:Gem::Requirement
149
149
  requirements:
150
- - - '>='
150
+ - - ~>
151
151
  - !ruby/object:Gem::Version
152
- version: 1.7.7
152
+ version: '1.7'
153
153
  - !ruby/object:Gem::Dependency
154
154
  name: kaminari
155
155
  requirement: !ruby/object:Gem::Requirement
@@ -168,16 +168,16 @@ dependencies:
168
168
  name: money
169
169
  requirement: !ruby/object:Gem::Requirement
170
170
  requirements:
171
- - - '>='
171
+ - - ~>
172
172
  - !ruby/object:Gem::Version
173
- version: 5.1.1
173
+ version: '5.1'
174
174
  type: :runtime
175
175
  prerelease: false
176
176
  version_requirements: !ruby/object:Gem::Requirement
177
177
  requirements:
178
- - - '>='
178
+ - - ~>
179
179
  - !ruby/object:Gem::Version
180
- version: 5.1.1
180
+ version: '5.1'
181
181
  - !ruby/object:Gem::Dependency
182
182
  name: paperclip
183
183
  requirement: !ruby/object:Gem::Requirement
@@ -226,14 +226,14 @@ dependencies:
226
226
  requirements:
227
227
  - - '='
228
228
  - !ruby/object:Gem::Version
229
- version: 1.0.0
229
+ version: 1.1.0
230
230
  type: :runtime
231
231
  prerelease: false
232
232
  version_requirements: !ruby/object:Gem::Requirement
233
233
  requirements:
234
234
  - - '='
235
235
  - !ruby/object:Gem::Version
236
- version: 1.0.0
236
+ version: 1.1.0
237
237
  - !ruby/object:Gem::Dependency
238
238
  name: state_machine
239
239
  requirement: !ruby/object:Gem::Requirement
@@ -455,7 +455,6 @@ files:
455
455
  - lib/spree/core/environment/calculators.rb
456
456
  - lib/spree/core/environment.rb
457
457
  - lib/spree/core/environment_extension.rb
458
- - lib/spree/core/ext/active_record.rb
459
458
  - lib/spree/core/gateway_error.rb
460
459
  - lib/spree/core/mail_interceptor.rb
461
460
  - lib/spree/core/mail_settings.rb
@@ -467,7 +466,6 @@ files:
467
466
  - lib/spree/core/s3_support.rb
468
467
  - lib/spree/core/search/base.rb
469
468
  - lib/spree/core/token_resource.rb
470
- - lib/spree/core/user_banners.rb
471
469
  - lib/spree/core/validators/email.rb
472
470
  - lib/spree/core/version.rb
473
471
  - lib/spree/core.rb
@@ -625,6 +623,10 @@ files:
625
623
  - db/migrate/20130909115621_change_states_required_for_countries.rb
626
624
  - db/migrate/20130915032339_add_deleted_at_to_spree_stock_items.rb
627
625
  - db/migrate/20131001013410_remove_unused_credit_card_fields.rb
626
+ - db/migrate/20131113035136_add_channel_to_spree_orders.rb
627
+ - db/migrate/20131118041203_add_tax_total_to_spree_orders.rb
628
+ - db/migrate/20131118043021_add_order_id_to_spree_adjustments.rb
629
+ - db/migrate/20131118074808_add_included_to_spree_adjustments.rb
628
630
  - db/seeds.rb
629
631
  - vendor/assets/javascripts/jquery-migrate-1.0.0.js
630
632
  - vendor/assets/javascripts/jquery.payment.js
@@ -1,8 +0,0 @@
1
- module ActiveRecord::Persistence
2
-
3
- # Update attributes of a record in the database without callbacks, validations etc.
4
- def update_attributes_without_callbacks(attributes)
5
- self.assign_attributes(attributes)
6
- self.class.where(:id => id).update_all(attributes)
7
- end
8
- end
@@ -1,25 +0,0 @@
1
- # Utility methods for dealing with user banners and saving
2
- # an array of dismissed banners per user
3
- # use symbols as banner id
4
- module Spree
5
- module Core
6
- module UserBanners
7
- def self.included(base)
8
- base.preference :dismissed_banners, :string, :default => ''
9
- end
10
-
11
- def dismissed_banner_ids
12
- dismissed = self.preferred_dismissed_banners
13
- dismissed.split(',').map(&:to_sym)
14
- end
15
-
16
- def dismiss_banner(banner_id)
17
- self.preferred_dismissed_banners = dismissed_banner_ids.push(banner_id.to_sym).uniq.join(',')
18
- end
19
-
20
- def dismissed_banner?(banner_id)
21
- dismissed_banner_ids.include? banner_id.to_sym
22
- end
23
- end
24
- end
25
- end