spree_core 2.2.14 → 2.3.0

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 (172) hide show
  1. checksums.yaml +4 -4
  2. data/app/assets/javascripts/{spree.js.coffee → spree.js.coffee.erb} +11 -2
  3. data/app/controllers/spree/base_controller.rb +1 -0
  4. data/app/helpers/spree/base_helper.rb +5 -6
  5. data/app/helpers/spree/orders_helper.rb +4 -0
  6. data/app/helpers/spree/products_helper.rb +8 -7
  7. data/app/mailers/spree/base_mailer.rb +2 -2
  8. data/app/mailers/spree/order_mailer.rb +2 -2
  9. data/app/mailers/spree/shipment_mailer.rb +1 -1
  10. data/app/mailers/spree/test_mailer.rb +1 -1
  11. data/app/models/spree/ability.rb +15 -16
  12. data/app/models/spree/address.rb +3 -6
  13. data/app/models/spree/adjustment.rb +2 -2
  14. data/app/models/spree/alert.rb +1 -1
  15. data/app/models/spree/app_configuration.rb +17 -20
  16. data/app/models/spree/asset.rb +2 -2
  17. data/app/models/spree/base.rb +9 -0
  18. data/app/models/spree/calculator.rb +1 -1
  19. data/app/models/spree/calculator/flat_rate.rb +1 -1
  20. data/app/models/spree/calculator/flexi_rate.rb +1 -1
  21. data/app/models/spree/calculator/price_sack.rb +1 -3
  22. data/app/models/spree/calculator/shipping/flat_rate.rb +1 -1
  23. data/app/models/spree/calculator/shipping/flexi_rate.rb +1 -1
  24. data/app/models/spree/calculator/shipping/per_item.rb +1 -1
  25. data/app/models/spree/calculator/shipping/price_sack.rb +1 -3
  26. data/app/models/spree/classification.rb +1 -1
  27. data/app/models/spree/configuration.rb +1 -1
  28. data/app/models/spree/country.rb +1 -1
  29. data/app/models/spree/credit_card.rb +8 -12
  30. data/app/models/spree/gateway.rb +0 -3
  31. data/app/models/spree/gateway/bogus.rb +2 -3
  32. data/app/models/spree/image.rb +3 -1
  33. data/app/models/spree/inventory_unit.rb +5 -6
  34. data/app/models/spree/item_adjustments.rb +3 -4
  35. data/app/models/spree/legacy_user.rb +1 -1
  36. data/app/models/spree/line_item.rb +6 -13
  37. data/app/models/spree/log_entry.rb +1 -1
  38. data/app/models/spree/option_type.rb +1 -1
  39. data/app/models/spree/option_value.rb +1 -3
  40. data/app/models/spree/order.rb +52 -70
  41. data/app/models/spree/order/checkout.rb +17 -10
  42. data/app/models/spree/order/currency_updater.rb +1 -1
  43. data/app/models/spree/order_contents.rb +7 -4
  44. data/app/models/spree/order_populator.rb +1 -1
  45. data/app/models/spree/order_updater.rb +8 -21
  46. data/app/models/spree/payment.rb +26 -12
  47. data/app/models/spree/payment/processing.rb +5 -16
  48. data/app/models/spree/payment_capture_event.rb +1 -1
  49. data/app/models/spree/payment_method.rb +2 -2
  50. data/app/models/spree/payment_method/check.rb +0 -2
  51. data/app/models/spree/preference.rb +1 -31
  52. data/app/models/spree/preferences/configuration.rb +2 -6
  53. data/app/models/spree/preferences/preferable.rb +46 -74
  54. data/app/models/spree/preferences/preferable_class_methods.rb +11 -46
  55. data/app/models/spree/preferences/scoped_store.rb +33 -0
  56. data/app/models/spree/preferences/store.rb +8 -7
  57. data/app/models/spree/price.rb +1 -3
  58. data/app/models/spree/product.rb +59 -87
  59. data/app/models/spree/product/scopes.rb +22 -13
  60. data/app/models/spree/product_option_type.rb +1 -1
  61. data/app/models/spree/product_property.rb +1 -3
  62. data/app/models/spree/product_scope/scopes.rb +1 -1
  63. data/app/models/spree/promotion.rb +4 -5
  64. data/app/models/spree/promotion/actions/create_adjustment.rb +11 -2
  65. data/app/models/spree/promotion/actions/create_item_adjustments.rb +19 -2
  66. data/app/models/spree/promotion/actions/create_line_items.rb +2 -12
  67. data/app/models/spree/promotion/rules/user.rb +5 -1
  68. data/app/models/spree/promotion_action.rb +1 -1
  69. data/app/models/spree/promotion_action_line_item.rb +1 -1
  70. data/app/models/spree/promotion_handler/cart.rb +2 -14
  71. data/app/models/spree/promotion_handler/coupon.rb +3 -13
  72. data/app/models/spree/promotion_rule.rb +1 -1
  73. data/app/models/spree/property.rb +1 -3
  74. data/app/models/spree/prototype.rb +1 -1
  75. data/app/models/spree/return_authorization.rb +4 -10
  76. data/app/models/spree/role.rb +1 -1
  77. data/app/models/spree/shipment.rb +1 -9
  78. data/app/models/spree/shipping_category.rb +3 -3
  79. data/app/models/spree/shipping_method.rb +1 -1
  80. data/app/models/spree/shipping_method_category.rb +2 -2
  81. data/app/models/spree/shipping_rate.rb +3 -3
  82. data/app/models/spree/state.rb +1 -1
  83. data/app/models/spree/state_change.rb +1 -1
  84. data/app/models/spree/stock/availability_validator.rb +7 -3
  85. data/app/models/spree/stock/package.rb +0 -23
  86. data/app/models/spree/stock/splitter/backordered.rb +1 -1
  87. data/app/models/spree/stock/splitter/shipping_category.rb +1 -1
  88. data/app/models/spree/stock/splitter/weight.rb +1 -1
  89. data/app/models/spree/stock_item.rb +7 -10
  90. data/app/models/spree/stock_location.rb +2 -6
  91. data/app/models/spree/stock_movement.rb +1 -3
  92. data/app/models/spree/stock_transfer.rb +1 -3
  93. data/app/models/spree/store.rb +33 -0
  94. data/app/models/spree/tax_category.rb +2 -2
  95. data/app/models/spree/tax_rate.rb +21 -52
  96. data/app/models/spree/taxon.rb +9 -8
  97. data/app/models/spree/taxonomy.rb +1 -1
  98. data/app/models/spree/tracker.rb +1 -1
  99. data/app/models/spree/variant.rb +13 -15
  100. data/app/models/spree/variant/scopes.rb +1 -1
  101. data/app/models/spree/zone.rb +22 -22
  102. data/app/models/spree/zone_member.rb +2 -2
  103. data/config/initializers/user_class_extensions.rb +0 -8
  104. data/config/locales/en.yml +7 -42
  105. data/db/default/spree/countries.rb +2 -3
  106. data/db/default/spree/stores.rb +9 -0
  107. data/db/migrate/20130611054351_rename_shipping_methods_zones_to_spree_shipping_methods_zones.rb +0 -5
  108. data/db/migrate/20130807024301_upgrade_adjustments.rb +4 -5
  109. data/db/migrate/20130807024302_rename_adjustment_fields.rb +5 -2
  110. data/db/migrate/20131118183431_add_line_item_id_to_spree_inventory_units.rb +1 -1
  111. data/db/migrate/20140106065820_remove_value_type_from_spree_preferences.rb +8 -0
  112. data/db/migrate/20140227112348_add_preference_store_to_everything.rb +8 -0
  113. data/db/migrate/20140309023735_migrate_old_preferences.rb +23 -0
  114. data/db/migrate/20140309024355_create_spree_stores.rb +25 -0
  115. data/db/migrate/20140309033438_create_store_from_preferences.rb +30 -0
  116. data/db/migrate/20140315053743_add_timestamps_to_spree_assets.rb +6 -0
  117. data/db/migrate/20140331100557_add_additional_store_fields.rb +8 -0
  118. data/db/migrate/20140410141842_add_many_missing_indexes.rb +18 -0
  119. data/db/migrate/20140410150358_correct_some_polymorphic_index_and_add_more_missing.rb +66 -0
  120. data/db/migrate/20140508151342_change_spree_price_amount_precision.rb +1 -1
  121. data/db/migrate/20140518174634_add_token_to_spree_orders.rb +5 -0
  122. data/db/migrate/20140530024945_move_order_token_from_tokenized_permission.rb +29 -0
  123. data/db/migrate/20140601011216_set_shipment_total_for_users_upgrading.rb +5 -3
  124. data/db/migrate/20140604135309_drop_credit_card_first_name_and_last_name.rb +6 -0
  125. data/lib/generators/spree/dummy/dummy_generator.rb +1 -0
  126. data/lib/generators/spree/dummy/templates/initializers/devise.rb +3 -0
  127. data/lib/generators/spree/dummy/templates/rails/routes.rb +0 -1
  128. data/lib/generators/spree/install/install_generator.rb +8 -17
  129. data/lib/generators/spree/install/templates/config/initializers/spree.rb +2 -2
  130. data/lib/spree/core.rb +13 -9
  131. data/lib/spree/core/calculated_adjustments.rb +1 -1
  132. data/lib/spree/core/controller_helpers/auth.rb +27 -18
  133. data/lib/spree/core/controller_helpers/common.rb +2 -2
  134. data/lib/spree/core/controller_helpers/order.rb +15 -24
  135. data/lib/spree/core/controller_helpers/store.rb +19 -0
  136. data/lib/spree/core/delegate_belongs_to.rb +2 -2
  137. data/lib/spree/core/engine.rb +0 -10
  138. data/lib/spree/core/importer.rb +1 -0
  139. data/lib/spree/core/importer/order.rb +16 -44
  140. data/lib/spree/core/importer/product.rb +62 -0
  141. data/lib/spree/core/product_filters.rb +0 -4
  142. data/lib/spree/core/routes.rb +4 -6
  143. data/lib/spree/core/validators/email.rb +23 -1
  144. data/lib/spree/core/version.rb +1 -1
  145. data/lib/spree/money.rb +1 -169
  146. data/lib/spree/permitted_attributes.rb +6 -4
  147. data/lib/spree/testing_support/authorization_helpers.rb +23 -21
  148. data/lib/spree/testing_support/capybara_ext.rb +11 -21
  149. data/lib/spree/testing_support/common_rake.rb +3 -1
  150. data/lib/spree/testing_support/controller_requests.rb +0 -2
  151. data/lib/spree/testing_support/factories/credit_card_factory.rb +1 -1
  152. data/lib/spree/testing_support/factories/line_item_factory.rb +4 -1
  153. data/lib/spree/testing_support/factories/order_factory.rb +5 -4
  154. data/lib/spree/testing_support/factories/product_factory.rb +0 -4
  155. data/lib/spree/testing_support/factories/promotion_factory.rb +5 -7
  156. data/lib/spree/testing_support/factories/shipment_factory.rb +0 -1
  157. data/lib/spree/testing_support/factories/stock_factory.rb +2 -2
  158. data/lib/spree/testing_support/factories/store_factory.rb +8 -0
  159. data/lib/spree/testing_support/preferences.rb +3 -3
  160. data/lib/tasks/core.rake +2 -2
  161. metadata +48 -39
  162. data/app/models/spree/stock/order_counter.rb +0 -55
  163. data/app/models/spree/tokenized_permission.rb +0 -6
  164. data/app/views/spree/shared/_routes.html.erb +0 -13
  165. data/db/migrate/20140804185157_add_default_to_shipment_cost.rb +0 -10
  166. data/db/migrate/20141021194502_add_state_lock_version_to_order.rb +0 -5
  167. data/lib/spree/core/adjustment_source.rb +0 -26
  168. data/lib/spree/core/mail_interceptor.rb +0 -22
  169. data/lib/spree/core/mail_method.rb +0 -27
  170. data/lib/spree/core/mail_settings.rb +0 -55
  171. data/lib/spree/core/ransackable_attributes.rb +0 -15
  172. data/lib/spree/core/token_resource.rb +0 -27
@@ -1,5 +1,5 @@
1
1
  module Spree
2
- class ProductOptionType < ActiveRecord::Base
2
+ class ProductOptionType < Spree::Base
3
3
  belongs_to :product, class_name: 'Spree::Product', inverse_of: :product_option_types
4
4
  belongs_to :option_type, class_name: 'Spree::OptionType', inverse_of: :product_option_types
5
5
  acts_as_list scope: :product
@@ -1,5 +1,5 @@
1
1
  module Spree
2
- class ProductProperty < ActiveRecord::Base
2
+ class ProductProperty < Spree::Base
3
3
  belongs_to :product, touch: true, class_name: 'Spree::Product', inverse_of: :product_properties
4
4
  belongs_to :property, class_name: 'Spree::Property', inverse_of: :product_properties
5
5
 
@@ -8,8 +8,6 @@ module Spree
8
8
 
9
9
  default_scope -> { order("#{self.table_name}.position") }
10
10
 
11
- self.whitelisted_ransackable_attributes = ['value']
12
-
13
11
  # virtual attributes for use with AJAX completion stuff
14
12
  def property_name
15
13
  property.name if property
@@ -1,5 +1,5 @@
1
1
  module Spree
2
- class ProductScope < ActiveRecord::Base
2
+ class ProductScope < Spree::Base
3
3
  before_validation(:on => :create) do
4
4
  # Add default empty arguments so scope validates and errors aren't caused when previewing it
5
5
  if name && args = self.class.arguments_for_scope_name(name)
@@ -1,5 +1,5 @@
1
1
  module Spree
2
- class Promotion < ActiveRecord::Base
2
+ class Promotion < Spree::Base
3
3
  MATCH_POLICIES = %w(all any)
4
4
  UNACTIVATABLE_ORDER_STATES = ["complete", "awaiting_return", "returned"]
5
5
 
@@ -22,14 +22,14 @@ module Spree
22
22
 
23
23
  before_save :normalize_blank_values
24
24
 
25
- self.whitelisted_ransackable_attributes = ['code', 'path', 'promotion_category_id']
25
+ scope :coupons, ->{ where("#{table_name}.code IS NOT NULL") }
26
26
 
27
27
  def self.advertised
28
28
  where(advertise: true)
29
29
  end
30
30
 
31
31
  def self.with_coupon_code(coupon_code)
32
- where("lower(#{self.table_name}.code) = ?", coupon_code.strip.downcase).first
32
+ where("lower(code) = ?", coupon_code.strip.downcase).first
33
33
  end
34
34
 
35
35
  def self.active
@@ -107,8 +107,7 @@ module Spree
107
107
  end
108
108
 
109
109
  def adjusted_credits_count(promotable)
110
- adjustments = promotable.is_a?(Order) ? promotable.all_adjustments : promotable.adjustments
111
- credits_count - adjustments.promotion.where(:source_id => actions.pluck(:id)).count
110
+ credits_count - promotable.adjustments.promotion.where(:source_id => actions.pluck(:id)).count
112
111
  end
113
112
 
114
113
  def credits
@@ -3,14 +3,13 @@ module Spree
3
3
  module Actions
4
4
  class CreateAdjustment < PromotionAction
5
5
  include Spree::Core::CalculatedAdjustments
6
- include Spree::Core::AdjustmentSource
7
6
 
8
7
  has_many :adjustments, as: :source
9
8
 
10
9
  delegate :eligible?, to: :promotion
11
10
 
12
11
  before_validation :ensure_action_has_calculator
13
- before_destroy :deals_with_adjustments_for_deleted_source
12
+ before_destroy :deals_with_adjustments
14
13
 
15
14
  # Creates the adjustment related to a promotion for the order passed
16
15
  # through options hash
@@ -56,6 +55,16 @@ module Spree
56
55
  self.calculator = Calculator::FlatPercentItemTotal.new
57
56
  end
58
57
 
58
+ def deals_with_adjustments
59
+ adjustment_scope = self.adjustments.joins("LEFT OUTER JOIN spree_orders ON spree_orders.id = spree_adjustments.adjustable_id")
60
+ # For incomplete orders, remove the adjustment completely.
61
+ adjustment_scope.where("spree_orders.completed_at IS NULL").readonly(false).destroy_all
62
+
63
+ # For complete orders, the source will be invalid.
64
+ # Therefore we nullify the source_id, leaving the adjustment in place.
65
+ # This would mean that the order's total is not altered at all.
66
+ adjustment_scope.where("spree_orders.completed_at IS NOT NULL").update_all("source_id = NULL")
67
+ end
59
68
  end
60
69
  end
61
70
  end
@@ -3,14 +3,13 @@ module Spree
3
3
  module Actions
4
4
  class CreateItemAdjustments < PromotionAction
5
5
  include Spree::Core::CalculatedAdjustments
6
- include Spree::Core::AdjustmentSource
7
6
 
8
7
  has_many :adjustments, as: :source
9
8
 
10
9
  delegate :eligible?, to: :promotion
11
10
 
12
11
  before_validation :ensure_action_has_calculator
13
- before_destroy :deals_with_adjustments_for_deleted_source
12
+ before_destroy :deals_with_adjustments
14
13
 
15
14
  def perform(payload = {})
16
15
  order = payload[:order]
@@ -63,6 +62,24 @@ module Spree
63
62
  self.calculator = Calculator::PercentOnLineItem.new
64
63
  end
65
64
 
65
+ def deals_with_adjustments
66
+ adjustment_scope = self.adjustments.includes(:order).references(:spree_orders)
67
+
68
+ # For incomplete orders, remove the adjustment completely.
69
+ adjustment_scope.where("spree_orders.completed_at IS NULL").each do |adjustment|
70
+ adjustment.destroy
71
+ end
72
+
73
+ # For complete orders, the source will be invalid.
74
+ # Therefore we nullify the source_id, leaving the adjustment in place.
75
+ # This would mean that the order's total is not altered at all.
76
+ adjustment_scope.where("spree_orders.completed_at IS NOT NULL").each do |adjustment|
77
+ adjustment.update_columns(
78
+ source_id: nil,
79
+ updated_at: Time.now,
80
+ )
81
+ end
82
+ end
66
83
  end
67
84
  end
68
85
  end
@@ -39,23 +39,13 @@ module Spree
39
39
  order = options[:order]
40
40
  return unless self.eligible? order
41
41
 
42
- action_taken = false
43
42
  promotion_action_line_items.each do |item|
44
43
  current_quantity = order.quantity_of(item.variant)
45
- if current_quantity < item.quantity && item_available?(item)
46
- line_item = order.contents.add(item.variant, item.quantity - current_quantity)
47
- action_taken = true if line_item.try(:valid?)
44
+ if current_quantity < item.quantity
45
+ order.contents.add(item.variant, item.quantity - current_quantity)
48
46
  end
49
47
  end
50
- action_taken
51
48
  end
52
-
53
- # Checks that there's enough stock to add the line item to the order
54
- def item_available?(item)
55
- quantifier = Spree::Stock::Quantifier.new(item.variant)
56
- quantifier.can_supply? item.quantity
57
- end
58
-
59
49
  end
60
50
  end
61
51
  end
@@ -3,8 +3,12 @@ module Spree
3
3
  module Rules
4
4
  class User < PromotionRule
5
5
  belongs_to :user, class_name: "::#{Spree.user_class.to_s}"
6
- has_and_belongs_to_many :users, class_name: "::#{Spree.user_class.to_s}", join_table: 'spree_promotion_rules_users', foreign_key: 'promotion_rule_id'
7
6
 
7
+ has_and_belongs_to_many :users, class_name: "::#{Spree.user_class.to_s}",
8
+ join_table: 'spree_promotion_rules_users',
9
+ foreign_key: 'promotion_rule_id',
10
+ association_foreign_key: :user_id
11
+
8
12
  def applicable?(promotable)
9
13
  promotable.is_a?(Spree::Order)
10
14
  end
@@ -1,7 +1,7 @@
1
1
  # Base class for all types of promotion action.
2
2
  # PromotionActions perform the necessary tasks when a promotion is activated by an event and determined to be eligible.
3
3
  module Spree
4
- class PromotionAction < ActiveRecord::Base
4
+ class PromotionAction < Spree::Base
5
5
  acts_as_paranoid
6
6
 
7
7
  belongs_to :promotion, class_name: 'Spree::Promotion'
@@ -1,5 +1,5 @@
1
1
  module Spree
2
- class PromotionActionLineItem < ActiveRecord::Base
2
+ class PromotionActionLineItem < Spree::Base
3
3
  belongs_to :promotion_action, class_name: 'Spree::Promotion::Actions::CreateLineItems'
4
4
  belongs_to :variant, class_name: 'Spree::Variant'
5
5
  end
@@ -29,21 +29,9 @@ module Spree
29
29
  end
30
30
 
31
31
  private
32
- def promotions
33
- promo_table = Promotion.arel_table
34
- join_table = Arel::Table.new(:spree_orders_promotions)
35
-
36
- join_condition = promo_table.join(join_table, Arel::Nodes::OuterJoin).on(
37
- promo_table[:id].eq(join_table[:promotion_id])
38
- ).join_sources
39
32
 
40
- Promotion.active.includes(:promotion_rules).
41
- joins(join_condition).
42
- where(
43
- promo_table[:code].eq(nil).and(
44
- promo_table[:path].eq(nil)
45
- ).or(join_table[:order_id].eq(order.id))
46
- ).distinct
33
+ def promotions
34
+ Promotion.active.includes(:promotion_rules).where(:code => nil, :path => nil)
47
35
  end
48
36
  end
49
37
  end
@@ -72,27 +72,17 @@ module Spree
72
72
  end
73
73
  }
74
74
 
75
- # Check for applied adjustments.
76
75
  discount = order.line_item_adjustments.promotion.detect(&detector)
77
76
  discount ||= order.shipment_adjustments.promotion.detect(&detector)
78
77
  discount ||= order.adjustments.promotion.detect(&detector)
79
78
 
80
- # Check for applied line items.
81
- created_line_items = promotion.actions.detect { |a| a.type == 'Spree::Promotion::Actions::CreateLineItems' }
82
-
83
- if (discount && discount.eligible) || created_line_items
79
+ if discount.eligible
84
80
  order.update_totals
85
81
  order.persist_totals
86
82
  self.success = Spree.t(:coupon_code_applied)
87
83
  else
88
- # if the promotion exists on an order, but wasn't found above,
89
- # we've already selected a better promotion
90
- if order.promotions.with_coupon_code(order.coupon_code)
91
- self.error = Spree.t(:coupon_code_better_exists)
92
- else
93
- # if the promotion was created after the order
94
- self.error = Spree.t(:coupon_code_not_found)
95
- end
84
+ # if the promotion was created after the order
85
+ self.error = Spree.t(:coupon_code_not_found)
96
86
  end
97
87
  end
98
88
  end
@@ -1,6 +1,6 @@
1
1
  # Base class for all promotion rules
2
2
  module Spree
3
- class PromotionRule < ActiveRecord::Base
3
+ class PromotionRule < Spree::Base
4
4
  belongs_to :promotion, class_name: 'Spree::Promotion', inverse_of: :promotion_rules
5
5
 
6
6
  scope :of_type, ->(t) { where(type: t) }
@@ -1,5 +1,5 @@
1
1
  module Spree
2
- class Property < ActiveRecord::Base
2
+ class Property < Spree::Base
3
3
  has_and_belongs_to_many :prototypes, join_table: 'spree_properties_prototypes'
4
4
 
5
5
  has_many :product_properties, dependent: :delete_all, inverse_of: :property
@@ -11,8 +11,6 @@ module Spree
11
11
 
12
12
  after_touch :touch_all_products
13
13
 
14
- self.whitelisted_ransackable_attributes = ['presentation']
15
-
16
14
  def self.find_all_by_prototype(prototype)
17
15
  id = prototype
18
16
  id = prototype.id if prototype.class == Prototype
@@ -1,5 +1,5 @@
1
1
  module Spree
2
- class Prototype < ActiveRecord::Base
2
+ class Prototype < Spree::Base
3
3
  has_and_belongs_to_many :properties, join_table: :spree_properties_prototypes
4
4
  has_and_belongs_to_many :option_types, join_table: :spree_option_types_prototypes
5
5
 
@@ -1,8 +1,8 @@
1
1
  module Spree
2
- class ReturnAuthorization < ActiveRecord::Base
3
- belongs_to :order, class_name: 'Spree::Order', inverse_of: :return_authorizations
2
+ class ReturnAuthorization < Spree::Base
3
+ belongs_to :order, class_name: 'Spree::Order'
4
4
 
5
- has_many :inventory_units, dependent: :nullify, inverse_of: :return_authorization
5
+ has_many :inventory_units
6
6
  belongs_to :stock_location
7
7
  before_create :generate_number
8
8
  before_save :force_positive_amount
@@ -22,12 +22,6 @@ module Spree
22
22
  end
23
23
  end
24
24
 
25
- self.whitelisted_ransackable_attributes = ['reason']
26
-
27
- def pre_tax_total
28
- return_items.sum(:pre_tax_amount)
29
- end
30
-
31
25
  def currency
32
26
  order.nil? ? Spree::Config[:currency] : order.currency
33
27
  end
@@ -68,7 +62,7 @@ module Spree
68
62
  order.shipped_shipments.collect{|s| s.inventory_units.to_a}.flatten
69
63
  end
70
64
 
71
- # Used when Adjustment#update! wants to update the related adjustment
65
+ # Used when Adjustment#update! wants to update the related adjustmenrt
72
66
  def compute_amount(*args)
73
67
  amount.abs * -1
74
68
  end
@@ -1,5 +1,5 @@
1
1
  module Spree
2
- class Role < ActiveRecord::Base
2
+ class Role < Spree::Base
3
3
  has_and_belongs_to_many :users, join_table: 'spree_roles_users', class_name: Spree.user_class.to_s
4
4
  end
5
5
  end
@@ -1,7 +1,7 @@
1
1
  require 'ostruct'
2
2
 
3
3
  module Spree
4
- class Shipment < ActiveRecord::Base
4
+ class Shipment < Spree::Base
5
5
  belongs_to :order, class_name: 'Spree::Order', touch: true, inverse_of: :shipments
6
6
  belongs_to :address, class_name: 'Spree::Address', inverse_of: :shipments
7
7
  belongs_to :stock_location, class_name: 'Spree::StockLocation'
@@ -93,8 +93,6 @@ module Spree
93
93
  selected_shipping_rate.try(:shipping_method) || shipping_rates.first.try(:shipping_method)
94
94
  end
95
95
 
96
- self.whitelisted_ransackable_attributes = ['number']
97
-
98
96
  def add_shipping_method(shipping_method, selected = false)
99
97
  shipping_rates.create(shipping_method: shipping_method, selected: selected, cost: cost)
100
98
  end
@@ -339,12 +337,6 @@ module Spree
339
337
  "#{Spree.t(:shipping)} (#{shipping_method.name})"
340
338
  end
341
339
 
342
- def validate_shipping_method
343
- unless shipping_method.nil?
344
- errors.add :shipping_method, Spree.t(:is_not_available_to_shipment_address) unless shipping_method.include?(address)
345
- end
346
- end
347
-
348
340
  def after_ship
349
341
  inventory_units.each &:ship!
350
342
  send_shipped_email
@@ -1,8 +1,8 @@
1
1
  module Spree
2
- class ShippingCategory < ActiveRecord::Base
2
+ class ShippingCategory < Spree::Base
3
3
  validates :name, presence: true
4
4
  has_many :products, inverse_of: :shipping_category
5
- has_many :shipping_method_categories, inverse_of: :shipping_method
5
+ has_many :shipping_method_categories
6
6
  has_many :shipping_methods, through: :shipping_method_categories
7
7
  end
8
- end
8
+ end
@@ -1,5 +1,5 @@
1
1
  module Spree
2
- class ShippingMethod < ActiveRecord::Base
2
+ class ShippingMethod < Spree::Base
3
3
  acts_as_paranoid
4
4
  include Spree::Core::CalculatedAdjustments
5
5
  DISPLAY = [:both, :front_end, :back_end]
@@ -1,6 +1,6 @@
1
1
  module Spree
2
- class ShippingMethodCategory < ActiveRecord::Base
2
+ class ShippingMethodCategory < Spree::Base
3
3
  belongs_to :shipping_method, class_name: 'Spree::ShippingMethod'
4
- belongs_to :shipping_category, class_name: 'Spree::ShippingCategory', inverse_of: :shipping_method_categories
4
+ belongs_to :shipping_category, class_name: 'Spree::ShippingCategory'
5
5
  end
6
6
  end
@@ -1,5 +1,5 @@
1
1
  module Spree
2
- class ShippingRate < ActiveRecord::Base
2
+ class ShippingRate < Spree::Base
3
3
  belongs_to :shipment, class_name: 'Spree::Shipment'
4
4
  belongs_to :shipping_method, class_name: 'Spree::ShippingMethod', inverse_of: :shipping_rates
5
5
  belongs_to :tax_rate, class_name: 'Spree::TaxRate'
@@ -23,10 +23,10 @@ module Spree
23
23
  if tax_rate.included_in_price?
24
24
  if tax_amount > 0
25
25
  amount = "#{display_tax_amount(tax_amount)} #{tax_rate.name}"
26
- price += " (#{Spree.t(:incl)} #{amount})"
26
+ price += " (incl. #{amount})"
27
27
  else
28
28
  amount = "#{display_tax_amount(tax_amount*-1)} #{tax_rate.name}"
29
- price += " (#{Spree.t(:excl)} #{amount})"
29
+ price += " (excl. #{amount})"
30
30
  end
31
31
  else
32
32
  amount = "#{display_tax_amount(tax_amount)} #{tax_rate.name}"
@@ -1,5 +1,5 @@
1
1
  module Spree
2
- class State < ActiveRecord::Base
2
+ class State < Spree::Base
3
3
  belongs_to :country, class_name: 'Spree::Country'
4
4
  has_many :addresses, dependent: :nullify
5
5
 
@@ -1,5 +1,5 @@
1
1
  module Spree
2
- class StateChange < ActiveRecord::Base
2
+ class StateChange < Spree::Base
3
3
  belongs_to :user
4
4
  belongs_to :stateful, polymorphic: true
5
5
  before_create :assign_user
@@ -2,9 +2,13 @@ module Spree
2
2
  module Stock
3
3
  class AvailabilityValidator < ActiveModel::Validator
4
4
  def validate(line_item)
5
- unit_count = line_item.inventory_units.size
6
- return if unit_count >= line_item.quantity
7
- quantity = line_item.quantity - unit_count
5
+ if shipment = line_item.target_shipment
6
+ units = shipment.inventory_units_for(line_item.variant)
7
+ return if units.count > line_item.quantity
8
+ quantity = line_item.quantity - units.count
9
+ else
10
+ quantity = line_item.quantity
11
+ end
8
12
 
9
13
  quantifier = Stock::Quantifier.new(line_item.variant)
10
14