Class: Spree::OrderContents

Inherits:
Object
  • Object
show all
Defined in:
app/models/spree/order_contents.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(order) ⇒ OrderContents

Returns a new instance of OrderContents.



5
6
7
# File 'app/models/spree/order_contents.rb', line 5

def initialize(order)
  @order = order
end

Instance Attribute Details

#orderObject

Returns the value of attribute order.



3
4
5
# File 'app/models/spree/order_contents.rb', line 3

def order
  @order
end

Instance Method Details

#add(variant, quantity = 1, options = {}) ⇒ Spree::LineItem

Add a line items to the order if there is inventory to do so and populate Promotions

Parameters:

  • :options (Hash)

    Options for the adding proccess Valid options:

    shipment: [Spree::Shipment] LineItem target shipment
    stock_location_quantities:
      stock_location_id: The stock location to source from
    

Returns:



22
23
24
25
# File 'app/models/spree/order_contents.rb', line 22

def add(variant, quantity = 1, options = {})
  line_item = add_to_line_item(variant, quantity, options)
  after_add_or_remove(line_item, options)
end

#advanceObject



69
70
71
# File 'app/models/spree/order_contents.rb', line 69

def advance
  while @order.next; end
end

#approve(user: nil, name: nil) ⇒ Object



73
74
75
76
77
78
79
80
81
82
83
# File 'app/models/spree/order_contents.rb', line 73

def approve(user: nil, name: nil)
  if user.blank? && name.blank?
    raise ArgumentError, 'user or name must be specified'
  end

  order.update_attributes!(
    approver: user,
    approver_name: name,
    approved_at: Time.current
  )
end

#remove(variant, quantity = 1, options = {}) ⇒ Object



27
28
29
30
# File 'app/models/spree/order_contents.rb', line 27

def remove(variant, quantity = 1, options = {})
  line_item = remove_from_line_item(variant, quantity, options)
  after_add_or_remove(line_item, options)
end

#remove_line_item(line_item, options = {}) ⇒ Object



32
33
34
35
# File 'app/models/spree/order_contents.rb', line 32

def remove_line_item(line_item, options = {})
  order.line_items.destroy(line_item)
  after_add_or_remove(line_item, options)
end

#update_cart(params) ⇒ Object



37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
# File 'app/models/spree/order_contents.rb', line 37

def update_cart(params)
  # We need old_tax_address / new_tax_address because we can't rely on methods
  # offered by ActiveRecord::Dirty to determine if tax_address was updated
  # because if we update the address, a new record will be created
  # by the Address.factory instead of the old record being updated

  old_tax_address = order.tax_address

  if order.update_attributes(params)

    new_tax_address = order.tax_address

    if should_recalculate_taxes?(old_tax_address, new_tax_address)
      order.create_tax_charge!
    end

    unless order.completed?
      order.line_items = order.line_items.select { |li| li.quantity > 0 }
      # Update totals, then check if the order is eligible for any cart promotions.
      # If we do not update first, then the item total will be wrong and ItemTotal
      # promotion rules would not be triggered.
      reload_totals
      PromotionHandler::Cart.new(order).activate
      order.ensure_updated_shipments
    end
    reload_totals
    true
  else
    false
  end
end