spree_core 2.4.0 → 2.4.1

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: 7ed979ffaeda61e053a4b98e9dc25390529f0f0e
4
- data.tar.gz: 3d4c081a21a8f8a118066c765c0970aa18322c5d
3
+ metadata.gz: 5c3f728999034d676a7bade2faa38354f43b90e7
4
+ data.tar.gz: f4112e883677f3f9561afac00de040a5191141d5
5
5
  SHA512:
6
- metadata.gz: b919e8bca207687063f08ddda21b392381991e04f409b86d8d32c63e6ee38158a3b0ea5348158f662d52693dbe17b4af3e402cc99c6f1555b2fe61ed94f235d1
7
- data.tar.gz: d9c59d21c2b5faece11d94a153cdb1bcee54adf364662b20d9b069550067b25629a9403fcf709b5b150633356b925bf41462a0252954951171d0f582c1f3d6e2
6
+ metadata.gz: abc9b0511722dada69919986af38a1c160ea1b4eae247936d57bc0e9bf9316e699e2dfb15469dcfec67ccd59a54fc1689cabb7a19960f00bedf2fbab38edb231
7
+ data.tar.gz: 6e515054c8250211a602f28d42dcc519502ca09f2928a755546ae44860fea1bc8499562fbf30a70300c75311095f7f69093d26805158d0d4c769eade5dd4247f
@@ -40,7 +40,14 @@ module Spree
40
40
  end
41
41
 
42
42
  def actionable?(line_item)
43
- product_ids.include? line_item.variant.product_id
43
+ case preferred_match_policy
44
+ when 'any', 'all'
45
+ product_ids.include? line_item.variant.product_id
46
+ when 'none'
47
+ product_ids.exclude? line_item.variant.product_id
48
+ else
49
+ raise "unexpected match policy: #{preferred_match_policy.inspect}"
50
+ end
44
51
  end
45
52
 
46
53
  def product_ids_string
@@ -105,7 +105,7 @@ module Spree
105
105
 
106
106
  reimbursement_performer.perform(self)
107
107
 
108
- if unpaid_amount.zero?
108
+ if unpaid_amount_within_tolerance?
109
109
  reimbursed!
110
110
  reimbursement_success_hooks.each { |h| h.call self }
111
111
  send_reimbursement_email
@@ -146,5 +146,23 @@ module Spree
146
146
  def send_reimbursement_email
147
147
  Spree::ReimbursementMailer.reimbursement_email(self.id).deliver
148
148
  end
149
+
150
+ # If there are multiple different reimbursement types for a single
151
+ # reimbursement we open ourselves to a one-cent rounding error for every
152
+ # type over the first one. This is due to how we round #unpaid_amount and
153
+ # how each reimbursement type will round as well. Since at this point the
154
+ # payments and credits have already been processed, we should allow the
155
+ # reimbursement to show as 'reimbursed' and not 'errored'.
156
+ def unpaid_amount_within_tolerance?
157
+ reimbursement_count = reimbursement_models.count do |model|
158
+ model.total_amount_reimbursed_for(self) > 0
159
+ end
160
+ leniency = if reimbursement_count > 0
161
+ (reimbursement_count - 1) * 0.01.to_d
162
+ else
163
+ 0
164
+ end
165
+ unpaid_amount.abs.between?(0, leniency)
166
+ end
149
167
  end
150
168
  end
@@ -1,7 +1,10 @@
1
1
  module Spree
2
2
  module Reimbursement::ReimbursementTypeValidator
3
3
  def valid_preferred_reimbursement_type?(return_item)
4
- !past_reimbursable_time_period?(return_item) || return_item.preferred_reimbursement_type == expired_reimbursement_type
4
+ preferred_type = return_item.preferred_reimbursement_type.class
5
+
6
+ !past_reimbursable_time_period?(return_item) ||
7
+ preferred_type == expired_reimbursement_type
5
8
  end
6
9
 
7
10
  def past_reimbursable_time_period?(return_item)
@@ -4,7 +4,7 @@ module Spree
4
4
 
5
5
  class << self
6
6
  def reimburse(reimbursement, return_items, simulate)
7
- unpaid_amount = return_items.sum(&:total).round(2)
7
+ unpaid_amount = return_items.sum(&:total).round(2, :down)
8
8
  reimbursement_list, unpaid_amount = create_credits(reimbursement, unpaid_amount, simulate)
9
9
  reimbursement_list
10
10
  end
@@ -3,7 +3,7 @@ class Spree::ReimbursementType::OriginalPayment < Spree::ReimbursementType
3
3
 
4
4
  class << self
5
5
  def reimburse(reimbursement, return_items, simulate)
6
- unpaid_amount = return_items.sum(&:total).round(2)
6
+ unpaid_amount = return_items.sum(&:total).round(2, :down)
7
7
  payments = reimbursement.order.payments.completed
8
8
 
9
9
  refund_list, unpaid_amount = create_refunds(reimbursement, payments, unpaid_amount, simulate)
@@ -1,12 +1,12 @@
1
1
  module Spree
2
2
  class Store < Spree::Base
3
-
4
3
  validates :code, presence: true, uniqueness: { allow_blank: true }
5
4
  validates :name, presence: true
6
5
  validates :url, presence: true
7
6
  validates :mail_from_address, presence: true
8
7
 
9
8
  before_create :ensure_default_exists_and_is_unique
9
+ before_destroy :validate_not_default
10
10
 
11
11
  scope :by_url, lambda { |url| where("url like ?", "%#{url}%") }
12
12
 
@@ -24,10 +24,15 @@ module Spree
24
24
  def ensure_default_exists_and_is_unique
25
25
  if default
26
26
  Store.update_all(default: false)
27
- else
27
+ elsif Store.where(default: true).count == 0
28
28
  self.default = true
29
29
  end
30
30
  end
31
31
 
32
+ def validate_not_default
33
+ if default
34
+ errors.add(:base, :cannot_destroy_default_store)
35
+ end
36
+ end
32
37
  end
33
38
  end
@@ -298,6 +298,11 @@ en:
298
298
  cannot_be_associated_unless_accepted: cannot be associated to a return item that is not accepted.
299
299
  inventory_unit:
300
300
  other_completed_return_item_exists: "%{inventory_unit_id} has already been taken by return item %{return_item_id}"
301
+ spree/store:
302
+ attributes:
303
+ base:
304
+ cannot_destroy_default_store: Cannot destroy the default Store.
305
+
301
306
 
302
307
  devise:
303
308
  confirmations:
@@ -1,5 +1,5 @@
1
1
  module Spree
2
2
  def self.version
3
- "2.4.0"
3
+ "2.4.1"
4
4
  end
5
5
  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.4.0
4
+ version: 2.4.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-11-20 00:00:00.000000000 Z
11
+ date: 2014-11-22 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activemerchant