Class: Spree::OrderUpdater
- Inherits:
-
Object
- Object
- Spree::OrderUpdater
- Defined in:
- app/models/spree/order_updater.rb
Instance Attribute Summary collapse
-
#order ⇒ Object
readonly
Returns the value of attribute order.
Instance Method Summary collapse
-
#initialize(order) ⇒ OrderUpdater
constructor
A new instance of OrderUpdater.
- #persist_totals ⇒ Object
- #recalculate_adjustments ⇒ Object
- #run_hooks ⇒ Object
-
#update ⇒ Object
This is a multi-purpose method for processing logic related to changes in the Order.
- #update_adjustment_total ⇒ Object
- #update_item_count ⇒ Object
- #update_item_total ⇒ Object
- #update_order_total ⇒ Object
-
#update_payment_state ⇒ Object
Updates the
payment_state
attribute according to the following logic:. - #update_payment_total ⇒ Object
-
#update_shipment_state ⇒ Object
Updates the
shipment_state
attribute according to the following logic:. - #update_shipment_total ⇒ Object
-
#update_shipments ⇒ Object
give each of the shipments a chance to update themselves.
-
#update_totals ⇒ Object
Updates the following Order total values:.
Constructor Details
#initialize(order) ⇒ OrderUpdater
Returns a new instance of OrderUpdater.
6 7 8 |
# File 'app/models/spree/order_updater.rb', line 6 def initialize(order) @order = order end |
Instance Attribute Details
#order ⇒ Object (readonly)
Returns the value of attribute order.
3 4 5 |
# File 'app/models/spree/order_updater.rb', line 3 def order @order end |
Instance Method Details
#persist_totals ⇒ Object
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 |
# File 'app/models/spree/order_updater.rb', line 88 def persist_totals order.update_columns( payment_state: order.payment_state, shipment_state: order.shipment_state, item_total: order.item_total, item_count: order.item_count, adjustment_total: order.adjustment_total, included_tax_total: order.included_tax_total, additional_tax_total: order.additional_tax_total, payment_total: order.payment_total, shipment_total: order.shipment_total, total: order.total, updated_at: Time.now, ) end |
#recalculate_adjustments ⇒ Object
32 33 34 |
# File 'app/models/spree/order_updater.rb', line 32 def recalculate_adjustments all_adjustments.includes(:adjustable).map(&:adjustable).uniq.each { |adjustable| Spree::ItemAdjustments.new(adjustable).update } end |
#run_hooks ⇒ Object
28 29 30 |
# File 'app/models/spree/order_updater.rb', line 28 def run_hooks update_hooks.each { |hook| order.send hook } end |
#update ⇒ Object
This is a multi-purpose method for processing logic related to changes in the Order. It is meant to be called from various observers so that the Order is aware of changes that affect totals and other values stored in the Order.
This method should never do anything to the Order that results in a save call on the object with callbacks (otherwise you will end up in an infinite recursion as the associations try to save and then in turn try to call update!
again.)
17 18 19 20 21 22 23 24 25 26 |
# File 'app/models/spree/order_updater.rb', line 17 def update update_totals if order.completed? update_payment_state update_shipments update_shipment_state end run_hooks persist_totals end |
#update_adjustment_total ⇒ Object
68 69 70 71 72 73 74 75 76 77 |
# File 'app/models/spree/order_updater.rb', line 68 def update_adjustment_total recalculate_adjustments order.adjustment_total = line_items.sum(:adjustment_total) + shipments.sum(:adjustment_total) + adjustments.eligible.sum(:amount) order.included_tax_total = line_items.sum(:included_tax_total) + shipments.sum(:included_tax_total) order.additional_tax_total = line_items.sum(:additional_tax_total) + shipments.sum(:additional_tax_total) update_order_total end |
#update_item_count ⇒ Object
79 80 81 |
# File 'app/models/spree/order_updater.rb', line 79 def update_item_count order.item_count = line_items.sum(:quantity) end |
#update_item_total ⇒ Object
83 84 85 86 |
# File 'app/models/spree/order_updater.rb', line 83 def update_item_total order.item_total = line_items.sum('price * quantity') update_order_total end |
#update_order_total ⇒ Object
64 65 66 |
# File 'app/models/spree/order_updater.rb', line 64 def update_order_total order.total = order.item_total + order.shipment_total + order.adjustment_total end |
#update_payment_state ⇒ Object
Updates the payment_state
attribute according to the following logic:
paid when payment_total
is equal to total
balance_due when payment_total
is less than total
credit_owed when payment_total
is greater than total
failed when most recent payment is in the failed state
The payment_state
value helps with reporting, etc. since it provides a quick and easy way to locate Orders needing attention.
146 147 148 149 150 151 152 153 154 155 156 |
# File 'app/models/spree/order_updater.rb', line 146 def update_payment_state last_state = order.payment_state if payments.present? && payments.last.state == 'failed' order.payment_state = 'failed' else order.payment_state = 'balance_due' if order.outstanding_balance > 0 order.payment_state = 'credit_owed' if order.outstanding_balance < 0 order.payment_state = 'paid' if !order.outstanding_balance? end order.state_changed('payment') if last_state != order.payment_state end |
#update_payment_total ⇒ Object
55 56 57 |
# File 'app/models/spree/order_updater.rb', line 55 def update_payment_total order.payment_total = payments.completed.sum(:amount) end |
#update_shipment_state ⇒ Object
Updates the shipment_state
attribute according to the following logic:
shipped when all Shipments are in the “shipped” state partial when at least one Shipment has a state of “shipped” and there is another Shipment with a state other than “shipped”
or there are InventoryUnits associated with the order that have a state of "sold" but are not associated with a Shipment.
ready when all Shipments are in the “ready” state backorder when there is backordered inventory associated with an order pending when all Shipments are in the “pending” state
The shipment_state
value helps with reporting, etc. since it provides a quick and easy way to locate Orders needing attention.
114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 |
# File 'app/models/spree/order_updater.rb', line 114 def update_shipment_state if order.backordered? order.shipment_state = 'backorder' else # get all the shipment states for this order shipment_states = shipments.states if shipment_states.size > 1 # multiple shiment states means it's most likely partially shipped order.shipment_state = 'partial' else # will return nil if no shipments are found order.shipment_state = shipment_states.first # TODO inventory unit states? # if order.shipment_state && order.inventory_units.where(:shipment_id => nil).exists? # shipments exist but there are unassigned inventory units # order.shipment_state = 'partial' # end end end order.state_changed('shipment') order.shipment_state end |
#update_shipment_total ⇒ Object
59 60 61 62 |
# File 'app/models/spree/order_updater.rb', line 59 def update_shipment_total order.shipment_total = shipments.sum(:cost) update_order_total end |
#update_shipments ⇒ Object
give each of the shipments a chance to update themselves
51 52 53 |
# File 'app/models/spree/order_updater.rb', line 51 def update_shipments shipments.each { |shipment| shipment.update!(order) } end |
#update_totals ⇒ Object
Updates the following Order total values:
payment_total
The total value of all finalized Payments (NOTE: non-finalized Payments are excluded) item_total
The total value of all LineItems adjustment_total
The total value of all adjustments (promotions, credits, etc.) total
The so-called “order total.” This is equivalent to item_total
plus adjustment_total
.
42 43 44 45 46 47 |
# File 'app/models/spree/order_updater.rb', line 42 def update_totals update_payment_total update_item_total update_shipment_total update_adjustment_total end |