spree_core 2.2.14 → 2.3.0

Sign up to get free protection for your applications and to get access to all the features.
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