spree_core 2.1.4 → 2.1.5

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: a4097b8c35f0d4c860dbaeff13518f90e790880e
4
- data.tar.gz: 67e8f16ef1ebf41b7fd672a31d17ad3736439856
3
+ metadata.gz: 729f9d4f394bb9bbd17cf7dbb7142ae574a9183e
4
+ data.tar.gz: ae2d1dcd731873c1ae6523bf46a1eb6a63db882e
5
5
  SHA512:
6
- metadata.gz: 83ed87a684e91dac0ce56b9d1836d0d4e1cee96cb6dd388e1d68dba07fa9d9140cabf3f77f7c50298e42ae026e1827a668aa8355256965044c0bc097157a69db
7
- data.tar.gz: a6bbe1a58e61240068e92db9d3f8a2b577b939e363ff286c7ba95f0738884bc64c1f54339b4163aa51053bec6e25323f349c64fb42a08b93c852d9a19ca99901
6
+ metadata.gz: d3527af7dec8d2acdf7736713929387e3c099fa6776227640bd9089d2a5814da0c0f41eb54a822e5b80662f9f41126aeea5f155b82c2bfbe8d3b6ba331737b2a
7
+ data.tar.gz: 238f664949e01954bf25eb9cf8cb14f1a5236b615100c8961d0ee445d9e712022e1527e19ce3ce27c1082751128d2b9f99cf2d6ee8108b5b6452108fedeab6d3
@@ -77,11 +77,16 @@ module Spree
77
77
 
78
78
  before_transition :from => :cart, :do => :ensure_line_items_present
79
79
 
80
- before_transition :to => :delivery, :do => :create_proposed_shipments
81
- before_transition :to => :delivery, :do => :ensure_available_shipping_rates
80
+ if states[:address]
81
+ before_transition :from => :address, :do => :create_tax_charge!
82
+ end
83
+
84
+ if states[:delivery]
85
+ before_transition :to => :delivery, :do => :create_proposed_shipments
86
+ before_transition :to => :delivery, :do => :ensure_available_shipping_rates
87
+ end
82
88
 
83
89
  after_transition :to => :complete, :do => :finalize!
84
- after_transition :to => :delivery, :do => :create_tax_charge!
85
90
  after_transition :to => :resumed, :do => :after_resume
86
91
  after_transition :to => :canceled, :do => :after_cancel
87
92
  end
@@ -528,9 +528,9 @@ module Spree
528
528
 
529
529
  def is_risky?
530
530
  self.payments.where(%{
531
- (avs_response IS NOT NULL and avs_response != 'D') or
531
+ (avs_response IS NOT NULL and avs_response != '' and avs_response != 'D' and avs_response != 'M') or
532
532
  (cvv_response_code IS NOT NULL and cvv_response_code != 'M') or
533
- cvv_response_message IS NOT NULL or
533
+ cvv_response_message IS NOT NULL and cvv_response_message != '' or
534
534
  state = 'failed'
535
535
  }.squish!).uniq.count > 0
536
536
  end
@@ -566,7 +566,7 @@ module Spree
566
566
  end
567
567
 
568
568
  def has_available_payment
569
- return unless delivery?
569
+ return unless has_step?("delivery") && delivery?
570
570
  # errors.add(:base, :no_payment_methods_available) if available_payment_methods.empty?
571
571
  end
572
572
 
@@ -102,10 +102,16 @@ module Spree
102
102
  # The +payment_state+ value helps with reporting, etc. since it provides a quick and easy way to locate Orders needing attention.
103
103
  def update_payment_state
104
104
 
105
- #line_item are empty when user empties cart
105
+ # line_item are empty when user empties cart
106
106
  if line_items.empty? || round_money(order.payment_total) < round_money(order.total)
107
- if payments.present? && payments.last.state == 'failed'
108
- order.payment_state = 'failed'
107
+ if payments.present?
108
+ if payments.last.state == 'failed'
109
+ order.payment_state = 'failed'
110
+ elsif payments.last.state == 'completed'
111
+ order.payment_state = 'credit_owed'
112
+ else
113
+ order.payment_state = 'balance_due'
114
+ end
109
115
  else
110
116
  order.payment_state = 'balance_due'
111
117
  end
@@ -119,11 +119,16 @@ module Spree
119
119
  end
120
120
 
121
121
  def is_avs_risky?
122
- !(avs_response == "D" || avs_response.nil?)
122
+ return false if avs_response == "D"
123
+ return false if avs_response.blank?
124
+ return true
123
125
  end
124
126
 
125
127
  def is_cvv_risky?
126
- !(cvv_response_code == "M" || cvv_response_code.nil?)
128
+ return false if cvv_response_code == "M"
129
+ return false if cvv_response_code.nil?
130
+ return false if cvv_response_message.present?
131
+ return true
127
132
  end
128
133
 
129
134
  private
@@ -54,7 +54,7 @@ module Spree
54
54
  end
55
55
 
56
56
  def auto_capture?
57
- Spree::Config[:auto_capture]
57
+ self.auto_capture.nil? ? Spree::Config[:auto_capture] : self.auto_capture
58
58
  end
59
59
 
60
60
  def supports?(source)
@@ -1,5 +1,6 @@
1
1
  module Spree
2
2
  class Price < ActiveRecord::Base
3
+ acts_as_paranoid
3
4
  belongs_to :variant, class_name: 'Spree::Variant'
4
5
 
5
6
  validate :check_price
@@ -30,21 +30,24 @@ module Spree
30
30
  end
31
31
 
32
32
  def activate(payload)
33
- return unless order_activatable? payload[:order]
34
-
35
- # make sure code is always downcased (old databases might have mixed case codes)
36
- if code.present?
37
- event_code = payload[:coupon_code]
38
- return unless event_code == self.code.downcase.strip
39
- end
40
-
41
- if path.present?
42
- return unless path == payload[:path]
43
- end
44
-
45
- actions.each do |action|
46
- action.perform(payload)
33
+ if order_activatable?(payload[:order]) && eligible?(payload[:order])
34
+ # make sure code is always downcased (old databases might have mixed case codes)
35
+ if code.present?
36
+ event_code = payload[:coupon_code]
37
+ return unless event_code == self.code.downcase.strip
38
+ end
39
+
40
+ if path.present?
41
+ return unless path == payload[:path]
42
+ end
43
+
44
+ actions.each do |action|
45
+ action.perform(payload)
46
+ end
47
+
48
+ return true
47
49
  end
50
+ false
48
51
  end
49
52
 
50
53
  # called anytime order.update! happens
@@ -78,7 +78,8 @@ module Spree
78
78
  def process_return
79
79
  inventory_units.each do |iu|
80
80
  iu.return!
81
- Spree::StockMovement.create!(stock_item_id: iu.find_stock_item.id, quantity: 1)
81
+ stock_item = Spree::StockItem.where(variant_id: iu.variant.id, stock_location_id: stock_location_id).first
82
+ Spree::StockMovement.create!(stock_item_id: stock_item.id, quantity: 1)
82
83
  end
83
84
 
84
85
  credit = Adjustment.new(amount: amount.abs * -1, label: Spree.t(:rma_credit))
@@ -6,7 +6,7 @@ module Spree
6
6
  default_scope -> { where(deleted_at: nil) }
7
7
 
8
8
  has_many :shipments
9
- has_many :shipping_method_categories
9
+ has_many :shipping_method_categories, :dependent => :destroy
10
10
  has_many :shipping_categories, through: :shipping_method_categories
11
11
  has_many :shipping_rates, inverse_of: :shipping_method
12
12
 
@@ -30,7 +30,7 @@ module Spree
30
30
  dependent: :destroy
31
31
 
32
32
  validate :check_price
33
- validates :price, numericality: { greater_than_or_equal_to: 0 }, presence: true, if: proc { Spree::Config[:require_master_price] }
33
+ validates :price, numericality: { greater_than_or_equal_to: 0 }
34
34
 
35
35
  validates :cost_price, numericality: { greater_than_or_equal_to: 0, allow_nil: true }
36
36
 
@@ -56,7 +56,9 @@ module Spree
56
56
  end
57
57
 
58
58
  def options_text
59
- values = self.option_values.joins(:option_type).order("#{Spree::OptionType.table_name}.position asc")
59
+ values = self.option_values.sort do |a, b|
60
+ a.option_type.position <=> b.option_type.position
61
+ end
60
62
 
61
63
  values.map! do |ov|
62
64
  "#{ov.option_type.presentation}: #{ov.presentation}"
@@ -76,6 +78,17 @@ module Spree
76
78
  deleted_at
77
79
  end
78
80
 
81
+ # Product may be created with deleted_at already set,
82
+ # which would make AR's default finder return nil.
83
+ # This is a stopgap for that little problem.
84
+ def product
85
+ Spree::Product.unscoped { super }
86
+ end
87
+
88
+ def default_price
89
+ Spree::Price.unscoped { super }
90
+ end
91
+
79
92
  def options=(options = {})
80
93
  options.each do |option|
81
94
  set_option_value(option[:name], option[:value])
@@ -136,14 +149,12 @@ module Spree
136
149
  "#{sku} #{options_text}".strip
137
150
  end
138
151
 
139
- # Product may be created with deleted_at already set,
140
- # which would make AR's default finder return nil.
141
- # This is a stopgap for that little problem.
142
- def product
143
- Spree::Product.unscoped { super }
152
+ def in_stock?(quantity=1)
153
+ puts %q{[DEPRECATION] In Spree 2.2, Variant#in_stock? will no longer take a quantity. Use Variant#can_supply? instead.}
154
+ can_stock?(quantity)
144
155
  end
145
156
 
146
- def in_stock?(quantity=1)
157
+ def can_stock?(quantity=1)
147
158
  Spree::Stock::Quantifier.new(self).can_supply?(quantity)
148
159
  end
149
160
 
@@ -318,13 +318,18 @@ en:
318
318
  delivery_success: Test Mail sent successfully
319
319
  error: ! 'Test Mail error: %{e}'
320
320
  tab:
321
- overview: "Overview"
322
- orders: "Orders"
323
- products: "Products"
324
- reports: "Reports"
325
- configuration: "Configuration"
326
- promotions: "Promotions"
327
- users: "Users"
321
+ configuration: Configuration
322
+ option_types: Option Types
323
+ orders: Orders
324
+ overview: Overview
325
+ products: Products
326
+ promotions: Promotions
327
+ properties: Properties
328
+ prototypes: Prototypes
329
+ reports: Reports
330
+ taxonomies: Taxonomies
331
+ taxons: Taxons
332
+ users: Users
328
333
  administration: Administration
329
334
  agree_to_privacy_policy: Agree to Privacy Policy
330
335
  agree_to_terms_of_service: Agree to Terms of Service
@@ -356,6 +361,7 @@ en:
356
361
  attachment_styles: Paperclip Styles
357
362
  attachment_url: Attachments URL
358
363
  authorization_failure: Authorization Failure
364
+ auto_capture: Auto Capture
359
365
  available_on: Available On
360
366
  avs_response: AVS Response
361
367
  back: Back
@@ -600,6 +606,7 @@ en:
600
606
  image_settings_updated: Image Settings successfully updated.
601
607
  image_settings_warning: You will need to regenerate thumbnails if you update the paperclip styles. Use rake paperclip:refresh:thumbnails CLASS=Spree::Image to do this.
602
608
  images: Images
609
+ inactive: Inactive
603
610
  included_in_price: Included in Price
604
611
  included_price_validation: cannot be selected unless you have set a Default Tax Zone
605
612
  instructions_to_reset_password: Please enter your email on the form below
@@ -926,6 +933,7 @@ en:
926
933
  review: Review
927
934
  risk: Risk
928
935
  risk_analysis: Risk Analysis
936
+ risky: Risky
929
937
  rma_credit: RMA Credit
930
938
  rma_number: RMA Number
931
939
  rma_value: RMA Value
@@ -1094,6 +1102,7 @@ en:
1094
1102
  update: Update
1095
1103
  updating: Updating
1096
1104
  usage_limit: Usage Limit
1105
+ use_app_default: Use App Default
1097
1106
  use_billing_address: Use Billing Address
1098
1107
  use_new_cc: Use a new card
1099
1108
  use_s3: Use Amazon S3 For Images
@@ -0,0 +1,5 @@
1
+ class AddDeletedAtToSpreePrices < ActiveRecord::Migration
2
+ def change
3
+ add_column :spree_prices, :deleted_at, :datetime
4
+ end
5
+ end
@@ -0,0 +1,5 @@
1
+ class AddAutoCaptureToPaymentMethods < ActiveRecord::Migration
2
+ def change
3
+ add_column :spree_payment_methods, :auto_capture, :boolean
4
+ end
5
+ end
@@ -0,0 +1,11 @@
1
+ class DefaultVariantWeightToZero < ActiveRecord::Migration
2
+ def up
3
+ Spree::Variant.unscoped.where(weight: nil).update_all("weight = 0.0")
4
+
5
+ change_column :spree_variants, :weight, :decimal, precision: 8, scale: 2, default: 0.0
6
+ end
7
+
8
+ def down
9
+ change_column :spree_variants, :weight, :decimal, precision: 8, scale: 2
10
+ end
11
+ end
@@ -5,7 +5,6 @@ module Spree
5
5
  extend ActiveSupport::Concern
6
6
 
7
7
  included do
8
- before_filter :ensure_api_key
9
8
  helper_method :try_spree_current_user
10
9
 
11
10
  rescue_from CanCan::AccessDenied do |exception|
@@ -27,7 +26,11 @@ module Spree
27
26
  redirect_to '/unauthorized'
28
27
  else
29
28
  store_location
30
- redirect_to respond_to?(:spree_login_path) ? spree_login_path : spree.root_path
29
+ if respond_to?(:spree_login_path)
30
+ redirect_to spree_login_path
31
+ else
32
+ redirect_to spree.respond_to?(:root_path) ? spree.root_path : root_path
33
+ end
31
34
  end
32
35
  end
33
36
 
@@ -57,16 +60,6 @@ module Spree
57
60
  redirect_to(session["spree_user_return_to"] || default)
58
61
  session["spree_user_return_to"] = nil
59
62
  end
60
-
61
- # Need to generate an API key for a user due to some actions potentially
62
- # requiring authentication to the Spree API
63
- def ensure_api_key
64
- if user = try_spree_current_user
65
- if user.respond_to?(:spree_api_key) && user.spree_api_key.blank?
66
- user.generate_spree_api_key!
67
- end
68
- end
69
- end
70
63
  end
71
64
  end
72
65
  end
@@ -11,15 +11,17 @@ module Spree
11
11
  end
12
12
 
13
13
  # The current incomplete order from the session for use in cart and during checkout
14
- def current_order(create_order_if_necessary = false)
14
+ def current_order(options = {})
15
+ options[:create_order_if_necessary] ||= false
16
+ options[:lock] ||= false
15
17
  return @current_order if @current_order
16
18
 
17
19
  if session[:order_id]
18
- current_order = Spree::Order.includes(:adjustments).find_by(id: session[:order_id], currency: current_currency)
20
+ current_order = Spree::Order.includes(:adjustments).lock(options[:lock]).find_by(id: session[:order_id], currency: current_currency)
19
21
  @current_order = current_order unless current_order.try(:completed?)
20
22
  end
21
23
 
22
- if create_order_if_necessary and (@current_order.nil? or @current_order.completed?)
24
+ if options[:create_order_if_necessary] and (@current_order.nil? or @current_order.completed?)
23
25
  @current_order = Spree::Order.new(currency: current_currency)
24
26
  @current_order.user ||= try_spree_current_user
25
27
  # See issue #3346 for reasons why this line is here
@@ -23,12 +23,14 @@ module Spree
23
23
  def duplicate_product
24
24
  product.dup.tap do |new_product|
25
25
  new_product.name = "COPY OF #{product.name}"
26
+ new_product.permalink = "copy-of-#{product.permalink}"
26
27
  new_product.taxons = product.taxons
27
28
  new_product.created_at = nil
28
29
  new_product.deleted_at = nil
29
30
  new_product.updated_at = nil
30
31
  new_product.product_properties = reset_properties
31
32
  new_product.master = duplicate_master
33
+ new_product.variants = product.variants.map { |variant| duplicate_variant variant }
32
34
  end
33
35
  end
34
36
 
@@ -43,6 +45,14 @@ module Spree
43
45
  end
44
46
  end
45
47
 
48
+ def duplicate_variant(variant)
49
+ new_variant = variant.dup
50
+ new_variant.sku = "COPY OF #{new_variant.sku}"
51
+ new_variant.deleted_at = nil
52
+ new_variant.option_values = variant.option_values.map { |option_value| option_value.dup}
53
+ new_variant
54
+ end
55
+
46
56
  def duplicate_image(image)
47
57
  new_image = image.dup
48
58
  new_image.assign_attributes(:attachment => image.attachment.clone)
@@ -1,5 +1,5 @@
1
1
  module Spree
2
2
  def self.version
3
- "2.1.4"
3
+ "2.1.5"
4
4
  end
5
5
  end
data/lib/spree/money.rb CHANGED
@@ -199,7 +199,7 @@ module Spree
199
199
  if options[:html]
200
200
  # 1) prevent blank, breaking spaces
201
201
  # 2) prevent escaping of HTML character entities
202
- output = output.gsub(" ", "&nbsp;").html_safe
202
+ output = output.sub(" ", "&nbsp;").html_safe
203
203
  end
204
204
  output
205
205
  end
@@ -32,9 +32,12 @@ module Spree
32
32
  return promotion_usage_limit_exceeded if promotion.usage_limit_exceeded?
33
33
 
34
34
  event_name = "spree.checkout.coupon_code_added"
35
- promotion.activate(:coupon_code => @order.coupon_code, :order => @order)
36
- promo = @order.adjustments.includes(:originator).promotion.detect { |p| p.originator.promotion.code == @order.coupon_code }
37
- determine_promotion_application_result(promo)
35
+ if promotion.activate(:coupon_code => @order.coupon_code, :order => @order)
36
+ promo = @order.adjustments.includes(:originator).promotion.detect { |p| p.originator.promotion.code == @order.coupon_code }
37
+ determine_promotion_application_result(promo)
38
+ else
39
+ return { :coupon_applied? => false, :error => Spree.t(:coupon_code_not_eligible) }
40
+ end
38
41
  end
39
42
 
40
43
  def promotion_expired
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.4
4
+ version: 2.1.5
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-01-23 00:00:00.000000000 Z
11
+ date: 2014-02-18 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemerchant
@@ -511,6 +511,9 @@ files:
511
511
  - db/migrate/20131120234456_add_updated_at_to_variants.rb
512
512
  - db/migrate/20131211192741_unique_shipping_method_categories.rb
513
513
  - db/migrate/20140120160805_add_index_to_variant_id_and_currency_on_prices.rb
514
+ - db/migrate/20140129024326_add_deleted_at_to_spree_prices.rb
515
+ - db/migrate/20140204192230_add_auto_capture_to_payment_methods.rb
516
+ - db/migrate/20140205181631_default_variant_weight_to_zero.rb
514
517
  - db/seeds.rb
515
518
  - lib/generators/spree/custom_user/custom_user_generator.rb
516
519
  - lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt