spree_core 0.30.2 → 0.40.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (104) hide show
  1. data/app/controllers/admin/base_controller.rb +0 -31
  2. data/app/controllers/admin/orders_controller.rb +10 -9
  3. data/app/controllers/admin/overview_controller.rb +1 -1
  4. data/app/controllers/admin/products_controller.rb +8 -8
  5. data/app/controllers/admin/properties_controller.rb +1 -1
  6. data/app/controllers/admin/shipments_controller.rb +6 -3
  7. data/app/controllers/admin/shipping_methods_controller.rb +1 -1
  8. data/app/controllers/admin/tax_rates_controller.rb +2 -2
  9. data/app/controllers/admin/taxons_controller.rb +1 -2
  10. data/app/controllers/admin/users_controller.rb +7 -8
  11. data/app/controllers/admin/variants_controller.rb +2 -2
  12. data/app/controllers/countries_controller.rb +1 -1
  13. data/app/controllers/locale_controller.rb +1 -1
  14. data/app/controllers/spree/base_controller.rb +1 -117
  15. data/app/controllers/states_controller.rb +1 -1
  16. data/app/helpers/spree/base_helper.rb +1 -7
  17. data/app/helpers/taxons_helper.rb +2 -2
  18. data/app/models/app_configuration.rb +0 -3
  19. data/app/models/calculator/flat_percent_item_total.rb +2 -1
  20. data/app/models/calculator/vat.rb +1 -1
  21. data/app/models/creditcard.rb +1 -1
  22. data/app/models/gateway/authorize_net.rb +13 -2
  23. data/app/models/gateway/authorize_net_cim.rb +11 -0
  24. data/app/models/gateway/beanstream.rb +30 -7
  25. data/app/models/inventory_unit.rb +21 -31
  26. data/app/models/line_item.rb +7 -8
  27. data/app/models/order.rb +4 -1
  28. data/app/models/product_group.rb +4 -8
  29. data/app/models/property.rb +1 -3
  30. data/app/models/return_authorization.rb +6 -1
  31. data/app/models/state_event.rb +3 -3
  32. data/app/models/state_monitor.rb +16 -16
  33. data/app/models/taxon.rb +6 -7
  34. data/app/models/user.rb +4 -0
  35. data/app/views/admin/general_settings/edit.html.erb +0 -8
  36. data/app/views/admin/general_settings/show.html.erb +5 -10
  37. data/app/views/admin/images/_form.html.erb +1 -1
  38. data/app/views/admin/images/index.html.erb +1 -1
  39. data/app/views/admin/option_types/new.html.erb +1 -1
  40. data/app/views/admin/orders/_add_product.html.erb +3 -3
  41. data/app/views/admin/orders/_form.html.erb +3 -0
  42. data/app/views/admin/orders/_user_form.html.erb +1 -1
  43. data/app/views/admin/orders/index.html.erb +2 -2
  44. data/app/views/admin/orders/show.html.erb +3 -8
  45. data/app/views/admin/orders/user.html.erb +1 -1
  46. data/app/views/admin/product_groups/index.html.erb +1 -1
  47. data/app/views/admin/product_groups/show.html.erb +1 -1
  48. data/app/views/admin/products/index.html.erb +1 -1
  49. data/app/views/admin/return_authorizations/_form.html.erb +3 -1
  50. data/app/views/admin/shared/_address_form.html.erb +1 -1
  51. data/app/views/admin/shared/_configuration_menu.html.erb +11 -11
  52. data/app/views/admin/shared/_order_tabs.html.erb +12 -12
  53. data/app/views/admin/shared/_product_tabs.html.erb +6 -6
  54. data/app/views/admin/states/_state_list.html.erb +2 -2
  55. data/app/views/admin/taxonomies/_js_head.html.erb +6 -8
  56. data/app/views/admin/taxonomies/edit.html.erb +11 -11
  57. data/app/views/admin/taxonomies/get_children.json.erb +5 -5
  58. data/app/views/admin/taxons/available.js.erb +10 -10
  59. data/app/views/admin/taxons/selected.html.erb +13 -13
  60. data/app/views/admin/variants/index.html.erb +1 -1
  61. data/app/views/checkout/_address.html.erb +2 -2
  62. data/app/views/layouts/admin.html.erb +1 -2
  63. data/app/views/layouts/spree_application.html.erb +1 -2
  64. data/app/views/shared/_admin_head.html.erb +3 -3
  65. data/app/views/shared/_doc_and_xmlns.html.erb +2 -0
  66. data/app/views/shared/_filters.html.erb +3 -28
  67. data/app/views/taxons/show.html.erb +7 -5
  68. data/config/initializers/spree.rb +1 -19
  69. data/config/locales/en.yml +0 -2
  70. data/config/routes.rb +3 -5
  71. data/db/migrate/20091007134354_change_taxons_to_nested_set.rb +2 -2
  72. data/lib/product_filters.rb +10 -11
  73. data/lib/scopes/product.rb +15 -0
  74. data/lib/spree/mail_settings.rb +2 -4
  75. data/lib/spree/preference_access.rb +3 -3
  76. data/lib/spree_base.rb +116 -0
  77. data/lib/spree_core.rb +3 -1
  78. data/lib/spree_core/preferences/model_hooks.rb +1 -1
  79. data/lib/tasks/install.rake +0 -1
  80. data/public/javascripts/admin.js +0 -6
  81. data/public/javascripts/admin/checkouts/edit.js +41 -40
  82. data/public/javascripts/admin/orders/edit_form.js +5 -4
  83. data/public/javascripts/jquery.cookie.js +96 -0
  84. data/public/javascripts/jquery.delayedobserver.js +35 -0
  85. data/public/javascripts/jsTree/jquery.jstree.js +3510 -0
  86. data/public/javascripts/jsTree/themes/apple/d.png +0 -0
  87. data/public/javascripts/jsTree/themes/apple/style.css +60 -34
  88. data/public/javascripts/jsTree/themes/apple/throbber.gif +0 -0
  89. data/public/javascripts/taxonomy.js +150 -149
  90. data/public/stylesheets/admin/admin.css +0 -34
  91. metadata +36 -43
  92. data/app/controllers/password_resets_controller.rb +0 -48
  93. data/app/helpers/users_helper.rb +0 -13
  94. data/app/models/spree/alert.rb +0 -13
  95. data/app/views/admin/shared/_alert.html.erb +0 -6
  96. data/app/views/shared/_login.html.erb +0 -21
  97. data/app/views/shared/_user_form.html.erb +0 -17
  98. data/lib/spree/i18n_utils.rb +0 -47
  99. data/public/javascripts/jquery.js +0 -19
  100. data/public/javascripts/jrails.autocomplete.js +0 -274
  101. data/public/javascripts/jrails.js +0 -1
  102. data/public/javascripts/jsTree/jquery.tree.js +0 -2058
  103. data/public/javascripts/jsTree/plugins/jquery.tree.contextmenu.js +0 -129
  104. data/public/javascripts/jsTree/themes/apple/icons.png +0 -0
@@ -1,8 +1,6 @@
1
1
  class Admin::BaseController < Spree::BaseController
2
2
  ssl_required
3
3
 
4
- before_filter :check_alerts if Rails.env.production?
5
-
6
4
  helper :search
7
5
  helper 'admin/navigation'
8
6
  layout 'admin'
@@ -10,35 +8,6 @@ class Admin::BaseController < Spree::BaseController
10
8
  before_filter :parse_date_params
11
9
 
12
10
  protected
13
- def check_alerts
14
- return unless current_user and should_check_alerts?
15
-
16
- unless session.has_key? :alerts
17
- begin
18
- session[:alerts] = Spree::Alert.current(request.host)
19
- filter_dismissed_alerts
20
- Spree::Config.set :last_check_for_spree_alerts => DateTime.now.to_s
21
- rescue
22
- session[:alerts] = nil
23
- end
24
- end
25
- end
26
-
27
- def should_check_alerts?
28
- return false if not Spree::Config[:check_for_spree_alerts]
29
-
30
- last_check = Spree::Config[:last_check_for_spree_alerts]
31
- return true if last_check.blank?
32
-
33
- DateTime.parse(last_check) < 12.hours.ago
34
- end
35
-
36
- def filter_dismissed_alerts
37
- return unless session[:alerts]
38
- dismissed = (Spree::Config[:dismissed_spree_alerts] || '').split(',')
39
- session[:alerts].reject! { |a| dismissed.include? a.id.to_s }
40
- end
41
-
42
11
  def render_js_for_destroy
43
12
  render :partial => "/admin/shared/destroy"
44
13
  flash.notice = nil
@@ -12,7 +12,7 @@ class Admin::OrdersController < Admin::BaseController
12
12
  if !@order.line_items.empty?
13
13
  unless @order.complete?
14
14
 
15
- if params[:order].key?(:use_billing)
15
+ if params[:order].key?(:email)
16
16
  @order.shipping_method = @order.available_shipping_methods(:front_end).first
17
17
  @order.create_shipment!
18
18
  redirect_to edit_admin_order_shipment_path(@order, @order.shipment)
@@ -37,10 +37,11 @@ class Admin::OrdersController < Admin::BaseController
37
37
  # TODO - possible security check here but right now any admin can before any transition (and the state machine
38
38
  # itself will make sure transitions are not applied in the wrong state)
39
39
  event = params[:e]
40
- Order.transaction do
41
- @order.send("#{event}!")
40
+ if @order.send("#{event}")
41
+ flash.notice = t('order_updated')
42
+ else
43
+ flash[:error] = t('cannot_perform_operation')
42
44
  end
43
- flash.notice = t('order_updated')
44
45
  rescue Spree::GatewayError => ge
45
46
  flash[:error] = "#{ge.message}"
46
47
  ensure
@@ -76,15 +77,15 @@ class Admin::OrdersController < Admin::BaseController
76
77
  params[:search][:completed_at_not_null] = "1"
77
78
  end
78
79
 
79
- if !params[:search][:created_at_greater_than].blank?
80
- params[:search][:created_at_greater_than] = Time.zone.parse(params[:search][:created_at_greater_than]).beginning_of_day rescue ""
80
+ if !params[:search][:completed_at_greater_than].blank?
81
+ params[:search][:completed_at_greater_than] = Time.zone.parse(params[:search][:completed_at_greater_than]).beginning_of_day rescue ""
81
82
  end
82
83
 
83
- if !params[:search][:created_at_less_than].blank?
84
- params[:search][:created_at_less_than] = Time.zone.parse(params[:search][:created_at_less_than]).end_of_day rescue ""
84
+ if !params[:search][:completed_at_less_than].blank?
85
+ params[:search][:completed_at_less_than] = Time.zone.parse(params[:search][:completed_at_less_than]).end_of_day rescue ""
85
86
  end
86
87
 
87
- params[:search][:order] ||= "descend_by_created_at"
88
+ params[:search][:order] ||= "descend_by_completed_at"
88
89
  @search = Order.searchlogic(params[:search])
89
90
 
90
91
  # QUERY - get per_page from form ever??? maybe push into model
@@ -4,7 +4,7 @@ class Admin::OverviewController < Admin::BaseController
4
4
  #todo, add rss feed of information that is happening
5
5
 
6
6
  def index
7
- @users = User.find(:all)
7
+ @users = User.all
8
8
  #@users = User.find_with_deleted(:all, :order => 'updated_at desc')
9
9
  # going to list today's orders, yesterday's orders, older orders
10
10
  # have a filter / search at the top
@@ -73,32 +73,32 @@ class Admin::ProductsController < Admin::BaseController
73
73
  end
74
74
 
75
75
  def load_data
76
- @tax_categories = TaxCategory.find(:all, :order=>"name")
77
- @shipping_categories = ShippingCategory.find(:all, :order=>"name")
76
+ @tax_categories = TaxCategory.order(:name)
77
+ @shipping_categories = ShippingCategory.order(:name)
78
78
  end
79
79
 
80
80
  def collection
81
81
  return @collection if @collection.present?
82
- base_scope = end_of_association_chain
82
+ scopes = ['group_by_products_id']
83
83
 
84
84
  unless request.xhr?
85
85
  # Note: the SL scopes are on/off switches, so we need to select "not_deleted" explicitly if the switch is off
86
86
  # QUERY - better as named scope or as SL scope?
87
87
  if params[:search].nil? || params[:search][:deleted_at_not_null].blank?
88
- base_scope = base_scope.not_deleted
88
+ scopes << 'not_deleted'
89
89
  end
90
90
 
91
- @search = base_scope.group_by_products_id.searchlogic(params[:search])
91
+ @search = end_of_association_chain.searchlogic(params[:search] ? params[:search].except(:deleted_at_not_null) : nil)
92
92
  @search.order ||= "ascend_by_name"
93
93
 
94
- @collection = @search.do_search.paginate(:include => {:variants => [:images, :option_values]},
94
+ @collection = @search.do_search.instance_eval(scopes.join(".")).paginate(:include => {:variants => [:images, :option_values]},
95
95
  :per_page => Spree::Config[:admin_products_per_page],
96
96
  :page => params[:page])
97
97
  else
98
98
  includes = [{:variants => [:images, {:option_values => :option_type}]}, :master, :images]
99
99
 
100
- @collection = base_scope.where(["name LIKE ?", "%#{params[:q]}%"]).includes(includes).limit(params[:limit] || 10)
101
- @collection.concat base_scope.where(["variants.sku LIKE ?", "%#{params[:q]}%"]).includes(:variants_including_master).limit(params[:limit] || 10)
100
+ @collection = end_of_association_chain.where(["name LIKE ?", "%#{params[:q]}%"]).includes(includes).limit(params[:limit] || 10)
101
+ @collection.concat end_of_association_chain.where(["variants.sku LIKE ?", "%#{params[:q]}%"]).includes(:variants_including_master).limit(params[:limit] || 10)
102
102
 
103
103
  @collection.uniq
104
104
  end
@@ -5,7 +5,7 @@ class Admin::PropertiesController < Admin::BaseController
5
5
  belongs_to :product
6
6
 
7
7
  def filtered
8
- @properties = Property.find(:all, :conditions => ['lower(name) LIKE ?', "%#{params[:q].downcase}%"], :order => :name)
8
+ @properties = Property.where('lower(name) LIKE ?', "%#{params[:q].downcase}%").order(:name)
9
9
  render :template => "admin/properties/filtered.html.erb", :layout => false
10
10
  end
11
11
 
@@ -26,8 +26,11 @@ class Admin::ShipmentsController < Admin::BaseController
26
26
  destroy.success.wants.js { render_js_for_destroy }
27
27
 
28
28
  def fire
29
- @shipment.send("#{params[:e]}!")
30
- flash.notice = t('shipment_updated')
29
+ if @shipment.send("#{params[:e]}")
30
+ flash.notice = t('shipment_updated')
31
+ else
32
+ flash[:error] = t('cannot_perform_operation')
33
+ end
31
34
  redirect_to :back
32
35
  end
33
36
 
@@ -48,7 +51,7 @@ class Admin::ShipmentsController < Admin::BaseController
48
51
  @shipping_methods = ShippingMethod.all_available(@order, :back_end)
49
52
 
50
53
  @states = State.find_all_by_country_id(@selected_country_id, :order => 'name')
51
- @countries = available_countries
54
+ @countries = Country.all
52
55
  end
53
56
 
54
57
  def edit_before # copy into instance variable before editing
@@ -14,7 +14,7 @@ class Admin::ShippingMethodsController < Admin::BaseController
14
14
  end
15
15
 
16
16
  def load_data
17
- @available_zones = Zone.find :all, :order => :name
17
+ @available_zones = Zone.order(:name)
18
18
  @calculators = ShippingMethod.calculators
19
19
  @calculators.sort_by(&:name)
20
20
  end
@@ -17,8 +17,8 @@ class Admin::TaxRatesController < Admin::BaseController
17
17
  @object
18
18
  end
19
19
  def load_data
20
- @available_zones = Zone.find :all, :order => :name
21
- @available_categories = TaxCategory.find :all, :order => :name
20
+ @available_zones = Zone.order(:name)
21
+ @available_categories = TaxCategory.order(:name)
22
22
  @calculators = TaxRate.calculators
23
23
  end
24
24
 
@@ -24,11 +24,10 @@ class Admin::TaxonsController < Admin::BaseController
24
24
  if params[:q].blank?
25
25
  @available_taxons = []
26
26
  else
27
- @available_taxons = Taxon.find(:all, :conditions => ['lower(name) LIKE ?', "%#{params[:q].downcase}%"])
27
+ @available_taxons = Taxon.where('lower(name) LIKE ?', "%#{params[:q].downcase}%")
28
28
  end
29
29
  @available_taxons.delete_if { |taxon| @product.taxons.include?(taxon) }
30
30
  respond_to do |format|
31
- format.html
32
31
  format.js {render :layout => false}
33
32
  end
34
33
 
@@ -40,14 +40,13 @@ class Admin::UsersController < Admin::BaseController
40
40
 
41
41
  #scope = scope.conditions "lower(email) = ?", @filter.email.downcase unless @filter.email.blank?
42
42
  else
43
- @collection = User.find(:all, :include => [
44
- {:bill_address => [:state, :country]},
45
- {:ship_address => [:state, :country]}],
46
- :conditions => ["users.email like :search
47
- OR addresses.firstname like :search
48
- OR addresses.lastname like :search
49
- OR ship_addresses_users.firstname like :search
50
- OR ship_addresses_users.lastname like :search", {:search => "#{params[:q].strip}%"}], :limit => (params[:limit] || 100))
43
+ @collection = User.includes(:bill_address => [:state, :country],
44
+ :ship_address => [:state, :country]).where("users.email like :search
45
+ OR addresses.firstname like :search
46
+ OR addresses.lastname like :search
47
+ OR ship_addresses_users.firstname like :search
48
+ OR ship_addresses_users.lastname like :search",
49
+ {:search => "#{params[:q].strip}%"}).limit(params[:limit] || 100)
51
50
  end
52
51
  end
53
52
 
@@ -47,9 +47,9 @@ class Admin::VariantsController < Admin::BaseController
47
47
  @deleted = (params.key?(:deleted) && params[:deleted] == "on") ? "checked" : ""
48
48
 
49
49
  if @deleted.blank?
50
- @collection ||= end_of_association_chain.active.find(:all)
50
+ @collection ||= end_of_association_chain.active.all
51
51
  else
52
- @collection ||= end_of_association_chain.deleted.find(:all)
52
+ @collection ||= end_of_association_chain.deleted.all
53
53
  end
54
54
  end
55
55
  end
@@ -4,7 +4,7 @@ class CountriesController < Spree::BaseController
4
4
  index.response do |wants|
5
5
  wants.html
6
6
  wants.js do
7
- @countries = Country.find(:all, :conditions => ['lower(name) LIKE ?', "%#{params[:q].downcase}%"])
7
+ @countries = Country.where('lower(name) LIKE ?', "%#{params[:q].downcase}%")
8
8
  end
9
9
  end
10
10
 
@@ -1,7 +1,7 @@
1
1
  class LocaleController < Spree::BaseController
2
2
  def set
3
3
  if request.referer && request.referer.starts_with?("http://" + request.host)
4
- session[:return_to] = request.referer
4
+ session["user_return_to"] = request.referer
5
5
  end
6
6
  if params[:locale] && I18n.available_locales.include?(params[:locale].to_sym)
7
7
  session[:locale] = I18n.locale = params[:locale].to_sym
@@ -1,119 +1,3 @@
1
1
  class Spree::BaseController < ActionController::Base
2
- layout 'spree_application'
3
- helper :hook
4
- before_filter :instantiate_controller_and_action_names
5
- #RAILS 3 TODO
6
- #before_filter :touch_sti_subclasses
7
- before_filter :set_user_language
8
- helper_method :title, :title=, :get_taxonomies, :current_gateway
9
-
10
- protect_from_forgery # See ActionController::RequestForgeryProtection for details
11
-
12
- include SslRequirement
13
- include Spree::CurrentOrder
14
-
15
- def access_forbidden
16
- render :text => 'Access Forbidden', :layout => true, :status => 401
17
- end
18
-
19
- # can be used in views as well as controllers.
20
- # e.g. <% title = 'This is a custom title for this view' %>
21
- def title=(title)
22
- @title = title
23
- end
24
-
25
- def title
26
- title_string = @title.blank? ? accurate_title : @title
27
- if title_string.blank?
28
- default_title
29
- else
30
- if Spree::Config[:always_put_site_name_in_title]
31
- [default_title, title_string].join(' - ')
32
- else
33
- title_string
34
- end
35
- end
36
- end
37
-
38
- protected
39
-
40
- helper_method :current_order
41
-
42
-
43
- def default_title
44
- Spree::Config[:site_name]
45
- end
46
-
47
- def accurate_title
48
- return nil
49
- end
50
-
51
- # def reject_unknown_object
52
- # # workaround to catch problems with loading errors for permalink ids (reconsider RC permalink hack elsewhere?)
53
- # begin
54
- # load_object
55
- # rescue Exception => e
56
- # @object = nil
57
- # end
58
- # the_object = instance_variable_get "@#{object_name}"
59
- # the_object = nil if (the_object.respond_to?(:deleted?) && the_object.deleted?)
60
- # unless params[:id].blank? || the_object
61
- # if self.respond_to? :object_missing
62
- # self.object_missing(params[:id])
63
- # else
64
- # render_404(Exception.new("missing object in #{self.class.to_s}"))
65
- # end
66
- # end
67
- # true
68
- # end
69
-
70
- def render_404(exception=nil)
71
- respond_to do |type|
72
- type.html { render :status => :not_found, :file => "#{Rails.root}/public/404.html", :layout=>nil}
73
- type.all { render :status => :not_found, :nothing => true }
74
- end
75
- end
76
-
77
- private
78
-
79
- def redirect_back_or_default(default)
80
- redirect_to(session[:return_to] || default)
81
- session[:return_to] = nil
82
- end
83
-
84
- def instantiate_controller_and_action_names
85
- @current_action = action_name
86
- @current_controller = controller_name
87
- end
88
-
89
- def get_taxonomies
90
- @taxonomies ||= Taxonomy.find(:all, :include => {:root => :children})
91
- @taxonomies.reject { |t| t.root.nil? }
92
- end
93
-
94
- def current_gateway
95
- @current_gateway ||= Gateway.current
96
- end
97
-
98
- #RAILS 3 TODO
99
- # # Load all models using STI to fix associations such as @order.credits giving no results and resulting in incorrect order totals
100
- # def touch_sti_subclasses
101
- # if Rails.env == 'development'
102
- # load(File.join(SPREE_ROOT,'config/initializers/touch.rb'))
103
- # end
104
- # end
105
-
106
- def set_user_language
107
- locale = session[:locale] || Spree::Config[:default_locale]
108
- locale = I18n.default_locale unless I18n.available_locales.include?(locale.to_sym)
109
- I18n.locale = locale.to_sym
110
- end
111
-
112
- helper_method :available_countries
113
-
114
- def available_countries
115
- return Country.all unless zone = Zone.find_by_name(Spree::Config[:checkout_zone])
116
- zone.country_list
117
- end
118
-
2
+ include SpreeBase
119
3
  end
@@ -8,7 +8,7 @@ class StatesController < Spree::BaseController
8
8
  # we return ALL known information, since billing country isn't restricted
9
9
  # by shipping country
10
10
  @state_info = Hash.new {|h, k| h[k] = []}
11
- State.find(:all, :order => "name ASC").each{|state|
11
+ State.order("name ASC").each{|state|
12
12
  @state_info[state.country_id.to_s].push [state.id, state.name]
13
13
  }
14
14
  end
@@ -68,13 +68,7 @@ module Spree::BaseHelper
68
68
  end
69
69
 
70
70
  def stylesheet_tags(paths=stylesheet_paths)
71
- output = ''
72
- if !paths.blank?
73
- paths.each do |path|
74
- output << stylesheet_link_tag(path)
75
- end
76
- end
77
- return output
71
+ paths.blank? ? '' : stylesheet_link_tag(paths, :cache => true)
78
72
  end
79
73
 
80
74
  def stylesheet_paths
@@ -19,11 +19,11 @@ module TaxonsHelper
19
19
  # that we can use configurations as well as make it easier for end users to override this determination. One idea is
20
20
  # to show the most popular products for a particular taxon (that is an exercise left to the developer.)
21
21
  def taxon_preview(taxon, max=5)
22
- products = taxon.products.active.find(:all, :limit => max)
22
+ products = taxon.products.active.limit(max)
23
23
  if (products.size < max) && Spree::Config[:show_descendents]
24
24
  taxon.descendants.each do |taxon|
25
25
  to_get = max - products.length
26
- products += taxon.products.active.find(:all, :limit => to_get)
26
+ products += taxon.products.active.limit(to_get)
27
27
  break if products.size >= max
28
28
  end
29
29
  end
@@ -35,9 +35,6 @@ class AppConfiguration < Configuration
35
35
  preference :cache_static_content, :boolean, :default => true
36
36
  preference :use_content_controller, :boolean, :default => true
37
37
  preference :allow_checkout_on_gateway_error, :boolean, :default => false
38
- preference :check_for_spree_alerts, :boolean, :default => true
39
- preference :dismissed_spree_alerts, :string, :default => ''
40
- preference :last_check_for_spree_alerts, :string, :default => nil
41
38
 
42
39
  validates :name, :presence => true, :uniqueness => true
43
40
 
@@ -13,6 +13,7 @@ class Calculator::FlatPercentItemTotal < Calculator
13
13
  def compute(object)
14
14
  return unless object.present? and object.line_items.present?
15
15
  item_total = object.line_items.map(&:amount).sum
16
- item_total * self.preferred_flat_percent / 100.0
16
+ value = item_total * self.preferred_flat_percent / 100.0
17
+ (value * 100).round.to_f / 100
17
18
  end
18
19
  end