solidus_core 2.0.3 → 2.1.0.beta1

Sign up to get free protection for your applications and to get access to all the features.

Potentially problematic release.


This version of solidus_core might be problematic. Click here for more details.

Files changed (187) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +62 -3
  3. data/app/assets/javascripts/spree.js.coffee.erb +4 -1
  4. data/app/helpers/spree/base_helper.rb +7 -48
  5. data/app/models/spree/address.rb +5 -1
  6. data/app/models/spree/adjustment.rb +3 -3
  7. data/app/models/spree/app_configuration.rb +13 -0
  8. data/app/models/spree/calculator.rb +3 -2
  9. data/app/models/spree/calculator/default_tax.rb +6 -10
  10. data/app/models/spree/calculator/flat_percent_item_total.rb +0 -4
  11. data/app/models/spree/calculator/flat_rate.rb +0 -4
  12. data/app/models/spree/calculator/flexi_rate.rb +0 -4
  13. data/app/models/spree/calculator/free_shipping.rb +0 -3
  14. data/app/models/spree/calculator/percent_on_line_item.rb +0 -4
  15. data/app/models/spree/calculator/percent_per_item.rb +0 -4
  16. data/app/models/spree/calculator/price_sack.rb +0 -4
  17. data/app/models/spree/calculator/returns/default_refund_amount.rb +0 -3
  18. data/app/models/spree/calculator/shipping/flat_percent_item_total.rb +0 -4
  19. data/app/models/spree/calculator/shipping/flat_rate.rb +0 -4
  20. data/app/models/spree/calculator/shipping/flexi_rate.rb +0 -4
  21. data/app/models/spree/calculator/shipping/per_item.rb +0 -4
  22. data/app/models/spree/calculator/shipping/price_sack.rb +0 -4
  23. data/app/models/spree/calculator/tiered_flat_rate.rb +0 -4
  24. data/app/models/spree/calculator/tiered_percent.rb +0 -4
  25. data/app/models/spree/credit_card.rb +27 -14
  26. data/app/models/spree/gateway.rb +4 -0
  27. data/app/models/spree/inventory_unit.rb +2 -0
  28. data/app/models/spree/line_item.rb +31 -26
  29. data/app/models/spree/option_type.rb +0 -3
  30. data/app/models/spree/order.rb +28 -31
  31. data/app/models/spree/order/checkout.rb +0 -2
  32. data/app/models/spree/order_contents.rb +0 -45
  33. data/app/models/spree/order_merger.rb +6 -6
  34. data/app/models/spree/order_update_attributes.rb +0 -2
  35. data/app/models/spree/order_updater.rb +91 -13
  36. data/app/models/spree/payment.rb +9 -2
  37. data/app/models/spree/payment/processing.rb +15 -9
  38. data/app/models/spree/payment_method.rb +48 -5
  39. data/app/models/spree/price.rb +7 -9
  40. data/app/models/spree/product.rb +1 -25
  41. data/app/models/spree/promotion.rb +22 -14
  42. data/app/models/spree/promotion/actions/create_adjustment.rb +12 -1
  43. data/app/models/spree/promotion/actions/create_item_adjustments.rb +15 -1
  44. data/app/models/spree/promotion/actions/create_quantity_adjustments.rb +5 -3
  45. data/app/models/spree/promotion/actions/free_shipping.rb +14 -0
  46. data/app/models/spree/promotion/rules/taxon.rb +7 -2
  47. data/app/models/spree/promotion/rules/user_role.rb +43 -0
  48. data/app/models/spree/promotion_action.rb +19 -2
  49. data/app/models/spree/promotion_handler/coupon.rb +1 -4
  50. data/app/models/spree/promotion_handler/free_shipping.rb +22 -17
  51. data/app/models/spree/promotion_rule_role.rb +6 -0
  52. data/app/models/spree/property.rb +0 -3
  53. data/app/models/spree/return_authorization.rb +2 -0
  54. data/app/models/spree/shipment.rb +5 -21
  55. data/app/models/spree/shipping_method.rb +23 -2
  56. data/app/models/spree/shipping_rate.rb +3 -0
  57. data/app/models/spree/stock/estimator.rb +1 -1
  58. data/app/models/spree/stock_location.rb +3 -0
  59. data/app/models/spree/store.rb +7 -0
  60. data/app/models/spree/tax/item_adjuster.rb +27 -12
  61. data/app/models/spree/tax/order_adjuster.rb +2 -5
  62. data/app/models/spree/tax/tax_helpers.rb +4 -8
  63. data/app/models/spree/tax_rate.rb +1 -15
  64. data/app/models/spree/taxon.rb +0 -3
  65. data/app/models/spree/transfer_item.rb +1 -1
  66. data/app/models/spree/user_class_handle.rb +14 -9
  67. data/app/models/spree/variant/pricing_options.rb +1 -1
  68. data/app/models/spree/wallet/add_payment_sources_to_wallet.rb +1 -1
  69. data/app/models/spree/zone.rb +20 -13
  70. data/config/locales/en.yml +144 -62
  71. data/db/migrate/20120831092320_spree_one_two.rb +0 -7
  72. data/db/migrate/20150723224133_remove_unnecessary_indexes.rb +0 -2
  73. data/db/migrate/20160924135758_remove_is_default_from_prices.rb +5 -0
  74. data/db/migrate/20161009141333_remove_currency_from_line_items.rb +5 -0
  75. data/db/migrate/20161014221052_add_available_to_columns_and_remove_display_on_from_payment_methods.rb +28 -0
  76. data/db/migrate/20161123154034_add_available_to_users_and_remove_display_on_from_shipping_methods.rb +20 -0
  77. data/lib/generators/spree/custom_user/templates/authentication_helpers.rb.tt +4 -0
  78. data/lib/generators/spree/dummy/dummy_generator.rb +0 -2
  79. data/lib/spree/core.rb +0 -5
  80. data/lib/spree/core/controller_helpers/pricing.rb +2 -1
  81. data/lib/spree/core/engine.rb +14 -0
  82. data/lib/spree/core/version.rb +1 -1
  83. data/lib/spree/deprecation.rb +1 -1
  84. data/lib/spree/localized_number.rb +3 -2
  85. data/lib/spree/permission_sets/configuration_display.rb +0 -1
  86. data/lib/spree/permission_sets/configuration_management.rb +0 -1
  87. data/lib/spree/permission_sets/product_display.rb +0 -1
  88. data/lib/spree/permission_sets/product_management.rb +0 -1
  89. data/lib/spree/permission_sets/user_management.rb +2 -4
  90. data/lib/spree/permitted_attributes.rb +3 -2
  91. data/lib/spree/testing_support/capybara_ext.rb +0 -12
  92. data/lib/spree/testing_support/factories/address_factory.rb +1 -1
  93. data/lib/spree/testing_support/factories/line_item_factory.rb +0 -1
  94. data/lib/spree/testing_support/factories/payment_factory.rb +4 -0
  95. data/lib/spree/testing_support/factories/payment_method_factory.rb +8 -1
  96. data/lib/spree/testing_support/factories/user_factory.rb +2 -2
  97. data/solidus_core.gemspec +4 -3
  98. data/spec/helpers/base_helper_spec.rb +0 -40
  99. data/spec/lib/spree/core/controller_helpers/pricing_spec.rb +16 -0
  100. data/spec/lib/spree/core/importer/order_spec.rb +27 -18
  101. data/spec/lib/spree/core/price_migrator_spec.rb +3 -1
  102. data/spec/lib/spree/core/testing_support/factories/order_factory_spec.rb +16 -0
  103. data/spec/lib/spree/core/unreturned_item_charger_spec.rb +0 -2
  104. data/spec/lib/tasks/exchanges_spec.rb +4 -2
  105. data/spec/lib/tasks/migrations/create_vat_prices_spec.rb +5 -3
  106. data/spec/models/spree/adjustment_spec.rb +136 -0
  107. data/spec/models/spree/calculator/default_tax_spec.rb +13 -7
  108. data/spec/models/spree/calculator/flat_percent_item_total_spec.rb +3 -0
  109. data/spec/models/spree/calculator/flat_rate_spec.rb +3 -0
  110. data/spec/models/spree/calculator/flexi_rate_spec.rb +3 -0
  111. data/spec/models/spree/calculator/free_shipping_spec.rb +6 -0
  112. data/spec/models/spree/calculator/percent_on_line_item_spec.rb +9 -4
  113. data/spec/models/spree/calculator/percent_per_item_spec.rb +10 -0
  114. data/spec/models/spree/calculator/price_sack_spec.rb +3 -0
  115. data/spec/models/spree/calculator/refunds/default_refund_amount_spec.rb +3 -0
  116. data/spec/models/spree/calculator/shipping/flat_percent_item_total_spec.rb +3 -0
  117. data/spec/models/spree/calculator/shipping/flat_rate_spec.rb +3 -0
  118. data/spec/models/spree/calculator/shipping/flexi_rate_spec.rb +3 -0
  119. data/spec/models/spree/calculator/shipping/per_item_spec.rb +3 -0
  120. data/spec/models/spree/calculator/shipping/price_sack_spec.rb +4 -1
  121. data/spec/models/spree/calculator/tiered_flat_rate_spec.rb +3 -0
  122. data/spec/models/spree/calculator/tiered_percent_spec.rb +3 -0
  123. data/spec/models/spree/credit_card_spec.rb +27 -1
  124. data/spec/models/spree/line_item_spec.rb +58 -65
  125. data/spec/models/spree/order/checkout_spec.rb +2 -1
  126. data/spec/models/spree/order/payment_spec.rb +9 -10
  127. data/spec/models/spree/order/tax_spec.rb +22 -7
  128. data/spec/models/spree/order/updating_spec.rb +1 -3
  129. data/spec/models/spree/order_cancellations_spec.rb +6 -4
  130. data/spec/models/spree/order_contents_spec.rb +34 -50
  131. data/spec/models/spree/order_inventory_spec.rb +3 -5
  132. data/spec/models/spree/order_merger_spec.rb +20 -0
  133. data/spec/models/spree/order_spec.rb +28 -64
  134. data/spec/models/spree/order_update_attributes_spec.rb +1 -5
  135. data/spec/models/spree/order_updater_spec.rb +251 -0
  136. data/spec/models/spree/payment_method_spec.rb +178 -28
  137. data/spec/models/spree/payment_spec.rb +35 -19
  138. data/spec/models/spree/permission_sets/configuration_display.rb +0 -4
  139. data/spec/models/spree/permission_sets/configuration_management_spec.rb +0 -2
  140. data/spec/models/spree/permission_sets/product_display_spec.rb +0 -4
  141. data/spec/models/spree/permission_sets/product_management_spec.rb +0 -2
  142. data/spec/models/spree/permission_sets/user_management_spec.rb +9 -2
  143. data/spec/models/spree/price_spec.rb +16 -1
  144. data/spec/models/spree/product_spec.rb +0 -75
  145. data/spec/models/spree/promotion/actions/create_adjustment_spec.rb +20 -0
  146. data/spec/models/spree/promotion/actions/create_item_adjustments_spec.rb +39 -15
  147. data/spec/models/spree/promotion/actions/create_quantity_adjustments_spec.rb +203 -22
  148. data/spec/models/spree/promotion/actions/free_shipping_spec.rb +22 -3
  149. data/spec/models/spree/promotion/rules/taxon_spec.rb +26 -0
  150. data/spec/models/spree/promotion/rules/user_role_spec.rb +86 -0
  151. data/spec/models/spree/promotion_action_spec.rb +38 -0
  152. data/spec/models/spree/promotion_handler/coupon_spec.rb +36 -33
  153. data/spec/models/spree/promotion_handler/free_shipping_spec.rb +21 -22
  154. data/spec/models/spree/promotion_spec.rb +46 -6
  155. data/spec/models/spree/reimbursement_spec.rb +1 -1
  156. data/spec/models/spree/reimbursement_tax_calculator_spec.rb +2 -2
  157. data/spec/models/spree/shipment_spec.rb +68 -50
  158. data/spec/models/spree/shipping_method_spec.rb +41 -0
  159. data/spec/models/spree/shipping_rate_spec.rb +9 -3
  160. data/spec/models/spree/stock/estimator_spec.rb +4 -2
  161. data/spec/models/spree/store_credit_spec.rb +3 -3
  162. data/spec/models/spree/tax/item_adjuster_spec.rb +31 -21
  163. data/spec/models/spree/tax/order_adjuster_spec.rb +6 -10
  164. data/spec/models/spree/tax/taxation_integration_spec.rb +19 -0
  165. data/spec/models/spree/tax_rate_spec.rb +5 -26
  166. data/spec/models/spree/transfer_item_spec.rb +11 -0
  167. data/spec/models/spree/variant/pricing_options_spec.rb +7 -17
  168. data/spec/models/spree/variant_spec.rb +2 -4
  169. data/spec/models/spree/zone_spec.rb +60 -20
  170. data/spec/shared_examples/calculator_shared_examples.rb +8 -0
  171. metadata +19 -24
  172. data/app/models/spree/item_adjustments.rb +0 -89
  173. data/app/models/spree/option_type_prototype.rb +0 -6
  174. data/app/models/spree/property_prototype.rb +0 -6
  175. data/app/models/spree/prototype.rb +0 -14
  176. data/app/models/spree/prototype_taxon.rb +0 -6
  177. data/app/models/spree/tracker.rb +0 -8
  178. data/db/migrate/20150128032538_remove_environment_from_tracker.rb +0 -6
  179. data/lib/generators/spree/dummy/templates/initializers/custom_user.rb +0 -1
  180. data/lib/spree/core/delegate_belongs_to.rb +0 -94
  181. data/lib/spree/testing_support/factories/prototype_factory.rb +0 -8
  182. data/lib/spree/testing_support/factories/tracker_factory.rb +0 -6
  183. data/spec/lib/spree/core/delegate_belongs_to_spec.rb +0 -24
  184. data/spec/lib/spree/core/testing_support/factories/prototype_factory_spec.rb +0 -12
  185. data/spec/lib/spree/core/testing_support/factories/tracker_factory_spec.rb +0 -12
  186. data/spec/models/spree/item_adjustments_spec.rb +0 -306
  187. data/spec/models/spree/tracker_spec.rb +0 -21
@@ -8,10 +8,6 @@ module Spree
8
8
  preference :discount_amount, :decimal, default: 0
9
9
  preference :currency, :string, default: ->{ Spree::Config[:currency] }
10
10
 
11
- def self.description
12
- Spree.t(:shipping_price_sack)
13
- end
14
-
15
11
  def compute_package(package)
16
12
  compute_from_price(total(package.contents))
17
13
  end
@@ -14,10 +14,6 @@ module Spree
14
14
 
15
15
  validate :preferred_tiers_content
16
16
 
17
- def self.description
18
- Spree.t(:tiered_flat_rate)
19
- end
20
-
21
17
  def compute(object)
22
18
  _base, amount = preferred_tiers.sort.reverse.detect{ |b, _| object.amount >= b }
23
19
  amount || preferred_base_amount
@@ -18,10 +18,6 @@ module Spree
18
18
  }
19
19
  validate :preferred_tiers_content
20
20
 
21
- def self.description
22
- Spree.t(:tiered_percent)
23
- end
24
-
25
21
  def compute(object)
26
22
  order = object.is_a?(Order) ? object : object.order
27
23
  _base, percent = preferred_tiers.sort.reverse.detect{ |b, _| order.item_total >= b }
@@ -1,4 +1,6 @@
1
1
  module Spree
2
+ # The default `source` of a `Spree::Payment`.
3
+ #
2
4
  class CreditCard < Spree::Base
3
5
  belongs_to :payment_method
4
6
  belongs_to :user, class_name: Spree.user_class, foreign_key: 'user_id'
@@ -11,10 +13,8 @@ module Spree
11
13
 
12
14
  accepts_nested_attributes_for :address
13
15
 
14
- attr_reader :number
15
- attr_accessor :encrypted_data,
16
- :imported,
17
- :verification_value
16
+ attr_reader :number, :verification_value
17
+ attr_accessor :encrypted_data, :imported
18
18
 
19
19
  validates :month, :year, numericality: { only_integer: true }, if: :require_card_numbers?, on: :create
20
20
  validates :number, presence: true, if: :require_card_numbers?, on: :create, unless: :imported
@@ -27,14 +27,22 @@ module Spree
27
27
  # needed for some of the ActiveMerchant gateways (eg. SagePay)
28
28
  alias_attribute :brand, :cc_type
29
29
 
30
+ # Taken from ActiveMerchant
31
+ # https://github.com/activemerchant/active_merchant/blob/2f2acd4696e8de76057b5ed670b9aa022abc1187/lib/active_merchant/billing/credit_card_methods.rb#L5
30
32
  CARD_TYPES = {
31
- visa: /^4[0-9]{12}(?:[0-9]{3})?$/,
32
- master: /(^5[1-5][0-9]{14}$)|(^6759[0-9]{2}([0-9]{10})$)|(^6759[0-9]{2}([0-9]{12})$)|(^6759[0-9]{2}([0-9]{13})$)/,
33
- diners_club: /^3(?:0[0-5]|[68][0-9])[0-9]{11}$/,
34
- american_express: /^3[47][0-9]{13}$/,
35
- discover: /^6(?:011|5[0-9]{2})[0-9]{12}$/,
36
- jcb: /^(?:2131|1800|35\d{3})\d{11}$/
37
- }
33
+ 'visa' => /^4\d{12}(\d{3})?(\d{3})?$/,
34
+ 'master' => /^(5[1-5]\d{4}|677189|222[1-9]\d{2}|22[3-9]\d{3}|2[3-6]\d{4}|27[01]\d{3}|2720\d{2})\d{10}$/,
35
+ 'discover' => /^(6011|65\d{2}|64[4-9]\d)\d{12}|(62\d{14})$/,
36
+ 'american_express' => /^3[47]\d{13}$/,
37
+ 'diners_club' => /^3(0[0-5]|[68]\d)\d{11}$/,
38
+ 'jcb' => /^35(28|29|[3-8]\d)\d{12}$/,
39
+ 'switch' => /^6759\d{12}(\d{2,3})?$/,
40
+ 'solo' => /^6767\d{12}(\d{2,3})?$/,
41
+ 'dankort' => /^5019\d{12}$/,
42
+ 'maestro' => /^(5[06-8]|6\d)\d{10,17}$/,
43
+ 'forbrugsforeningen' => /^600722\d{10}$/,
44
+ 'laser' => /^(6304|6706|6709|6771(?!89))\d{8}(\d{4}|\d{6,7})?$/
45
+ }.freeze
38
46
 
39
47
  def address_attributes=(attributes)
40
48
  self.address = Address.immutable_merge(address, attributes)
@@ -70,6 +78,10 @@ module Spree
70
78
  end
71
79
  end
72
80
 
81
+ def verification_value=(value)
82
+ @verification_value = value.to_s.gsub(/\s/, '')
83
+ end
84
+
73
85
  # Sets the credit card type, converting it to the preferred internal
74
86
  # representation from jquery.payment's representation when appropriate.
75
87
  #
@@ -88,15 +100,16 @@ module Spree
88
100
 
89
101
  # Sets the last digits field based on the assigned credit card number.
90
102
  def set_last_digits
91
- verification_value.to_s.gsub!(/\s/, '')
92
103
  self.last_digits ||= number.to_s.length <= 4 ? number : number.to_s.slice(-4..-1)
93
104
  end
94
105
 
95
106
  # @return [String] the credit card type if it can be determined from the
96
107
  # number, otherwise the empty string
97
108
  def try_type_from_number
98
- numbers = number.delete(' ') if number
99
- CARD_TYPES.find{ |type, pattern| return type.to_s if numbers =~ pattern }.to_s
109
+ CARD_TYPES.each do |type, pattern|
110
+ return type if number =~ pattern
111
+ end
112
+ ''
100
113
  end
101
114
 
102
115
  # @return [Boolean] true when a verification value is present
@@ -1,4 +1,8 @@
1
1
  module Spree
2
+ # A concrete implementation of `Spree::PaymentMethod` intended to provide a
3
+ # base for extension. See https://github.com/solidusio/solidus_gateway/ for
4
+ # offically supported payment gateway implementations.
5
+ #
2
6
  class Gateway < PaymentMethod
3
7
  delegate :authorize, :purchase, :capture, :void, :credit, to: :provider
4
8
 
@@ -1,4 +1,6 @@
1
1
  module Spree
2
+ # Tracks the state of line items' fulfillment.
3
+ #
2
4
  class InventoryUnit < Spree::Base
3
5
  PRE_SHIPMENT_STATES = %w(backordered on_hand)
4
6
  POST_SHIPMENT_STATES = %w(returned)
@@ -1,5 +1,15 @@
1
1
  module Spree
2
+ # Variants placed in the Order at a particular price.
3
+ #
4
+ # `Spree::LineItem` is an ActiveRecord model which records which `Spree::Variant`
5
+ # a customer has chosen to place in their order. It also acts as the permenent
6
+ # record of the customer's order by recording relevant price, taxation, and inventory
7
+ # concerns. Line items can also have adjustments placed on them as part of the
8
+ # promotion system.
9
+ #
2
10
  class LineItem < Spree::Base
11
+ class CurrencyMismatch < StandardError; end
12
+
3
13
  belongs_to :order, class_name: "Spree::Order", inverse_of: :line_items, touch: true
4
14
  belongs_to :variant, -> { with_deleted }, class_name: "Spree::Variant", inverse_of: :line_items
5
15
  belongs_to :tax_category, class_name: "Spree::TaxCategory"
@@ -21,9 +31,6 @@ module Spree
21
31
  greater_than: -1
22
32
  }
23
33
  validates :price, numericality: true
24
- validate :ensure_proper_currency
25
-
26
- after_create :update_tax_charge
27
34
 
28
35
  after_save :update_inventory
29
36
 
@@ -31,10 +38,7 @@ module Spree
31
38
  before_destroy :destroy_inventory_units
32
39
 
33
40
  delegate :name, :description, :sku, :should_track_inventory?, to: :variant
34
- # @note This will return the product even if it has been deleted.
35
- # @return [Spree::Product, nil] the product associated with this line
36
- # item, if there is one
37
- delegate :product, to: :variant
41
+ delegate :currency, to: :order, allow_nil: true
38
42
 
39
43
  attr_accessor :target_shipment
40
44
 
@@ -80,13 +84,19 @@ module Spree
80
84
  # @return [Spree::Money] the amount of this line item
81
85
  alias money display_amount
82
86
  alias display_total display_amount
87
+ deprecate display_total: :display_amount, deprecator: Spree::Deprecation
83
88
 
84
- # Sets price and currency from a `Spree::Money` object
89
+ # Sets price from a `Spree::Money` object
85
90
  #
86
- # @param [Spree::Money] money - the money object to obtain price and currency from
91
+ # @param [Spree::Money] money - the money object to obtain price from
87
92
  def money_price=(money)
88
- self.price = money.to_d
89
- self.currency = money.currency.iso_code
93
+ if !money
94
+ self.price = nil
95
+ elsif money.currency.iso_code != currency
96
+ raise CurrencyMismatch, "Line item price currency must match order currency!"
97
+ else
98
+ self.price = money.to_d
99
+ end
90
100
  end
91
101
 
92
102
  # @return [Boolean] true when it is possible to supply the required
@@ -111,7 +121,10 @@ module Spree
111
121
 
112
122
  assign_attributes options
113
123
 
114
- # There's no need to call a pricer if we'll set the price directly.
124
+ # When price is part of the options we are not going to fetch
125
+ # it from the variant. Please note that this always allows to set
126
+ # a price for this line item, even if there is no existing price
127
+ # for the associated line item in the order currency.
115
128
  unless options.key?(:price) || options.key?('price')
116
129
  self.money_price = variant.price_for(pricing_options)
117
130
  end
@@ -121,6 +134,12 @@ module Spree
121
134
  Spree::Config.pricing_options_class.from_line_item(self)
122
135
  end
123
136
 
137
+ def currency=(_currency)
138
+ Spree::Deprecation.warn 'Spree::LineItem#currency= is deprecated ' \
139
+ 'and will take no effect.',
140
+ caller
141
+ end
142
+
124
143
  private
125
144
 
126
145
  # Sets the quantity to zero if it is nil or less than zero.
@@ -142,7 +161,6 @@ module Spree
142
161
  # If the legacy method #copy_price has been overridden, handle that gracefully
143
162
  return handle_copy_price_override if respond_to?(:copy_price)
144
163
 
145
- self.currency ||= order.currency
146
164
  self.cost_price ||= variant.cost_price
147
165
  self.money_price = variant.price_for(pricing_options) if price.nil?
148
166
  true
@@ -165,18 +183,5 @@ module Spree
165
183
  def destroy_inventory_units
166
184
  inventory_units.destroy_all
167
185
  end
168
-
169
- def update_tax_charge
170
- Spree::Tax::ItemAdjuster.new(self).adjust!
171
- end
172
-
173
- def ensure_proper_currency
174
- if currency != order.currency
175
- Spree::Deprecation.warn "The line items currency is different from it's order currency. " \
176
- "This behavior is not supported anymore and will be deleted soon.",
177
- caller
178
- errors.add(:currency, :must_match_order_currency)
179
- end
180
- end
181
186
  end
182
187
  end
@@ -13,9 +13,6 @@ module Spree
13
13
  has_many :product_option_types, dependent: :destroy, inverse_of: :option_type
14
14
  has_many :products, through: :product_option_types
15
15
 
16
- has_many :option_type_prototypes
17
- has_many :prototypes, through: :option_type_prototypes
18
-
19
16
  validates :name, presence: true, uniqueness: { allow_blank: true }
20
17
  validates :presentation, presence: true
21
18
 
@@ -2,6 +2,23 @@ require 'spree/core/validators/email'
2
2
  require 'spree/order/checkout'
3
3
 
4
4
  module Spree
5
+ # The customers cart until completed, then acts as permenent record of the transaction.
6
+ #
7
+ # `Spree::Order` is the heart of the Solidus system, as it acts as the customer's
8
+ # cart as they shop. Once an order is complete, it serves as the
9
+ # permenent record of their purchase. It has many responsibilities:
10
+ #
11
+ # * Records and validates attributes like `total` and relationships like
12
+ # `Spree::LineItem` as an ActiveRecord model.
13
+ #
14
+ # * Implements a customizable state machine to manage the lifecycle of an order.
15
+ #
16
+ # * Implements business logic to provide a single interface for quesitons like
17
+ # `checkout_allowed?` or `payment_required?`.
18
+ #
19
+ # * Implements an interface for mutating the order with methods like
20
+ # `empty!` and `fulfill!`.
21
+ #
5
22
  class Order < Spree::Base
6
23
  ORDER_NUMBER_LENGTH = 9
7
24
  ORDER_NUMBER_LETTERS = false
@@ -93,7 +110,7 @@ module Spree
93
110
  before_create :link_by_email
94
111
 
95
112
  validates :email, presence: true, if: :require_email
96
- validates :email, email: true, if: :require_email, allow_blank: true
113
+ validates :email, email: true, allow_blank: true
97
114
  validates :number, presence: true, uniqueness: { allow_blank: true }
98
115
  validates :store_id, presence: true
99
116
 
@@ -210,8 +227,10 @@ module Spree
210
227
  # Returns the relevant zone (if any) to be used for taxation purposes.
211
228
  # Uses default tax zone unless there is a specific match
212
229
  def tax_zone
213
- @tax_zone ||= Zone.match(tax_address) || Zone.default_tax
230
+ Zone.match(tax_address) || Zone.default_tax
214
231
  end
232
+ deprecate tax_zone: "Please use Spree::Order#tax_address instead.",
233
+ deprecator: Spree::Deprecation
215
234
 
216
235
  # Returns the address for taxation based on configuration
217
236
  def tax_address
@@ -331,9 +350,11 @@ module Spree
331
350
 
332
351
  # Creates new tax charges if there are any applicable rates. If prices already
333
352
  # include taxes then price adjustments are created instead.
353
+ # @deprecated This now happens during #update!
334
354
  def create_tax_charge!
335
- Spree::Tax::OrderAdjuster.new(self).adjust!
355
+ Spree::Config.tax_adjuster_class.new(self).adjust!
336
356
  end
357
+ deprecate create_tax_charge!: :update!, deprecator: Spree::Deprecation
337
358
 
338
359
  def outstanding_balance
339
360
  # If reimbursement has happened add it back to total to prevent balance_due payment state
@@ -414,12 +435,10 @@ module Spree
414
435
  end
415
436
 
416
437
  def available_payment_methods
417
- @available_payment_methods ||= (
418
- PaymentMethod.available(:front_end, store: store) +
419
- PaymentMethod.available(:both, store: store)
420
- ).
421
- uniq.
422
- sort_by(&:position)
438
+ @available_payment_methods ||= Spree::PaymentMethod
439
+ .available_to_store(store)
440
+ .available_to_users
441
+ .sort_by(&:position)
423
442
  end
424
443
 
425
444
  def insufficient_stock_lines
@@ -572,11 +591,6 @@ module Spree
572
591
  !approved?
573
592
  end
574
593
 
575
- def reload(options = nil)
576
- remove_instance_variable(:@tax_zone) if defined?(@tax_zone)
577
- super
578
- end
579
-
580
594
  def quantity
581
595
  line_items.sum(:quantity)
582
596
  end
@@ -689,23 +703,6 @@ module Spree
689
703
  Spree::Money.new(total_available_store_credit - total_applicable_store_credit, { currency: currency })
690
704
  end
691
705
 
692
- def payments_attributes=(attributes)
693
- validate_payments_attributes(attributes)
694
- super(attributes)
695
- end
696
-
697
- def validate_payments_attributes(attributes)
698
- attributes = Array.wrap(attributes)
699
- # Ensure the payment methods specified are allowed for this user
700
- payment_methods = Spree::PaymentMethod.where(id: available_payment_methods)
701
- attributes.each do |payment_attributes|
702
- payment_method_id = payment_attributes[:payment_method_id]
703
-
704
- # raise RecordNotFound unless it is an allowed payment method
705
- payment_methods.find(payment_method_id) if payment_method_id
706
- end
707
- end
708
-
709
706
  private
710
707
 
711
708
  def associate_store
@@ -78,7 +78,6 @@ module Spree
78
78
 
79
79
  after_transition to: :complete, do: :add_payment_sources_to_wallet
80
80
  before_transition to: :payment, do: :set_shipments_cost
81
- before_transition to: :payment, do: :create_tax_charge!
82
81
  before_transition to: :payment, do: :assign_default_credit_card
83
82
 
84
83
  before_transition to: :confirm, do: :add_store_credit_payments
@@ -90,7 +89,6 @@ module Spree
90
89
  before_transition from: :cart, do: :ensure_line_items_present
91
90
 
92
91
  if states[:address]
93
- before_transition from: :address, do: :create_tax_charge!
94
92
  before_transition to: :address, do: :assign_default_addresses!
95
93
  before_transition from: :address, do: :persist_user_address!
96
94
  end
@@ -35,21 +35,7 @@ module Spree
35
35
  end
36
36
 
37
37
  def update_cart(params)
38
- # We need old_tax_address / new_tax_address because we can't rely on methods
39
- # offered by ActiveRecord::Dirty to determine if tax_address was updated
40
- # because if we update the address, a new record will be created
41
- # by the Address.factory instead of the old record being updated
42
-
43
- old_tax_address = order.tax_address
44
-
45
38
  if order.update_attributes(params)
46
-
47
- new_tax_address = order.tax_address
48
-
49
- if should_recalculate_taxes?(old_tax_address, new_tax_address)
50
- order.create_tax_charge!
51
- end
52
-
53
39
  unless order.completed?
54
40
  order.line_items = order.line_items.select { |li| li.quantity > 0 }
55
41
  # Update totals, then check if the order is eligible for any cart promotions.
@@ -84,36 +70,6 @@ module Spree
84
70
 
85
71
  private
86
72
 
87
- def should_recalculate_taxes?(old_address, new_address)
88
- # Related to Solidus issue #894
89
- # This is needed because if you update the shipping_address
90
- # from the backend on an order that completed checkout,
91
- # Taxes were not being recalculated if the Order tax zone
92
- # was updated
93
- #
94
- # Possible cases:
95
- #
96
- # Case 1:
97
- #
98
- # If old_address is a TaxLocation it means that the order has not passed
99
- # the address checkout state so taxes will be computed by the Order
100
- # state machine, so we do not calculate taxes here.
101
- #
102
- # Case 2 :
103
- # If new_address is a TaxLocation, but old_address is not, it means that
104
- # an order has somehow lost his TaxAddress. Since it's not supposed to happen,
105
- # we do not compute taxes.
106
- #
107
- # Case 3
108
- # Both old_address and new_address are Spree::Address so the order
109
- # has completed the checkout or that a registered user has updated his
110
- # default addresses. We need to recalculate the taxes.
111
-
112
- return if old_address.is_a?(Spree::Tax::TaxLocation) || new_address.is_a?(Spree::Tax::TaxLocation)
113
-
114
- old_address.try!(:taxation_attributes) != new_address.try!(:taxation_attributes)
115
- end
116
-
117
73
  def after_add_or_remove(line_item, options = {})
118
74
  reload_totals
119
75
  shipment = options[:shipment]
@@ -137,7 +93,6 @@ module Spree
137
93
  line_item ||= order.line_items.new(
138
94
  quantity: 0,
139
95
  variant: variant,
140
- currency: order.currency
141
96
  )
142
97
 
143
98
  line_item.quantity += quantity.to_i