spree_core 1.1.0.rc1 → 1.1.0.rc2

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.
Files changed (58) hide show
  1. data/app/assets/javascripts/admin/shipping_methods.js +3 -2
  2. data/app/assets/javascripts/admin/spree_core.js +0 -2
  3. data/app/assets/javascripts/store/spree_core.js +0 -2
  4. data/app/controllers/spree/admin/option_types_controller.rb +6 -8
  5. data/app/controllers/spree/admin/payments_controller.rb +1 -2
  6. data/app/controllers/spree/admin/products_controller.rb +13 -4
  7. data/app/controllers/spree/products_controller.rb +1 -1
  8. data/app/controllers/spree/states_controller.rb +1 -1
  9. data/app/helpers/spree/base_helper.rb +9 -7
  10. data/app/helpers/spree/products_helper.rb +0 -6
  11. data/app/mailers/spree/order_mailer.rb +4 -4
  12. data/app/mailers/spree/shipment_mailer.rb +2 -2
  13. data/app/models/spree/address.rb +25 -15
  14. data/app/models/spree/calculator/per_item.rb +4 -1
  15. data/app/models/spree/calculator.rb +1 -1
  16. data/app/models/spree/creditcard.rb +8 -184
  17. data/app/models/spree/gateway/bogus.rb +1 -1
  18. data/app/models/spree/gateway.rb +3 -1
  19. data/app/models/spree/inventory_unit.rb +3 -3
  20. data/app/models/spree/line_item.rb +14 -14
  21. data/app/models/spree/mail_method.rb +6 -1
  22. data/app/models/spree/payment/processing.rb +179 -0
  23. data/app/models/spree/payment.rb +3 -22
  24. data/app/models/spree/payment_method.rb +2 -2
  25. data/app/models/spree/product.rb +11 -10
  26. data/app/models/spree/product_property.rb +2 -0
  27. data/app/models/spree/return_authorization.rb +9 -7
  28. data/app/models/spree/shipment.rb +7 -6
  29. data/app/models/spree/shipping_method.rb +6 -5
  30. data/app/models/spree/shipping_rate.rb +2 -2
  31. data/app/models/spree/state.rb +1 -1
  32. data/app/models/spree/tax_category.rb +2 -2
  33. data/app/models/spree/tax_rate.rb +7 -7
  34. data/app/models/spree/taxon.rb +4 -4
  35. data/app/models/spree/taxonomy.rb +3 -3
  36. data/app/models/spree/variant.rb +19 -8
  37. data/app/models/spree/zone.rb +10 -10
  38. data/app/views/spree/admin/products/index.html.erb +1 -1
  39. data/app/views/spree/admin/shared/_additional_field.html.erb +1 -1
  40. data/app/views/spree/admin/shared/_head.html.erb +0 -1
  41. data/app/views/spree/admin/tax_rates/_form.html.erb +5 -5
  42. data/app/views/spree/admin/variants/index.html.erb +1 -1
  43. data/app/views/spree/layouts/spree_application.html.erb +1 -1
  44. data/app/views/spree/products/_cart_form.html.erb +1 -1
  45. data/app/views/spree/shared/_head.html.erb +1 -1
  46. data/config/locales/en.yml +2 -2
  47. data/db/migrate/20120315064358_migrate_images_from_products_to_variants.rb +1 -1
  48. data/db/migrate/20120416233427_rename_attachment_size_to_attachment_file_size.rb +5 -0
  49. data/lib/generators/spree/install/templates/app/assets/javascripts/admin/all.js +2 -0
  50. data/lib/generators/spree/install/templates/app/assets/javascripts/store/all.js +2 -0
  51. data/lib/spree/core/controller_helpers.rb +0 -1
  52. data/lib/spree/core/engine.rb +5 -1
  53. data/lib/spree/core/search/base.rb +1 -1
  54. data/lib/spree/core/testing_support/controller_requests.rb +60 -0
  55. data/lib/spree/core/testing_support/factories.rb +1 -2
  56. data/lib/spree/core/version.rb +1 -1
  57. metadata +35 -33
  58. data/app/helpers/spree/hook_helper.rb +0 -11
@@ -3,9 +3,10 @@ $(document).ready(function() {
3
3
  $('input[type=checkbox]:not(:checked)').attr('disabled', true);
4
4
  }
5
5
 
6
- $('.categories input[type=checkbox]').change(function(){
6
+ categoryCheckboxes = '.categories input[type=checkbox]';
7
+ $(categoryCheckboxes).change(function(){
7
8
  if($(this).is(':checked')) {
8
- $('input[type=checkbox]').attr('disabled', true);
9
+ $(categoryCheckboxes + ':not(:checked)').attr('disabled', true);
9
10
  $(this).removeAttr('disabled');
10
11
  } else {
11
12
  $('input[type=checkbox]').removeAttr('disabled');
@@ -1,5 +1,3 @@
1
- //= require jquery
2
- //= require jquery_ujs
3
1
  //= require jquery-ui
4
2
  //= require jquery.cookie
5
3
  //= require jquery.tokeninput
@@ -1,5 +1,3 @@
1
- //= require jquery
2
- //= require jquery_ujs
3
1
  //= require jquery.validate/jquery.validate.min
4
2
  //= require jquery.formalize.min
5
3
  //= require store/checkout
@@ -1,7 +1,7 @@
1
1
  module Spree
2
2
  module Admin
3
3
  class OptionTypesController < ResourceController
4
- before_filter :load_product, :only => [:selected, :available, :remove]
4
+ before_filter :load_product, :only => [:select, :selected, :available, :remove]
5
5
 
6
6
  def available
7
7
  set_available_option_types
@@ -32,7 +32,6 @@ module Spree
32
32
 
33
33
  # AJAX method for selecting an existing option type and associating with the current product
34
34
  def select
35
- @product = Product.find_by_param!(params[:product_id])
36
35
  @product.option_types << OptionType.find(params[:id])
37
36
  @product.reload
38
37
  @option_types = @product.option_types
@@ -55,13 +54,12 @@ module Spree
55
54
  @product = Product.find_by_param!(params[:product_id])
56
55
  end
57
56
 
58
- def set_available_option_types
59
- @available_option_types = OptionType.all
60
- selected_option_types = []
61
- @product.options.each do |option|
62
- selected_option_types << option.option_type
57
+ def set_available_option_types
58
+ @available_option_types = if @product.option_type_ids.any?
59
+ OptionType.where('id NOT IN (?)', @product.option_type_ids)
60
+ else
61
+ OptionType.all
63
62
  end
64
- @available_option_types.delete_if {|ot| selected_option_types.include? ot}
65
63
  end
66
64
  end
67
65
  end
@@ -51,9 +51,8 @@ module Spree
51
51
  end
52
52
 
53
53
  def fire
54
- # TODO: consider finer-grained control for this type of action (right now anyone in admin role can perform)
55
54
  return unless event = params[:e] and @payment.payment_source
56
- if @payment.payment_source.send("#{event}", @payment)
55
+ if @payment.send("#{event}!")
57
56
  flash.notice = t(:payment_updated)
58
57
  else
59
58
  flash[:error] = t(:cannot_perform_operation)
@@ -85,7 +85,18 @@ module Spree
85
85
  params[:q][:s] ||= "name asc"
86
86
 
87
87
  @search = super.search(params[:q])
88
- @collection = @search.result.group_by_products_id.includes([:master, {:variants => [:images, :option_values]}]).page(params[:page]).per(Spree::Config[:admin_products_per_page])
88
+ @collection = @search.result.
89
+ group_by_products_id.
90
+ includes([:master, {:variants => [:images, :option_values]}]).
91
+ page(params[:page]).
92
+ per(Spree::Config[:admin_products_per_page])
93
+
94
+ if params[:q][:s].include?("master_price")
95
+ # By applying the group in the main query we get an undefined method gsub for Arel::Nodes::Descending
96
+ # It seems to only work when the price is actually being sorted in the query
97
+ # To be investigated later.
98
+ @collection = @collection.group("spree_variants.price")
99
+ end
89
100
  else
90
101
  includes = [{:variants => [:images, {:option_values => :option_type}]}, {:master => :images}]
91
102
 
@@ -95,10 +106,8 @@ module Spree
95
106
  tmp = super.where(["#{Variant.table_name}.sku #{LIKE} ?", "%#{params[:q]}%"])
96
107
  tmp = tmp.includes(:variants_including_master).limit(params[:limit] || 10)
97
108
  @collection.concat(tmp)
98
-
99
- @collection
100
109
  end
101
-
110
+ @collection
102
111
  end
103
112
 
104
113
  def create_before
@@ -13,7 +13,7 @@ module Spree
13
13
  end
14
14
 
15
15
  def show
16
- @product = Product.find_by_permalink!(params[:id])
16
+ @product = Product.active.find_by_permalink!(params[:id])
17
17
  return unless @product
18
18
 
19
19
  @variants = Variant.active.includes([:option_values, :images]).where(:product_id => @product.id)
@@ -7,7 +7,7 @@ module Spree
7
7
  def index
8
8
  # we return ALL known information, since billing country isn't restricted
9
9
  # by shipping country
10
- respond_with @state_info = Spree::State.states_group_by_country_id.to_json
10
+ respond_with @state_info = Spree::State.states_group_by_country_id.to_json, :layout => nil
11
11
  end
12
12
  end
13
13
  end
@@ -64,6 +64,11 @@ module Spree
64
64
  end
65
65
 
66
66
  Spree::Image.attachment_definitions[:attachment][:styles].each do |style, v|
67
+ # Defines these methods by default:
68
+ # def mini_image
69
+ # def small_image
70
+ # def product_image
71
+ # def large_image
67
72
  define_method "#{style}_image" do |product, *options|
68
73
  options = options.first || {}
69
74
  if product.images.empty?
@@ -100,13 +105,10 @@ module Spree
100
105
  end
101
106
 
102
107
  def flash_messages
103
- [:notice, :error].map do |msg_type|
104
- if flash[msg_type]
105
- content_tag :div, flash[msg_type], :class => "flash #{msg_type}"
106
- else
107
- ''
108
- end
109
- end.join("\n").html_safe
108
+ flash.each do |msg_type, text|
109
+ concat(content_tag :div, text, :class => "flash #{msg_type}")
110
+ end
111
+ nil
110
112
  end
111
113
 
112
114
  def breadcrumbs(taxon, separator="&nbsp;&raquo;&nbsp;")
@@ -12,12 +12,6 @@ module Spree
12
12
  end
13
13
  end
14
14
 
15
- # returns the price of the product to show for display purposes
16
- def product_price(product_or_variant, options={})
17
- ActiveSupport::Deprecation.warn('product_price is deprecated and no longer calculates
18
- tax. Use number_to_currency instead.', caller)
19
- end
20
-
21
15
  # converts line breaks in product description into <p> tags (for html display purposes)
22
16
  def product_description(product)
23
17
  raw(product.description.gsub(/^(.*)$/, '<p>\1</p>'))
@@ -2,17 +2,17 @@ module Spree
2
2
  class OrderMailer < ActionMailer::Base
3
3
  helper 'spree/base'
4
4
 
5
- def confirm_email(order, resend=false)
5
+ def confirm_email(order, resend = false)
6
6
  @order = order
7
- subject = (resend ? "[#{t(:resend).upcase}] " : "")
7
+ subject = (resend ? "[#{t(:resend).upcase}] " : '')
8
8
  subject += "#{Spree::Config[:site_name]} #{t('order_mailer.confirm_email.subject')} ##{order.number}"
9
9
  mail(:to => order.email,
10
10
  :subject => subject)
11
11
  end
12
12
 
13
- def cancel_email(order, resend=false)
13
+ def cancel_email(order, resend = false)
14
14
  @order = order
15
- subject = (resend ? "[#{t(:resend).upcase}] " : "")
15
+ subject = (resend ? "[#{t(:resend).upcase}] " : '')
16
16
  subject += "#{Spree::Config[:site_name]} #{t('order_mailer.cancel_email.subject')} ##{order.number}"
17
17
  mail(:to => order.email,
18
18
  :subject => subject)
@@ -2,9 +2,9 @@ module Spree
2
2
  class ShipmentMailer < ActionMailer::Base
3
3
  helper 'spree/base'
4
4
 
5
- def shipped_email(shipment, resend=false)
5
+ def shipped_email(shipment, resend = false)
6
6
  @shipment = shipment
7
- subject = (resend ? "[#{t(:resend).upcase}] " : "")
7
+ subject = (resend ? "[#{t(:resend).upcase}] " : '')
8
8
  subject += "#{Spree::Config[:site_name]} #{t('shipment_mailer.shipped_email.subject')} ##{shipment.order.number}"
9
9
  mail(:to => shipment.order.email,
10
10
  :subject => subject)
@@ -13,14 +13,12 @@ module Spree
13
13
  :country, :state, :phone, :state_name,
14
14
  :company, :alternative_phone
15
15
 
16
- # disconnected since there's no code to display error messages yet OR matching client-side validation
16
+ # Disconnected since there's no code to display error messages yet OR matching client-side validation
17
17
  def phone_validate
18
18
  return if phone.blank?
19
19
  n_digits = phone.scan(/[0-9]/).size
20
20
  valid_chars = (phone =~ /^[-+()\/\s\d]+$/)
21
- if !(n_digits > 5 && valid_chars)
22
- errors.add(:phone, :invalid)
23
- end
21
+ errors.add :phone, :invalid unless (n_digits > 5 && valid_chars)
24
22
  end
25
23
 
26
24
  def self.default
@@ -28,7 +26,7 @@ module Spree
28
26
  new({:country => country}, :without_protection => true)
29
27
  end
30
28
 
31
- # can modify an address if it's not been used in an order (but checkouts controller has finer control)
29
+ # Can modify an address if it's not been used in an order (but checkouts controller has finer control)
32
30
  # def editable?
33
31
  # new_record? || (shipments.empty? && checkouts.empty?)
34
32
  # end
@@ -51,7 +49,7 @@ module Spree
51
49
 
52
50
  def same_as?(other)
53
51
  return false if other.nil?
54
- attributes.except('id', 'updated_at', 'created_at') == other.attributes.except('id', 'updated_at', 'created_at')
52
+ attributes.except('id', 'updated_at', 'created_at') == other.attributes.except('id', 'updated_at', 'created_at')
55
53
  end
56
54
 
57
55
  alias same_as same_as?
@@ -77,14 +75,28 @@ module Spree
77
75
  attributes.except('id', 'created_at', 'updated_at', 'order_id', 'country_id').all? { |_, v| v.nil? }
78
76
  end
79
77
 
78
+ # Generates an ActiveMerchant compatible address hash
79
+ def active_merchant_hash
80
+ {
81
+ :name => full_name,
82
+ :address1 => address1,
83
+ :address2 => address2,
84
+ :city => city,
85
+ :state => state_text,
86
+ :zip => zipcode,
87
+ :country => country.try(:iso),
88
+ :phone => phone
89
+ }
90
+ end
91
+
80
92
  private
81
93
 
82
94
  def state_validate
83
- #skip state validation without country (also required)
84
- #or when disabled by perfernce
85
- return if !country.present? || !Spree::Config[:address_requires_state]
95
+ # Skip state validation without country (also required)
96
+ # or when disabled by preference
97
+ return if country.blank? || !Spree::Config[:address_requires_state]
86
98
 
87
- #ensure associated state belongs to country
99
+ # ensure associated state belongs to country
88
100
  if state.present?
89
101
  if state.country == country
90
102
  self.state_name = nil #not required as we have a valid state and country combo
@@ -97,7 +109,7 @@ module Spree
97
109
  end
98
110
  end
99
111
 
100
- #ensure state_name belongs to country without states, or that it matches a predefined state name/abbr
112
+ # ensure state_name belongs to country without states, or that it matches a predefined state name/abbr
101
113
  if state_name.present?
102
114
  if country.states.present?
103
115
  states = country.states.find_all_by_name_or_abbr(state_name)
@@ -111,10 +123,8 @@ module Spree
111
123
  end
112
124
  end
113
125
 
114
- #ensure at least one state field is populated
115
- if !state.present? && state_name.blank?
116
- errors.add(:state, :blank)
117
- end
126
+ # ensure at least one state field is populated
127
+ errors.add :state, :blank if state.blank? && state_name.blank?
118
128
  end
119
129
 
120
130
  end
@@ -9,7 +9,10 @@ module Spree
9
9
  end
10
10
 
11
11
  def compute(object=nil)
12
- self.preferred_amount * object.line_items.length
12
+ return 0 if object.nil?
13
+ self.preferred_amount * object.line_items.reduce(0) do |sum, value|
14
+ sum + value.quantity
15
+ end
13
16
  end
14
17
  end
15
18
  end
@@ -11,7 +11,7 @@ module Spree
11
11
 
12
12
  # overwrite to provide description for your calculators
13
13
  def self.description
14
- "Base Caclulator"
14
+ 'Base Calculator'
15
15
  end
16
16
 
17
17
  ###################################################################
@@ -11,19 +11,14 @@ module Spree
11
11
  validates :number, :presence => true, :unless => :has_payment_profile?, :on => :create
12
12
  validates :verification_value, :presence => true, :unless => :has_payment_profile?, :on => :create
13
13
 
14
- attr_accessible :first_name, :last_name, :number, :verification_value, :year, :month, :gateway_customer_profile_id
14
+ attr_accessible :first_name, :last_name, :number, :verification_value, :year,
15
+ :month, :gateway_customer_profile_id
15
16
 
16
- def process!(payment)
17
- if Spree::Config[:auto_capture]
18
- purchase(payment.amount.to_f, payment)
19
- else
20
- authorize(payment.amount.to_f, payment)
21
- end
22
- end
17
+ scope :with_payment_profile, where('gateway_customer_profile_id IS NOT NULL')
23
18
 
24
19
  def set_last_digits
25
- number.to_s.gsub!(/\s/,'') unless number.nil?
26
- verification_value.to_s.gsub!(/\s/,'') unless number.nil?
20
+ number.to_s.gsub!(/\s/,'')
21
+ verification_value.to_s.gsub!(/\s/,'')
27
22
  self.last_digits ||= number.to_s.length <= 4 ? number : number.to_s.slice(-4..-1)
28
23
  end
29
24
 
@@ -37,7 +32,7 @@ module Spree
37
32
 
38
33
  # sets self.cc_type while we still have the card number
39
34
  def set_card_type
40
- self.cc_type ||= CardDetector.type?(self.number)
35
+ self.cc_type ||= CardDetector.type?(number)
41
36
  end
42
37
 
43
38
  def name?
@@ -65,127 +60,11 @@ module Spree
65
60
  "XXXX-XXXX-XXXX-#{last_digits}"
66
61
  end
67
62
 
68
- #RAILS 3 TODO
69
- #alias :attributes_with_quotes_default :attributes_with_quotes
70
-
71
63
  # needed for some of the ActiveMerchant gateways (eg. SagePay)
72
64
  def brand
73
65
  cc_type
74
66
  end
75
67
 
76
- scope :with_payment_profile, where('gateway_customer_profile_id IS NOT NULL')
77
-
78
- def authorize(amount, payment)
79
- # ActiveMerchant is configured to use cents so we need to multiply order total by 100
80
- payment_gateway = payment.payment_method
81
- check_environment(payment_gateway)
82
-
83
- response = payment_gateway.authorize((amount * 100).round, self, gateway_options(payment))
84
- record_log payment, response
85
-
86
- if response.success?
87
- payment.response_code = response.authorization
88
- payment.avs_response = response.avs_result['code']
89
- payment.pend
90
- else
91
- payment.failure
92
- gateway_error(response)
93
- end
94
- rescue ActiveMerchant::ConnectionError => e
95
- gateway_error e
96
- end
97
-
98
- def purchase(amount, payment)
99
- #combined Authorize and Capture that gets processed by the ActiveMerchant gateway as one single transaction.
100
- payment_gateway = payment.payment_method
101
- check_environment(payment_gateway)
102
-
103
- response = payment_gateway.purchase((amount * 100).round, self, gateway_options(payment))
104
- record_log payment, response
105
-
106
- if response.success?
107
- payment.response_code = response.authorization
108
- payment.avs_response = response.avs_result['code']
109
- payment.complete
110
- else
111
- payment.failure
112
- gateway_error(response) unless response.success?
113
- end
114
- rescue ActiveMerchant::ConnectionError => e
115
- gateway_error e
116
- end
117
-
118
- def capture(payment)
119
- return unless payment.pending?
120
- payment_gateway = payment.payment_method
121
- check_environment(payment_gateway)
122
-
123
- if payment_gateway.payment_profiles_supported?
124
- # Gateways supporting payment profiles will need access to creditcard object because this stores the payment profile information
125
- # so supply the authorization itself as well as the creditcard, rather than just the authorization code
126
- response = payment_gateway.capture(payment, self, minimal_gateway_options(payment, false))
127
- else
128
- # Standard ActiveMerchant capture usage
129
- response = payment_gateway.capture((payment.amount * 100).round, payment.response_code, minimal_gateway_options(payment, false))
130
- end
131
-
132
- record_log payment, response
133
-
134
- if response.success?
135
- payment.response_code = response.authorization
136
- payment.complete
137
- else
138
- payment.failure
139
- gateway_error(response)
140
- end
141
- rescue ActiveMerchant::ConnectionError => e
142
- gateway_error e
143
- end
144
-
145
- def void(payment)
146
- payment_gateway = payment.payment_method
147
- check_environment(payment_gateway)
148
-
149
- response = payment_gateway.void(payment.response_code, minimal_gateway_options(payment, false))
150
- record_log payment, response
151
-
152
- if response.success?
153
- payment.response_code = response.authorization
154
- payment.void
155
- else
156
- gateway_error(response)
157
- end
158
- rescue ActiveMerchant::ConnectionError => e
159
- gateway_error e
160
- end
161
-
162
- def credit(payment)
163
- payment_gateway = payment.payment_method
164
- check_environment(payment_gateway)
165
-
166
- amount = payment.credit_allowed >= payment.order.outstanding_balance.abs ? payment.order.outstanding_balance.abs : payment.credit_allowed.abs
167
- if payment_gateway.payment_profiles_supported?
168
- response = payment_gateway.credit((amount * 100).round, self, payment.response_code, minimal_gateway_options(payment, false))
169
- else
170
- response = payment_gateway.credit((amount * 100).round, payment.response_code, minimal_gateway_options(payment, false))
171
- end
172
-
173
- record_log payment, response
174
-
175
- if response.success?
176
- Payment.create({:order => payment.order,
177
- :source => payment,
178
- :payment_method => payment.payment_method,
179
- :amount => amount.abs * -1,
180
- :response_code => response.authorization,
181
- :state => 'completed'}, :without_protection => true)
182
- else
183
- gateway_error(response)
184
- end
185
- rescue ActiveMerchant::ConnectionError => e
186
- gateway_error e
187
- end
188
-
189
68
  def actions
190
69
  %w{capture void credit}
191
70
  end
@@ -197,7 +76,7 @@ module Spree
197
76
 
198
77
  # Indicates whether its possible to void the payment.
199
78
  def can_void?(payment)
200
- payment.state == 'void' ? false : true
79
+ payment.state != 'void'
201
80
  end
202
81
 
203
82
  # Indicates whether its possible to credit the payment. Note that most gateways require that the
@@ -212,64 +91,9 @@ module Spree
212
91
  gateway_customer_profile_id.present?
213
92
  end
214
93
 
215
- def record_log(payment, response)
216
- payment.log_entries.create({:details => response.to_yaml}, :without_protection => true)
217
- end
218
-
219
- def gateway_error(error)
220
- if error.is_a? ActiveMerchant::Billing::Response
221
- text = error.params['message'] || error.params['response_reason_text'] || error.message
222
- elsif error.is_a? ActiveMerchant::ConnectionError
223
- text = I18n.t(:unable_to_connect_to_gateway)
224
- else
225
- text = error.to_s
226
- end
227
- logger.error(I18n.t(:gateway_error))
228
- logger.error(" #{error.to_yaml}")
229
- raise Core::GatewayError.new(text)
230
- end
231
-
232
- def gateway_options(payment)
233
- options = { :billing_address => generate_address_hash(payment.order.bill_address),
234
- :shipping_address => generate_address_hash(payment.order.ship_address) }
235
- options.merge minimal_gateway_options(payment)
236
- end
237
-
238
- # Generates an ActiveMerchant compatible address hash from one of Spree's address objects
239
- def generate_address_hash(address)
240
- return {} if address.nil?
241
- { :name => address.full_name, :address1 => address.address1, :address2 => address.address2, :city => address.city,
242
- :state => address.state_text, :zip => address.zipcode, :country => address.country.iso, :phone => address.phone }
243
- end
244
-
245
- # Generates a minimal set of gateway options. There appears to be some issues with passing in
246
- # a billing address when authorizing/voiding a previously captured transaction. So omits these
247
- # options in this case since they aren't necessary.
248
- def minimal_gateway_options(payment, totals=true)
249
-
250
- options = { :email => payment.order.email,
251
- :customer => payment.order.email,
252
- :ip => payment.order.ip_address,
253
- :order_id => payment.order.number }
254
- if totals
255
- options.merge!({ :shipping => payment.order.ship_total * 100,
256
- :tax => payment.order.tax_total * 100,
257
- :subtotal => payment.order.item_total * 100 })
258
- end
259
- options
260
- end
261
-
262
94
  def spree_cc_type
263
95
  return 'visa' if Rails.env.development?
264
- self.cc_type
265
- end
266
-
267
- # Saftey check to make sure we're not accidentally performing operations on a live gateway.
268
- # Ex. When testing in staging environment with a copy of production data.
269
- def check_environment(gateway)
270
- return if gateway.environment == Rails.env
271
- message = I18n.t(:gateway_config_unavailable) + " - #{Rails.env}"
272
- raise Core::GatewayError.new(message)
96
+ cc_type
273
97
  end
274
98
  end
275
99
  end
@@ -1,7 +1,7 @@
1
1
  module Spree
2
2
  class Gateway::Bogus < Gateway
3
3
  TEST_VISA = '4111111111111111'
4
- TEST_MC = '5500000000000004'
4
+ TEST_MC = '5500000000000004'
5
5
  TEST_AMEX = '340000000000009'
6
6
  TEST_DISC = '6011000000000004'
7
7
 
@@ -6,6 +6,8 @@ module Spree
6
6
 
7
7
  preference :server, :string, :default => 'test'
8
8
  preference :test_mode, :boolean, :default => true
9
+
10
+ attr_accessible :preferred_server, :preferred_test_mode
9
11
 
10
12
  def payment_source_class
11
13
  Creditcard
@@ -25,7 +27,7 @@ module Spree
25
27
 
26
28
  def options
27
29
  options_hash = {}
28
- self.preferences.each do |key,value|
30
+ self.preferences.each do |key, value|
29
31
  options_hash[key.to_sym] = value
30
32
  end
31
33
  options_hash
@@ -106,12 +106,12 @@ module Spree
106
106
  end
107
107
 
108
108
  def update_order
109
- self.order.update!
109
+ order.update!
110
110
  end
111
111
 
112
112
  def restock_variant
113
- self.variant.on_hand = (self.variant.on_hand + 1)
114
- self.variant.save
113
+ variant.on_hand = (variant.on_hand + 1)
114
+ variant.save
115
115
  end
116
116
  end
117
117
  end
@@ -24,7 +24,7 @@ module Spree
24
24
  after_destroy :update_order
25
25
 
26
26
  def copy_price
27
- self.price = variant.price if variant && self.price.nil?
27
+ self.price = variant.price if variant && price.nil?
28
28
  end
29
29
 
30
30
  def increment_quantity
@@ -36,16 +36,16 @@ module Spree
36
36
  end
37
37
 
38
38
  def amount
39
- self.price * self.quantity
39
+ price * quantity
40
40
  end
41
41
  alias total amount
42
42
 
43
43
  def adjust_quantity
44
- self.quantity = 0 if self.quantity.nil? || self.quantity < 0
44
+ self.quantity = 0 if quantity.nil? || quantity < 0
45
45
  end
46
46
 
47
47
  def sufficient_stock?
48
- Spree::Config[:allow_backorders] ? true : (self.variant.on_hand >= self.quantity)
48
+ Spree::Config[:allow_backorders] ? true : (variant.on_hand >= quantity)
49
49
  end
50
50
 
51
51
  def insufficient_stock?
@@ -54,23 +54,23 @@ module Spree
54
54
 
55
55
  private
56
56
  def update_inventory
57
- return true unless self.order.completed?
57
+ return true unless order.completed?
58
58
 
59
- if self.new_record?
60
- InventoryUnit.increase(self.order, self.variant, self.quantity)
59
+ if new_record?
60
+ InventoryUnit.increase(order, variant, quantity)
61
61
  elsif old_quantity = self.changed_attributes['quantity']
62
- if old_quantity < self.quantity
63
- InventoryUnit.increase(self.order, self.variant, (self.quantity - old_quantity))
64
- elsif old_quantity > self.quantity
65
- InventoryUnit.decrease(self.order, self.variant, (old_quantity - self.quantity))
62
+ if old_quantity < quantity
63
+ InventoryUnit.increase(order, variant, (quantity - old_quantity))
64
+ elsif old_quantity > quantity
65
+ InventoryUnit.decrease(order, variant, (old_quantity - quantity))
66
66
  end
67
67
  end
68
68
  end
69
69
 
70
70
  def remove_inventory
71
- return true unless self.order.completed?
71
+ return true unless order.completed?
72
72
 
73
- InventoryUnit.decrease(self.order, self.variant, self.quantity)
73
+ InventoryUnit.decrease(order, variant, quantity)
74
74
  end
75
75
 
76
76
  def update_order
@@ -79,7 +79,7 @@ module Spree
79
79
  end
80
80
 
81
81
  def ensure_not_shipped
82
- if order.try(:inventory_units).to_a.any?{|unit| unit.variant_id == variant_id && unit.shipped?}
82
+ if order.try(:inventory_units).to_a.any?{ |unit| unit.variant_id == variant_id && unit.shipped? }
83
83
  errors.add :base, I18n.t('validation.cannot_destory_line_item_as_inventory_units_have_shipped')
84
84
  return false
85
85
  end