spree_promo 1.3.3 → 1.3.4

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: 40582bf42f5cd6675df3f3f3db1480808111213f
4
+ data.tar.gz: 2868fc07c91b0cecf867536dddcb1af9efaccda0
5
+ SHA512:
6
+ metadata.gz: 5c949e94bd1b46aaf8a9240ee90366068676fcce700b5081e7117699b2944823ed22df631707ee6c0670eddbafb9389bda7d8afa2459f9b8316b2f76a30ff6aa
7
+ data.tar.gz: e82b0b25514add622fa7645073a5a748aaaabb79ba8880f034531c774be28a64bf7ef1854f640624480d51e4fe3f0813505ddcf517acb4c5c523b6142ce4a5e5
@@ -15,6 +15,7 @@ Spree::OrdersController.class_eval do
15
15
  respond_with(@order) do |format|
16
16
  format.html do
17
17
  if params.has_key?(:checkout)
18
+ @order.next_transition.run_callbacks if @order.cart?
18
19
  redirect_to checkout_state_path(@order.checkout_steps.first)
19
20
  else
20
21
  redirect_to cart_path
@@ -4,37 +4,37 @@ Spree::StoreController.class_eval do
4
4
  def apply_coupon_code
5
5
  if @order.coupon_code.present?
6
6
  # check if coupon code is already applied
7
- if @order.adjustments.promotion.eligible.detect { |p| p.originator.promotion.code == @order.coupon_code }.present?
7
+ if @order.coupon_code_applied?
8
8
  flash[:notice] = t(:coupon_code_already_applied)
9
9
  true
10
10
  else
11
11
  event_name = "spree.checkout.coupon_code_added"
12
12
 
13
13
  # TODO should restrict to payload's event name?
14
- promotion = Spree::Promotion.find_by_code(@order.coupon_code)
14
+ current_promotion = @order.find_promo_for_coupon_code
15
15
 
16
- if promotion.present?
17
- if promotion.expired?
16
+ if current_promotion.present?
17
+ if current_promotion.expired?
18
18
  flash[:error] = t(:coupon_code_expired)
19
19
  return false
20
20
  end
21
21
 
22
- if promotion.usage_limit_exceeded?
22
+ if current_promotion.usage_limit_exceeded?
23
23
  flash[:error] = t(:coupon_code_max_usage)
24
24
  return false
25
25
  end
26
26
 
27
27
  previous_promo = @order.adjustments.promotion.eligible.first
28
- fire_event(event_name, :coupon_code => @order.coupon_code)
29
- promo = @order.adjustments.promotion.detect { |p| p.originator.promotion.code == @order.coupon_code }
28
+ current_promotion.activate(:order => @order, :coupon_code => @order.coupon_code)
29
+ promo_adjustment = @order.find_adjustment_for_coupon_code
30
30
 
31
- if promo.present? and promo.eligible
31
+ if promo_adjustment.present? and promo_adjustment.eligible
32
32
  flash[:success] = t(:coupon_code_applied)
33
33
  true
34
- elsif previous_promo.present? and promo.present?
34
+ elsif previous_promo.present? and promo_adjustment.present?
35
35
  flash[:error] = t(:coupon_code_better_exists)
36
36
  false
37
- elsif promo.present?
37
+ elsif promo_adjustment.present?
38
38
  flash[:error] = t(:coupon_code_not_eligible)
39
39
  false
40
40
  else
@@ -1,10 +1,10 @@
1
1
  module Spree
2
2
 
3
3
  # A calculator for promotions that calculates a percent-off discount
4
- # for all matching products in an order. This should not be used as a
4
+ # for all matching products in an order. This should not be used as a
5
5
  # shipping calculator since it would be the same thing as a flat percent
6
6
  # off the entire order.
7
-
7
+
8
8
  class Calculator::PercentPerItem < Calculator
9
9
  preference :percent, :decimal, :default => 0
10
10
 
@@ -23,10 +23,12 @@ module Spree
23
23
 
24
24
  private
25
25
 
26
- # Returns all products that match the promotion's rule.
26
+ # Returns all products that match the promotion's rule.
27
27
  def matching_products
28
- @matching_products ||= if compute_on_promotion?
29
- self.calculable.promotion.rules.map(&:products).flatten
28
+ if compute_on_promotion?
29
+ self.calculable.promotion.rules.map do |rule|
30
+ rule.respond_to?(:products) ? rule.products : []
31
+ end.flatten
30
32
  end
31
33
  end
32
34
 
@@ -1,10 +1,7 @@
1
1
  Spree::Order.class_eval do
2
- attr_accessible :coupon_code
3
- attr_reader :coupon_code
4
2
 
5
- def coupon_code=(code)
6
- @coupon_code = code.strip.downcase rescue nil
7
- end
3
+ attr_accessible :coupon_code
4
+ attr_accessor :coupon_code
8
5
 
9
6
  # Tells us if there if the specified promotion is already associated with the order
10
7
  # regardless of whether or not its currently eligible. Useful because generally
@@ -16,4 +13,24 @@ Spree::Order.class_eval do
16
13
  def promo_total
17
14
  adjustments.eligible.promotion.pluck(:amount).sum
18
15
  end
16
+
17
+ def coupon_code_applied?
18
+ adjustments.promotion.eligible.detect do |p|
19
+ Spree::Promotion.normalize_coupon_code(p.originator.promotion.code) == normalized_coupon_code
20
+ end.present?
21
+ end
22
+
23
+ def find_adjustment_for_coupon_code
24
+ adjustments.promotion.detect do |p|
25
+ Spree::Promotion.normalize_coupon_code(p.originator.promotion.code) == normalized_coupon_code
26
+ end
27
+ end
28
+
29
+ def find_promo_for_coupon_code
30
+ Spree::Promotion.where("LOWER(code) = '#{normalized_coupon_code}'").first
31
+ end
32
+
33
+ def normalized_coupon_code
34
+ Spree::Promotion.normalize_coupon_code(coupon_code)
35
+ end
19
36
  end
@@ -45,8 +45,9 @@ module Spree
45
45
  return unless order_activatable? payload[:order]
46
46
 
47
47
  if code.present?
48
- event_code = payload[:coupon_code]
49
- return unless event_code == self.code
48
+ normalized_submitted_code = Spree::Promotion.normalize_coupon_code(payload[:coupon_code])
49
+ normalized_expected_code = Spree::Promotion.normalize_coupon_code(self.code)
50
+ return unless normalized_submitted_code == normalized_expected_code
50
51
  end
51
52
 
52
53
  if path.present?
@@ -102,8 +103,10 @@ module Spree
102
103
  credits.count
103
104
  end
104
105
 
105
- def code=(coupon_code)
106
- write_attribute(:code, (coupon_code.downcase.strip rescue nil))
106
+ private
107
+
108
+ def self.normalize_coupon_code(code)
109
+ code.to_s.strip.downcase rescue ""
107
110
  end
108
111
  end
109
112
  end
@@ -6,9 +6,11 @@ module Spree
6
6
  accepts_nested_attributes_for :promotion_action_line_items
7
7
  attr_accessible :promotion_action_line_items_attributes
8
8
 
9
+ delegate :eligible?, :to => :promotion
9
10
 
10
11
  def perform(options = {})
11
12
  return unless order = options[:order]
13
+ return unless eligible?(order)
12
14
  promotion_action_line_items.each do |item|
13
15
  current_quantity = order.quantity_of(item.variant)
14
16
  if current_quantity < item.quantity
@@ -3,4 +3,4 @@ Deface::Override.new(:virtual_path => "spree/layouts/admin",
3
3
  :insert_bottom => "[data-hook='admin_tabs'], #admin_tabs[data-hook]",
4
4
  :text => "<%= tab(:promotions, :url => spree.admin_promotions_path, :icon => 'icon-bullhorn') %>",
5
5
  :disabled => false,
6
- :original => '3e847740dc3e7f924aba1ccb4cb00c7b841649e3')
6
+ :original => '031652cf5a054796022506622082ab6d2693699f')
@@ -6,6 +6,7 @@
6
6
  <% param_prefix = "promotion[promotion_actions_attributes][#{promotion_action.id}]" %>
7
7
  <%= hidden_field_tag "#{param_prefix}[id]", promotion_action.id %>
8
8
 
9
+ <%= render :partial => "spree/shared/error_messages", :locals => { :target => promotion_action } %>
9
10
  <%= render :partial => "spree/admin/promotions/actions/#{type_name}",
10
11
  :locals => { :promotion_action => promotion_action, :param_prefix => param_prefix } %>
11
- </div>
12
+ </div>
@@ -5,5 +5,6 @@
5
5
 
6
6
  <% param_prefix = "promotion[promotion_rules_attributes][#{promotion_rule.id}]" %>
7
7
  <%= hidden_field_tag "#{param_prefix}[id]", promotion_rule.id %>
8
+ <%= render :partial => "spree/shared/error_messages", :locals => { :target => promotion_rule } %>
8
9
  <%= render :partial => "spree/admin/promotions/rules/#{type_name}", :locals => { :promotion_rule => promotion_rule, :param_prefix => param_prefix } %>
9
10
  </div>
@@ -16,12 +16,12 @@ en:
16
16
  add_rule_of_type: Add rule of type
17
17
  back_to_promotions_list: "Back To Promotions List"
18
18
  coupon: Coupon
19
- coupon_code: Coupon code
19
+ coupon_code: Coupon code (NOT case sensitive)
20
20
  coupon_code_applied: The coupon code was successfully applied to your order.
21
21
  coupon_code_expired: The coupon code is expired
22
22
  coupon_code_already_applied: The coupon code has already been applied to this order
23
23
  coupon_code_better_exists: The previously applied coupon code results in a better deal
24
- coupon_code_not_found: The coupon code you entered doesn't exist. Please try again.
24
+ coupon_code_not_found: The coupon code you entered doesn't exist. Please try again. Coupon codes are not case sensitive.
25
25
  coupon_code_max_usage: Coupon code usage limit exceeded
26
26
  coupon_code_not_eligible: This coupon code is not eligible for this order
27
27
  editing_promotion: Editing Promotion
metadata CHANGED
@@ -1,32 +1,29 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: spree_promo
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.3.3
5
- prerelease:
4
+ version: 1.3.4
6
5
  platform: ruby
7
6
  authors:
8
7
  - David North
9
8
  autorequire:
10
9
  bindir: bin
11
10
  cert_chain: []
12
- date: 2013-06-13 00:00:00.000000000 Z
11
+ date: 2013-10-15 00:00:00.000000000 Z
13
12
  dependencies:
14
13
  - !ruby/object:Gem::Dependency
15
14
  name: spree_core
16
15
  requirement: !ruby/object:Gem::Requirement
17
- none: false
18
16
  requirements:
19
17
  - - '='
20
18
  - !ruby/object:Gem::Version
21
- version: 1.3.3
19
+ version: 1.3.4
22
20
  type: :runtime
23
21
  prerelease: false
24
22
  version_requirements: !ruby/object:Gem::Requirement
25
- none: false
26
23
  requirements:
27
24
  - - '='
28
25
  - !ruby/object:Gem::Version
29
- version: 1.3.3
26
+ version: 1.3.4
30
27
  description: Required dependency for Spree
31
28
  email: david@spreecommerce.com
32
29
  executables: []
@@ -105,30 +102,26 @@ files:
105
102
  homepage: http://spreecommerce.com
106
103
  licenses:
107
104
  - BSD-3
105
+ metadata: {}
108
106
  post_install_message:
109
107
  rdoc_options: []
110
108
  require_paths:
111
109
  - lib
112
110
  required_ruby_version: !ruby/object:Gem::Requirement
113
- none: false
114
111
  requirements:
115
- - - ! '>='
112
+ - - '>='
116
113
  - !ruby/object:Gem::Version
117
114
  version: 1.8.7
118
115
  required_rubygems_version: !ruby/object:Gem::Requirement
119
- none: false
120
116
  requirements:
121
- - - ! '>='
117
+ - - '>='
122
118
  - !ruby/object:Gem::Version
123
119
  version: '0'
124
- segments:
125
- - 0
126
- hash: -2378760462746062854
127
120
  requirements:
128
121
  - none
129
122
  rubyforge_project:
130
- rubygems_version: 1.8.23
123
+ rubygems_version: 2.1.0
131
124
  signing_key:
132
- specification_version: 3
125
+ specification_version: 4
133
126
  summary: Promotion functionality for use with Spree.
134
127
  test_files: []