Class: Spree::InventoryUnit

Inherits:
Object
  • Object
show all
Extended by:
DisplayMoney
Defined in:
app/models/spree/inventory_unit.rb

Class Method Summary collapse

Instance Method Summary collapse

Methods included from DisplayMoney

money_methods

Class Method Details

.backordered_for_stock_item(stock_item) ⇒ Object

This was refactored from a simpler query because the previous implementation led to issues once users tried to modify the objects returned. That’s due to ActiveRecord ‘joins(shipment: :stock_location)` only returning readonly objects

Returns an array of backordered inventory units as per a given stock item



57
58
59
60
61
# File 'app/models/spree/inventory_unit.rb', line 57

def self.backordered_for_stock_item(stock_item)
  backordered_per_variant(stock_item).select do |unit|
    unit.shipment.stock_location == stock_item.stock_location
  end
end

.finalize_units!Object



63
64
65
# File 'app/models/spree/inventory_unit.rb', line 63

def self.finalize_units!
  update_all(pending: false, updated_at: Time.current)
end

.split(original_inventory_unit, extract_quantity) ⇒ Object



71
72
73
74
75
76
# File 'app/models/spree/inventory_unit.rb', line 71

def self.split(original_inventory_unit, extract_quantity)
  split = original_inventory_unit.dup
  split.quantity = extract_quantity
  original_inventory_unit.quantity -= extract_quantity
  split
end

Instance Method Details

#additional_tax_totalObject



96
97
98
# File 'app/models/spree/inventory_unit.rb', line 96

def additional_tax_total
  line_item.additional_tax_total * percentage_of_line_item
end

#charged_amountObject



118
119
120
# File 'app/models/spree/inventory_unit.rb', line 118

def charged_amount
  percentage_of_line_item * line_item.pre_tax_amount
end

#current_or_new_return_itemObject



92
93
94
# File 'app/models/spree/inventory_unit.rb', line 92

def current_or_new_return_item
  Spree::ReturnItem.from_inventory_unit(self)
end

#exchanged_unit?Boolean

Returns:

  • (Boolean)


114
115
116
# File 'app/models/spree/inventory_unit.rb', line 114

def exchanged_unit?
  original_return_item_id?
end

#extract_singular_inventory!Object



88
89
90
# File 'app/models/spree/inventory_unit.rb', line 88

def extract_singular_inventory!
  split_inventory!(1)
end

#find_stock_itemObject



67
68
69
# File 'app/models/spree/inventory_unit.rb', line 67

def find_stock_item
  shipment.stock_location.stock_item_or_create(variant)
end

#included_tax_totalObject



100
101
102
# File 'app/models/spree/inventory_unit.rb', line 100

def included_tax_total
  line_item.included_tax_total * percentage_of_line_item
end

#percentage_of_line_itemObject



122
123
124
# File 'app/models/spree/inventory_unit.rb', line 122

def percentage_of_line_item
  quantity / BigDecimal(line_item.quantity)
end

#required_quantityObject



104
105
106
107
108
109
110
111
112
# File 'app/models/spree/inventory_unit.rb', line 104

def required_quantity
  return @required_quantity unless @required_quantity.nil?

  @required_quantity = if exchanged_unit?
                         original_return_item.return_quantity
                       else
                         line_item.quantity
                       end
end

#split_inventory!(extract_quantity) ⇒ Object

This will fail if extract >= available_quantity



79
80
81
82
83
84
85
86
# File 'app/models/spree/inventory_unit.rb', line 79

def split_inventory!(extract_quantity)
  split = self.class.split(self, extract_quantity)
  transaction do
    split.save!
    save!
  end
  split
end