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
@@ -16,7 +16,12 @@ module Spree
16
16
  preference :mail_bcc, :string, :default => 'spree@example.com'
17
17
  preference :intercept_email, :string, :default => nil
18
18
 
19
- attr_accessible :environment, :preferred_enable_mail_delivery, :preferred_mails_from, :preferred_mail_bcc, :preferred_intercept_email, :preferred_mail_domain, :preferred_mail_host, :preferred_mail_port, :preferred_secure_connection_type, :preferred_mail_auth_type, :preferred_smtp_username, :preferred_smtp_password
19
+ attr_accessible :environment, :preferred_enable_mail_delivery,
20
+ :preferred_mails_from, :preferred_mail_bcc,
21
+ :preferred_intercept_email, :preferred_mail_domain,
22
+ :preferred_mail_host, :preferred_mail_port,
23
+ :preferred_secure_connection_type, :preferred_mail_auth_type,
24
+ :preferred_smtp_username, :preferred_smtp_password
20
25
 
21
26
  validates :environment, :presence => true
22
27
 
@@ -0,0 +1,179 @@
1
+ module Spree
2
+ class Payment < ActiveRecord::Base
3
+ module Processing
4
+ def process!
5
+ if payment_method && payment_method.source_required?
6
+ if source
7
+ if !processing?
8
+ if Spree::Config[:auto_capture]
9
+ purchase!
10
+ else
11
+ authorize!
12
+ end
13
+ end
14
+ else
15
+ raise Core::GatewayError.new(I18n.t(:payment_processing_failed))
16
+ end
17
+ end
18
+ end
19
+
20
+ def authorize!
21
+ started_processing!
22
+ gateway_action(source, :authorize, :pend)
23
+ end
24
+
25
+ def purchase!
26
+ started_processing!
27
+ gateway_action(source, :purchase, :complete)
28
+ end
29
+
30
+ def capture!
31
+ return unless pending?
32
+ protect_from_connection_error do
33
+ check_environment
34
+
35
+ if payment_method.payment_profiles_supported?
36
+ # Gateways supporting payment profiles will need access to creditcard object because this stores the payment profile information
37
+ # so supply the authorization itself as well as the creditcard, rather than just the authorization code
38
+ response = payment_method.capture(self, source, gateway_options)
39
+ else
40
+ # Standard ActiveMerchant capture usage
41
+ response = payment_method.capture((amount * 100).round,
42
+ response_code,
43
+ gateway_options)
44
+ end
45
+
46
+ handle_response(response, :complete, :failure)
47
+ end
48
+ end
49
+
50
+ def void_transaction!
51
+ protect_from_connection_error do
52
+ check_environment
53
+
54
+ response = payment_method.void(self.response_code, gateway_options)
55
+ record_response(response)
56
+
57
+ if response.success?
58
+ self.response_code = response.authorization
59
+ self.void
60
+ else
61
+ gateway_error(response)
62
+ end
63
+ end
64
+ end
65
+ end
66
+
67
+ def credit!(credit_amount=nil)
68
+ protect_from_connection_error do
69
+ check_environment
70
+
71
+ credit_amount ||= credit_allowed >= order.outstanding_balance.abs ? order.outstanding_balance.abs : credit_allowed.abs
72
+ credit_amount = credit_amount.to_f
73
+
74
+ if payment_method.payment_profiles_supported?
75
+ response = payment_method.credit((credit_amount * 100).round, source, response_code, gateway_options)
76
+ else
77
+ response = payment_method.credit((credit_amount * 100).round, response_code, gateway_options)
78
+ end
79
+
80
+ record_response(response)
81
+
82
+ if response.success?
83
+ self.class.create({ :order => order,
84
+ :source => self,
85
+ :payment_method => payment_method,
86
+ :amount => credit_amount.abs * -1,
87
+ :response_code => response.authorization,
88
+ :state => 'completed' }, :without_protection => true)
89
+ else
90
+ gateway_error(response)
91
+ end
92
+ end
93
+ end
94
+
95
+ def partial_credit(amount)
96
+ return if amount > credit_allowed
97
+ started_processing!
98
+ credit!(amount)
99
+ end
100
+
101
+ private
102
+
103
+ def gateway_action(source, action, success_state)
104
+ protect_from_connection_error do
105
+ check_environment
106
+
107
+ response = payment_method.send(action, (amount * 100).round,
108
+ source,
109
+ gateway_options)
110
+ handle_response(response, success_state, :failure)
111
+ end
112
+ end
113
+
114
+ def handle_response(response, success_state, failure_state)
115
+ record_response(response)
116
+
117
+ if response.success?
118
+ self.response_code = response.authorization
119
+ self.avs_response = response.avs_result['code']
120
+ self.send(success_state)
121
+ else
122
+ self.send("#{failure_state}!")
123
+ gateway_error(response)
124
+ end
125
+ end
126
+
127
+ def record_response(response)
128
+ log_entries.create({:details => response.to_yaml}, :without_protection => true)
129
+ end
130
+
131
+ def gateway_options
132
+ options = { :email => order.email,
133
+ :customer => order.email,
134
+ :ip => order.ip_address,
135
+ :order_id => order.number }
136
+
137
+ options.merge!({ :shipping => order.ship_total * 100,
138
+ :tax => order.tax_total * 100,
139
+ :subtotal => order.item_total * 100 })
140
+
141
+ options.merge({ :billing_address => order.bill_address.try(:active_merchant_hash),
142
+ :shipping_address => order.ship_address.try(:active_merchant_hash) })
143
+ end
144
+
145
+ def protect_from_connection_error
146
+ begin
147
+ yield
148
+ rescue ActiveMerchant::ConnectionError => e
149
+ gateway_error(e)
150
+ end
151
+ end
152
+
153
+ def record_log(response)
154
+ log_entries.create({:details => response.to_yaml}, :without_protection => true)
155
+ end
156
+
157
+ def gateway_error(error)
158
+ if error.is_a? ActiveMerchant::Billing::Response
159
+ text = error.params['message'] || error.params['response_reason_text'] || error.message
160
+ elsif error.is_a? ActiveMerchant::ConnectionError
161
+ text = I18n.t(:unable_to_connect_to_gateway)
162
+ else
163
+ text = error.to_s
164
+ end
165
+ logger.error(I18n.t(:gateway_error))
166
+ logger.error(" #{error.to_yaml}")
167
+ raise Core::GatewayError.new(text)
168
+ end
169
+
170
+ # Saftey check to make sure we're not accidentally performing operations on a live gateway.
171
+ # Ex. When testing in staging environment with a copy of production data.
172
+ def check_environment
173
+ return if payment_method.environment == Rails.env
174
+ message = I18n.t(:gateway_config_unavailable) + " - #{Rails.env}"
175
+ raise Core::GatewayError.new(message)
176
+ end
177
+
178
+ end
179
+ end
@@ -1,5 +1,6 @@
1
1
  module Spree
2
2
  class Payment < ActiveRecord::Base
3
+ include Spree::Payment::Processing
3
4
  belongs_to :order
4
5
  belongs_to :source, :polymorphic => true, :validate => true
5
6
  belongs_to :payment_method
@@ -27,11 +28,11 @@ module Spree
27
28
  state_machine :initial => 'checkout' do
28
29
  # With card payments, happens before purchase or authorization happens
29
30
  event :started_processing do
30
- transition :from => ['checkout', 'pending', 'completed'], :to => 'processing'
31
+ transition :from => ['checkout', 'pending', 'completed', 'processing'], :to => 'processing'
31
32
  end
32
33
  # When processing during checkout fails
33
34
  event :failure do
34
- transition :from => 'processing', :to => 'failed'
35
+ transition :from => ['processing', 'pending'], :to => 'failed'
35
36
  end
36
37
  # With card payments this represents authorizing the payment
37
38
  event :pend do
@@ -58,34 +59,14 @@ module Spree
58
59
  credit_allowed > 0
59
60
  end
60
61
 
61
- def credit(amount)
62
- return if amount > credit_allowed
63
- started_processing!
64
- source.credit(self, amount)
65
- end
66
-
67
62
  # see https://github.com/spree/spree/issues/981
68
63
  def build_source
69
64
  return if source_attributes.nil?
70
-
71
65
  if payment_method and payment_method.payment_source_class
72
66
  self.source = payment_method.payment_source_class.new(source_attributes)
73
67
  end
74
68
  end
75
69
 
76
- def process!
77
- if payment_method && payment_method.source_required?
78
- if source
79
- if !processing? && source.respond_to?(:process!)
80
- started_processing!
81
- source.process!(self) # source is responsible for updating the payment state when it's done processing
82
- end
83
- else
84
- raise Core::GatewayError.new(I18n.t(:payment_processing_failed))
85
- end
86
- end
87
- end
88
-
89
70
  def actions
90
71
  return [] unless payment_source and payment_source.respond_to? :actions
91
72
  payment_source.actions.select { |action| !payment_source.respond_to?("can_#{action}?") or payment_source.send("can_#{action}?", self) }
@@ -1,6 +1,6 @@
1
1
  module Spree
2
2
  class PaymentMethod < ActiveRecord::Base
3
- DISPLAY = [:both, :front_end, :back_end]
3
+ DISPLAY = [:both, :front_end, :back_end]
4
4
  default_scope where(:deleted_at => nil)
5
5
 
6
6
  scope :production, where(:environment => 'production')
@@ -22,7 +22,7 @@ module Spree
22
22
  raise 'You must implement payment_source_class method for this gateway.'
23
23
  end
24
24
 
25
- def self.available(display_on='both')
25
+ def self.available(display_on = 'both')
26
26
  all.select { |p| p.active && (p.display_on == display_on.to_s || p.display_on.blank?) && (p.environment == Rails.env || p.environment.blank?) }
27
27
  end
28
28
 
@@ -71,7 +71,8 @@ module Spree
71
71
  attr_accessible :name, :description, :available_on, :permalink, :meta_description,
72
72
  :meta_keywords, :price, :sku, :deleted_at, :prototype_id,
73
73
  :option_values_hash, :on_hand, :weight, :height, :width, :depth,
74
- :shipping_category_id, :tax_category_id
74
+ :shipping_category_id, :tax_category_id, :product_properties_attributes,
75
+ :variants_attributes
75
76
 
76
77
  attr_accessible :cost_price if Variant.table_exists? && Variant.column_names.include?('cost_price')
77
78
 
@@ -85,7 +86,7 @@ module Spree
85
86
  after_initialize :ensure_master
86
87
 
87
88
  def ensure_master
88
- return unless self.new_record?
89
+ return unless new_record?
89
90
  self.master ||= Variant.new
90
91
  end
91
92
 
@@ -132,8 +133,8 @@ module Spree
132
133
  def ensure_option_types_exist_for_values_hash
133
134
  return if option_values_hash.nil?
134
135
  option_values_hash.keys.map(&:to_i).each do |id|
135
- self.option_type_ids << id unless self.option_type_ids.include?(id)
136
- self.product_option_types.create({:option_type_id => id}, :without_protection => true) unless product_option_types.map(&:option_type_id).include?(id)
136
+ self.option_type_ids << id unless option_type_ids.include?(id)
137
+ product_option_types.create({:option_type_id => id}, :without_protection => true) unless product_option_types.map(&:option_type_id).include?(id)
137
138
  end
138
139
  end
139
140
 
@@ -141,12 +142,12 @@ module Spree
141
142
  # define "duplicate_extra" for site-specific actions, eg for additional fields
142
143
  def duplicate
143
144
  p = self.dup
144
- p.name = 'COPY OF ' + self.name
145
+ p.name = 'COPY OF ' + name
145
146
  p.deleted_at = nil
146
147
  p.created_at = p.updated_at = nil
147
- p.taxons = self.taxons
148
+ p.taxons = taxons
148
149
 
149
- p.product_properties = self.product_properties.map { |q| r = q.dup; r.created_at = r.updated_at = nil; r }
150
+ p.product_properties = product_properties.map { |q| r = q.dup; r.created_at = r.updated_at = nil; r }
150
151
 
151
152
  image_dup = lambda { |i| j = i.dup; j.attachment = i.attachment.clone; j }
152
153
 
@@ -157,7 +158,7 @@ module Spree
157
158
  p.master = variant
158
159
 
159
160
  # don't dup the actual variants, just the characterising types
160
- p.option_types = self.option_types if self.has_variants?
161
+ p.option_types = option_types if has_variants?
161
162
 
162
163
  # allow site to do some customization
163
164
  p.send(:duplicate_extra, self) if p.respond_to?(:duplicate_extra)
@@ -180,7 +181,7 @@ module Spree
180
181
  end
181
182
 
182
183
  def effective_tax_rate
183
- if self.tax_category
184
+ if tax_category
184
185
  tax_category.effective_amount
185
186
  else
186
187
  TaxRate.default
@@ -207,7 +208,7 @@ module Spree
207
208
  values = values.inject(values.shift) { |memo, value| memo.product(value).map(&:flatten) }
208
209
 
209
210
  values.each do |ids|
210
- variant = self.variants.create({:option_value_ids => ids, :price => self.master.price}, :without_protection => true)
211
+ variant = variants.create({ :option_value_ids => ids, :price => master.price }, :without_protection => true)
211
212
  end
212
213
  save
213
214
  end
@@ -6,6 +6,8 @@ module Spree
6
6
  validates :property, :presence => true
7
7
  validates_length_of :value, :maximum => 255
8
8
 
9
+ attr_accessible :property_name, :value
10
+
9
11
  # virtual attributes for use with AJAX completion stuff
10
12
  def property_name
11
13
  property.name if property
@@ -9,6 +9,8 @@ module Spree
9
9
  validates :amount, :numericality => true
10
10
  validate :must_have_shipped_units
11
11
 
12
+ attr_accessible :amount, :reason
13
+
12
14
  state_machine :initial => 'authorized' do
13
15
  after_transition :to => 'received', :do => :process_return
14
16
 
@@ -21,8 +23,8 @@ module Spree
21
23
  end
22
24
 
23
25
  def add_variant(variant_id, quantity)
24
- order_units = self.order.inventory_units.group_by(&:variant_id)
25
- returned_units = self.inventory_units.group_by(&:variant_id)
26
+ order_units = order.inventory_units.group_by(&:variant_id)
27
+ returned_units = inventory_units.group_by(&:variant_id)
26
28
 
27
29
  count = 0
28
30
 
@@ -44,7 +46,7 @@ module Spree
44
46
  end
45
47
  end
46
48
 
47
- self.order.authorize_return! if self.inventory_units.reload.size > 0 && !self.order.awaiting_return?
49
+ order.authorize_return! if inventory_units.reload.size > 0 && !order.awaiting_return?
48
50
  end
49
51
 
50
52
  private
@@ -53,7 +55,7 @@ module Spree
53
55
  end
54
56
 
55
57
  def generate_number
56
- return if self.number
58
+ return if number
57
59
 
58
60
  record = true
59
61
  while record
@@ -65,8 +67,8 @@ module Spree
65
67
 
66
68
  def process_return
67
69
  inventory_units.each &:return!
68
- credit = Adjustment.create(:source => self, :adjustable => order, :amount => self.amount.abs * -1, :label => I18n.t(:rma_credit))
69
- self.order.update!
70
+ credit = Adjustment.create(:source => self, :adjustable => order, :amount => amount.abs * -1, :label => I18n.t(:rma_credit))
71
+ order.update!
70
72
  end
71
73
 
72
74
  def allow_receive?
@@ -74,7 +76,7 @@ module Spree
74
76
  end
75
77
 
76
78
  def force_positive_amount
77
- self.amount = self.amount.abs
79
+ self.amount = amount.abs
78
80
  end
79
81
  end
80
82
  end
@@ -14,7 +14,8 @@ module Spree
14
14
 
15
15
  attr_accessor :special_instructions
16
16
 
17
- attr_accessible :order, :state, :shipping_method, :special_instructions, :shipping_method_id, :tracking
17
+ attr_accessible :order, :state, :shipping_method, :special_instructions,
18
+ :shipping_method_id, :tracking
18
19
 
19
20
  accepts_nested_attributes_for :address
20
21
  accepts_nested_attributes_for :inventory_units
@@ -29,9 +30,9 @@ module Spree
29
30
  scope :pending, where(:state => 'pending')
30
31
 
31
32
  def to_param
32
- self.number if self.number
33
- generate_shipment_number unless self.number
34
- self.number.to_s.to_url.upcase
33
+ number if number
34
+ generate_shipment_number unless number
35
+ number.to_s.to_url.upcase
35
36
  end
36
37
 
37
38
  def shipped=(value)
@@ -83,7 +84,7 @@ module Spree
83
84
  # Order object. This is necessary because the association actually has a stale (and unsaved) copy of the Order and so it will not
84
85
  # yield the correct results.
85
86
  def update!(order)
86
- old_state = self.state
87
+ old_state = state
87
88
  new_state = determine_state(order)
88
89
  update_attribute_without_callbacks 'state', determine_state(order)
89
90
  after_ship if new_state == 'shipped' and old_state != 'shipped'
@@ -91,7 +92,7 @@ module Spree
91
92
 
92
93
  private
93
94
  def generate_shipment_number
94
- return self.number unless self.number.blank?
95
+ return number unless number.blank?
95
96
  record = true
96
97
  while record
97
98
  random = "H#{Array.new(11){rand(9)}.join}"
@@ -1,22 +1,23 @@
1
1
  module Spree
2
2
  class ShippingMethod < ActiveRecord::Base
3
- DISPLAY = [:both, :front_end, :back_end]
3
+ DISPLAY = [:both, :front_end, :back_end]
4
4
  belongs_to :zone
5
5
  has_many :shipments
6
6
  validates :name, :calculator, :zone, :presence => true
7
7
  belongs_to :shipping_category
8
8
 
9
- attr_accessible :name, :zone_id, :display_on, :shipping_category_id, :match_none, :match_one, :match_all, :calculator_type
9
+ attr_accessible :name, :zone_id, :display_on, :shipping_category_id,
10
+ :match_none, :match_one, :match_all, :calculator_type
10
11
 
11
12
  calculated_adjustments
12
13
 
13
- def available?(order, display_on=nil)
14
+ def available?(order, display_on = nil)
14
15
  display_check = (self.display_on == display_on.to_s || self.display_on.blank?)
15
16
  calculator_check = calculator.available?(order)
16
17
  display_check && calculator_check
17
18
  end
18
19
 
19
- def available_to_order?(order, display_on=nil)
20
+ def available_to_order?(order, display_on = nil)
20
21
  availability_check = available?(order,display_on)
21
22
  zone_check = zone && zone.include?(order.ship_address)
22
23
  category_check = category_match?(order)
@@ -37,7 +38,7 @@ module Spree
37
38
  end
38
39
  end
39
40
 
40
- def self.all_available(order, display_on=nil)
41
+ def self.all_available(order, display_on = nil)
41
42
  all.select { |method| method.available_to_order?(order,display_on) }
42
43
  end
43
44
  end
@@ -1,7 +1,7 @@
1
1
  module Spree
2
2
  class ShippingRate < Struct.new(:id, :shipping_method, :name, :cost)
3
- def initialize(attributes={})
4
- attributes.each do |k,v|
3
+ def initialize(attributes = {})
4
+ attributes.each do |k, v|
5
5
  self.send("#{k}=", v)
6
6
  end
7
7
  end
@@ -8,7 +8,7 @@ module Spree
8
8
  validates :country, :name, :presence => true
9
9
 
10
10
  def self.find_all_by_name_or_abbr(name_or_abbr)
11
- where("name = ? OR abbr = ?", name_or_abbr, name_or_abbr)
11
+ where('name = ? OR abbr = ?', name_or_abbr, name_or_abbr)
12
12
  end
13
13
 
14
14
  # table of { country.id => [ state.id , state.name ] }, arrays sorted by name
@@ -14,13 +14,13 @@ module Spree
14
14
  #set existing default tax category to false if this one has been marked as default
15
15
 
16
16
  if is_default && tax_category = self.class.where(:is_default => true).first
17
- tax_category.update_attribute(:is_default, false)
17
+ tax_category.update_attribute(:is_default, false) unless tax_category == self
18
18
  end
19
19
  end
20
20
 
21
21
  def mark_deleted!
22
22
  self.deleted_at = Time.now
23
- self.save
23
+ save
24
24
  end
25
25
  end
26
26
  end
@@ -20,7 +20,7 @@ module Spree
20
20
  calculated_adjustments
21
21
  scope :by_zone, lambda { |zone| where(:zone_id => zone) }
22
22
 
23
- attr_accessible :amount, :tax_category_id, :calculator
23
+ attr_accessible :amount, :tax_category_id, :calculator, :zone_id, :included_in_price
24
24
 
25
25
  # Gets the array of TaxRates appropriate for the specified order
26
26
  def self.match(order)
@@ -46,17 +46,17 @@ module Spree
46
46
  # Creates necessary tax adjustments for the order.
47
47
  def adjust(order)
48
48
  label = "#{tax_category.name} #{amount * 100}%"
49
- if self.included_in_price
49
+ if included_in_price
50
50
  if Zone.default_tax.contains? order.tax_zone
51
51
  order.line_items.each { |line_item| create_adjustment(label, line_item, line_item) }
52
52
  else
53
53
  amount = -1 * calculator.compute(order)
54
54
  label = I18n.t(:refund) + label
55
- order.adjustments.create({:amount => amount,
56
- :source => order,
57
- :originator => self,
58
- :locked => true,
59
- :label => label}, :without_protection => true)
55
+ order.adjustments.create({ :amount => amount,
56
+ :source => order,
57
+ :originator => self,
58
+ :locked => true,
59
+ :label => label }, :without_protection => true)
60
60
  end
61
61
  else
62
62
  create_adjustment(label, order, order)
@@ -6,7 +6,7 @@ module Spree
6
6
  has_and_belongs_to_many :products, :join_table => 'spree_products_taxons'
7
7
  before_create :set_permalink
8
8
 
9
- attr_accessible :name, :parent_id, :position
9
+ attr_accessible :name, :parent_id, :position, :description, :permalink
10
10
 
11
11
  validates :name, :presence => true
12
12
  has_attached_file :icon,
@@ -33,15 +33,15 @@ module Spree
33
33
  # Creates permalink based on Stringex's .to_url method
34
34
  def set_permalink
35
35
  if parent_id.nil?
36
- self.permalink = name.to_url if self.permalink.blank?
36
+ self.permalink = name.to_url if permalink.blank?
37
37
  else
38
38
  parent_taxon = Taxon.find(parent_id)
39
- self.permalink = [parent_taxon.permalink, (self.permalink.blank? ? name.to_url : self.permalink.split('/').last)].join('/')
39
+ self.permalink = [parent_taxon.permalink, (permalink.blank? ? name.to_url : permalink.split('/').last)].join('/')
40
40
  end
41
41
  end
42
42
 
43
43
  def active_products
44
- scope = self.products.active
44
+ scope = products.active
45
45
  scope = scope.on_hand unless Spree::Config[:show_zero_stock_products]
46
46
  scope
47
47
  end
@@ -12,10 +12,10 @@ module Spree
12
12
 
13
13
  private
14
14
  def set_name
15
- if self.root
16
- self.root.update_attribute(:name, self.name)
15
+ if root
16
+ root.update_attribute(:name, name)
17
17
  else
18
- self.root = Taxon.create!({ :taxonomy_id => self.id, :name => self.name }, :without_protection => true)
18
+ self.root = Taxon.create!({ :taxonomy_id => id, :name => name }, :without_protection => true)
19
19
  end
20
20
  end
21
21