Method: Spree::Adjustment#recalculate

Defined in:
app/models/spree/adjustment.rb

#recalculateBigDecimal

Recalculate and persist the amount from this adjustment’s source based on the adjustable (Order, Shipment, or LineItem)

If the adjustment has no source (such as when created manually from the admin) or is closed, this is a noop.

Returns:

  • (BigDecimal)

    New amount of this adjustment



101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
# File 'app/models/spree/adjustment.rb', line 101

def recalculate
  if finalized? && !tax?
    return amount
  end

  # If the adjustment has no source, do not attempt to re-calculate the
  # amount.
  # Some scenarios where this happens:
  #   - Adjustments that are manually created via the admin backend
  #   - PromotionAction adjustments where the PromotionAction was deleted
  #     after the order was completed.
  if source.present?
    self.amount = source.compute_amount(adjustable)

    if promotion?
      self.eligible = calculate_eligibility
    end

    # Persist only if changed
    # This is only not a save! to avoid the extra queries to load the order
    # (for validations) and to touch the adjustment.
    update_columns(eligible: eligible, amount: amount, updated_at: Time.current) if changed?
  end
  amount
end