Class: Spree::Shipment
- Inherits:
-
ActiveRecord::Base
- Object
- ActiveRecord::Base
- Spree::Shipment
- Defined in:
- app/models/spree/shipment.rb
Instance Attribute Summary collapse
-
#special_instructions ⇒ Object
Returns the value of attribute special_instructions.
Instance Method Summary collapse
- #add_shipping_method(shipping_method, selected = false) ⇒ Object
- #after_cancel ⇒ Object
- #after_resume ⇒ Object
- #backordered? ⇒ Boolean
-
#cost ⇒ Object
(also: #amount)
The adjustment amount associated with this shipment (if any.) Returns only the first adjustment to match the shipment but there should never really be more than one.
- #currency ⇒ Object
-
#determine_state(order) ⇒ Object
Determines the appropriate
state
according to the following logic:. - #display_cost ⇒ Object (also: #display_amount)
- #display_item_cost ⇒ Object
- #display_total_cost ⇒ Object
- #editable_by?(user) ⇒ Boolean
- #finalize! ⇒ Object
- #include?(variant) ⇒ Boolean
- #inventory_units_for(variant) ⇒ Object
- #item_cost ⇒ Object
- #line_items ⇒ Object
- #manifest ⇒ Object
- #refresh_rates ⇒ Object
- #selected_shipping_rate ⇒ Object
- #selected_shipping_rate_id ⇒ Object
- #selected_shipping_rate_id=(id) ⇒ Object
- #set_up_inventory(state, variant, order) ⇒ Object
- #shipped=(value) ⇒ Object
- #shipping_method ⇒ Object
- #to_package ⇒ Object
- #to_param ⇒ Object
- #total_cost ⇒ Object
- #tracking_url ⇒ Object
-
#update!(order) ⇒ Object
Updates various aspects of the Shipment while bypassing any callbacks.
Instance Attribute Details
#special_instructions ⇒ Object
Returns the value of attribute special_instructions.
18 19 20 |
# File 'app/models/spree/shipment.rb', line 18 def special_instructions @special_instructions end |
Instance Method Details
#add_shipping_method(shipping_method, selected = false) ⇒ Object
85 86 87 |
# File 'app/models/spree/shipment.rb', line 85 def add_shipping_method(shipping_method, selected = false) shipping_rates.create(shipping_method: shipping_method, selected: selected) end |
#after_cancel ⇒ Object
181 182 183 |
# File 'app/models/spree/shipment.rb', line 181 def after_cancel manifest.each { |item| manifest_restock(item) } end |
#after_resume ⇒ Object
185 186 187 |
# File 'app/models/spree/shipment.rb', line 185 def after_resume manifest.each { |item| manifest_unstock(item) } end |
#backordered? ⇒ Boolean
72 73 74 |
# File 'app/models/spree/shipment.rb', line 72 def backordered? inventory_units.any? { |inventory_unit| inventory_unit.backordered? } end |
#cost ⇒ Object Also known as: amount
The adjustment amount associated with this shipment (if any.) Returns only the first adjustment to match the shipment but there should never really be more than one.
128 129 130 |
# File 'app/models/spree/shipment.rb', line 128 def cost adjustment ? adjustment.amount : 0 end |
#currency ⇒ Object
122 123 124 |
# File 'app/models/spree/shipment.rb', line 122 def currency order ? order.currency : Spree::Config[:currency] end |
#determine_state(order) ⇒ Object
Determines the appropriate state
according to the following logic:
pending unless order is complete and order.payment_state
is paid
shipped if already shipped (ie. does not change the state) ready all other cases
204 205 206 207 208 209 210 |
# File 'app/models/spree/shipment.rb', line 204 def determine_state(order) return 'canceled' if order.canceled? return 'pending' unless order.can_ship? return 'pending' if inventory_units.any? &:backordered? return 'shipped' if state == 'shipped' order.paid? ? 'ready' : 'pending' end |
#display_cost ⇒ Object Also known as: display_amount
134 135 136 |
# File 'app/models/spree/shipment.rb', line 134 def display_cost Spree::Money.new(cost, { currency: currency }) end |
#display_item_cost ⇒ Object
144 145 146 |
# File 'app/models/spree/shipment.rb', line 144 def display_item_cost Spree::Money.new(item_cost, { currency: currency }) end |
#display_total_cost ⇒ Object
152 153 154 |
# File 'app/models/spree/shipment.rb', line 152 def display_total_cost Spree::Money.new(total_cost, { currency: currency }) end |
#editable_by?(user) ⇒ Boolean
156 157 158 |
# File 'app/models/spree/shipment.rb', line 156 def editable_by?(user) !shipped? end |
#finalize! ⇒ Object
176 177 178 179 |
# File 'app/models/spree/shipment.rb', line 176 def finalize! InventoryUnit.finalize_units!(inventory_units) manifest.each { |item| manifest_unstock(item) } end |
#include?(variant) ⇒ Boolean
216 217 218 |
# File 'app/models/spree/shipment.rb', line 216 def include?(variant) inventory_units_for(variant).present? end |
#inventory_units_for(variant) ⇒ Object
220 221 222 |
# File 'app/models/spree/shipment.rb', line 220 def inventory_units_for(variant) inventory_units.group_by(&:variant_id)[variant.id] || [] end |
#item_cost ⇒ Object
140 141 142 |
# File 'app/models/spree/shipment.rb', line 140 def item_cost line_items.map(&:amount).sum end |
#line_items ⇒ Object
168 169 170 171 172 173 174 |
# File 'app/models/spree/shipment.rb', line 168 def line_items if order.complete? and Spree::Config[:track_inventory_levels] order.line_items.select { |li| inventory_units.pluck(:variant_id).include?(li.variant_id) } else order.line_items end end |
#manifest ⇒ Object
160 161 162 163 164 165 166 |
# File 'app/models/spree/shipment.rb', line 160 def manifest inventory_units.joins(:variant).includes(:variant).group_by(&:variant).map do |variant, units| states = {} units.group_by(&:state).each { |state, iu| states[state] = iu.count } OpenStruct.new(variant: variant, quantity: units.length, states: states) end end |
#refresh_rates ⇒ Object
103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 |
# File 'app/models/spree/shipment.rb', line 103 def refresh_rates return shipping_rates if shipped? return [] unless can_get_rates? # StockEstimator.new assigment below will replace the current shipping_method original_shipping_method_id = shipping_method.try(:id) self.shipping_rates = Stock::Estimator.new(order).shipping_rates(to_package) if shipping_method selected_rate = shipping_rates.detect { |rate| rate.shipping_method_id == original_shipping_method_id } self.selected_shipping_rate_id = selected_rate.id if selected_rate end shipping_rates end |
#selected_shipping_rate ⇒ Object
89 90 91 |
# File 'app/models/spree/shipment.rb', line 89 def selected_shipping_rate shipping_rates.where(selected: true).first end |
#selected_shipping_rate_id ⇒ Object
93 94 95 |
# File 'app/models/spree/shipment.rb', line 93 def selected_shipping_rate_id selected_shipping_rate.try(:id) end |
#selected_shipping_rate_id=(id) ⇒ Object
97 98 99 100 101 |
# File 'app/models/spree/shipment.rb', line 97 def selected_shipping_rate_id=(id) shipping_rates.update_all(selected: false) shipping_rates.update(id, selected: true) self.save! end |
#set_up_inventory(state, variant, order) ⇒ Object
232 233 234 235 236 237 |
# File 'app/models/spree/shipment.rb', line 232 def set_up_inventory(state, variant, order) self.inventory_units.create( { variant_id: variant.id, state: state, order_id: order.id }, without_protection: true ) end |
#shipped=(value) ⇒ Object
76 77 78 79 |
# File 'app/models/spree/shipment.rb', line 76 def shipped=(value) return unless value == '1' && shipped_at.nil? self.shipped_at = Time.now end |
#shipping_method ⇒ Object
81 82 83 |
# File 'app/models/spree/shipment.rb', line 81 def shipping_method selected_shipping_rate.try(:shipping_method) || shipping_rates.first.try(:shipping_method) end |
#to_package ⇒ Object
224 225 226 227 228 229 230 |
# File 'app/models/spree/shipment.rb', line 224 def to_package package = Stock::Package.new(stock_location, order) inventory_units.includes(:variant).each do |inventory_unit| package.add inventory_unit.variant, 1, inventory_unit.state_name end package end |
#to_param ⇒ Object
68 69 70 |
# File 'app/models/spree/shipment.rb', line 68 def to_param number end |
#total_cost ⇒ Object
148 149 150 |
# File 'app/models/spree/shipment.rb', line 148 def total_cost cost + item_cost end |
#tracking_url ⇒ Object
212 213 214 |
# File 'app/models/spree/shipment.rb', line 212 def tracking_url @tracking_url ||= shipping_method.build_tracking_url(tracking) end |
#update!(order) ⇒ Object
Updates various aspects of the Shipment while bypassing any callbacks. Note that this method takes an explicit reference to the Order object. This is necessary because the association actually has a stale (and unsaved) copy of the Order and so it will not yield the correct results.
192 193 194 195 196 197 |
# File 'app/models/spree/shipment.rb', line 192 def update!(order) old_state = state new_state = determine_state(order) update_column :state, new_state after_ship if new_state == 'shipped' and old_state != 'shipped' end |