Class: Spree::StockLocation

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

Defined Under Namespace

Classes: InvalidMovementError

Instance Method Summary collapse

Methods inherited from Base

page

Methods included from Preferences::Preferable

#default_preferences, #defined_preferences, #get_preference, #has_preference!, #has_preference?, #preference_default, #preference_type, #set_preference

Instance Method Details

#backorderable?(variant) ⇒ Boolean

Returns:

  • (Boolean)


68
69
70
# File 'app/models/spree/stock_location.rb', line 68

def backorderable?(variant)
  stock_item(variant).try(:backorderable?)
end

#count_on_hand(variant) ⇒ Object



64
65
66
# File 'app/models/spree/stock_location.rb', line 64

def count_on_hand(variant)
  stock_item(variant).try(:count_on_hand)
end

#fill_status(variant, quantity) ⇒ Object



96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
# File 'app/models/spree/stock_location.rb', line 96

def fill_status(variant, quantity)
  if item = stock_item(variant)

    if item.count_on_hand >= quantity
      on_hand = quantity
      backordered = 0
    else
      on_hand = item.count_on_hand
      on_hand = 0 if on_hand < 0
      backordered = item.backorderable? ? (quantity - on_hand) : 0
    end

    [on_hand, backordered]
  else
    [0, 0]
  end
end

#move(variant, quantity, originator = nil) ⇒ Object



88
89
90
91
92
93
94
# File 'app/models/spree/stock_location.rb', line 88

def move(variant, quantity, originator = nil)
  if quantity < 1 && !stock_item(variant)
    raise InvalidMovementError.new(Spree.t(:negative_movement_absent_item))
  end
  stock_item_or_create(variant).stock_movements.create!(quantity: quantity,
                                                        originator: originator)
end

#propagate_variant(variant) ⇒ Object

Wrapper for creating a new stock item respecting the backorderable config



29
30
31
# File 'app/models/spree/stock_location.rb', line 29

def propagate_variant(variant)
  self.stock_items.create!(variant: variant, backorderable: self.backorderable_default)
end

#restock(variant, quantity, originator = nil) ⇒ Object



72
73
74
# File 'app/models/spree/stock_location.rb', line 72

def restock(variant, quantity, originator = nil)
  move(variant, quantity, originator)
end

#restock_backordered(variant, quantity, originator = nil) ⇒ Object



76
77
78
79
80
81
82
# File 'app/models/spree/stock_location.rb', line 76

def restock_backordered(variant, quantity, originator = nil)
  item = stock_item_or_create(variant)
  item.update_columns(
    count_on_hand: item.count_on_hand + quantity,
    updated_at: Time.now
  )
end

#set_up_stock_item(variant) ⇒ Object

Return either an existing stock item or create a new one. Useful in scenarios where the user might not know whether there is already a stock item for a given variant



36
37
38
# File 'app/models/spree/stock_location.rb', line 36

def set_up_stock_item(variant)
  self.stock_item(variant) || propagate_variant(variant)
end

#state_textObject



24
25
26
# File 'app/models/spree/stock_location.rb', line 24

def state_text
  state.try(:abbr) || state.try(:name) || state_name
end

#stock_item(variant_id) ⇒ StockItem

Returns an instance of StockItem for the variant id.

Parameters:

  • variant_id (String)

    The id of a variant.

Returns:

  • (StockItem)

    Corresponding StockItem for the StockLocation’s variant.



45
46
47
# File 'app/models/spree/stock_location.rb', line 45

def stock_item(variant_id)
  stock_items.where(variant_id: variant_id).order(:id).first
end

#stock_item_or_create(variant) ⇒ StockItem

Attempts to look up StockItem for the variant, and creates one if not found. This method accepts an id or instance of the variant since it is used in multiple ways. Other methods in this model attempt to pass a variant, but controller actions can pass just the variant id as a parameter.

Returns:

  • (StockItem)

    Corresponding StockItem for the StockLocation’s variant.



55
56
57
58
59
60
61
62
# File 'app/models/spree/stock_location.rb', line 55

def stock_item_or_create(variant)
  vid = if variant.is_a?(Variant)
    variant.id
  else
    variant
  end
  stock_item(vid) || stock_items.create(variant_id: vid)
end

#unstock(variant, quantity, originator = nil) ⇒ Object



84
85
86
# File 'app/models/spree/stock_location.rb', line 84

def unstock(variant, quantity, originator = nil)
  move(variant, -quantity, originator)
end