Class: Spree::Adjustment

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

Overview

Adjustments represent a change to the item_total of an Order. Each adjustment has an amount that can be either positive or negative.

Adjustments can be “opened” or “closed”. Once an adjustment is closed, it will not be automatically updated.

Boolean attributes

  1. eligible?

    This boolean attributes stores whether this adjustment is currently eligible for its order. Only eligible adjustments count towards the order’s adjustment total. This allows an adjustment to be preserved if it becomes ineligible so it might be reinstated.

Instance Method Summary collapse

Methods included from DisplayMoney

money_methods

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

#cancellation?Boolean

Returns true when this is a cancellation adjustment (Cancellation adjustments have a UnitCancel source).

Returns:

  • (Boolean)

    true when this is a cancellation adjustment (Cancellation adjustments have a UnitCancel source)



143
144
145
# File 'app/models/spree/adjustment.rb', line 143

def cancellation?
  source_type == 'Spree::UnitCancel'
end

#closeObject



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

def close
  ActiveSupport::Deprecation.warn "Adjustment#close is deprecated. Instead use Adjustment#finalize", caller
  finalize
end

#close!Object



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

def close!
  ActiveSupport::Deprecation.warn "Adjustment#close! is deprecated. Instead use Adjustment#finalize!", caller
  finalize!
end

#closed?Boolean

Returns:

  • (Boolean)


102
103
104
105
# File 'app/models/spree/adjustment.rb', line 102

def closed?
  ActiveSupport::Deprecation.warn "Adjustment#closed? is deprecated. Instead use Adjustment#finalized?", caller
  finalized?
end

#currencyObject

End deprecated methods



128
129
130
# File 'app/models/spree/adjustment.rb', line 128

def currency
  adjustable ? adjustable.currency : Spree::Config[:currency]
end

#finalizeObject



71
72
73
# File 'app/models/spree/adjustment.rb', line 71

def finalize
  update_attributes(finalized: true)
end

#finalize!Object



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

def finalize!
  update_attributes!(finalized: true)
end

#openObject



107
108
109
110
# File 'app/models/spree/adjustment.rb', line 107

def open
  ActiveSupport::Deprecation.warn "Adjustment#open is deprecated. Instead use Adjustment#unfinalize", caller
  unfinalize
end

#open!Object



112
113
114
115
# File 'app/models/spree/adjustment.rb', line 112

def open!
  ActiveSupport::Deprecation.warn "Adjustment#open! is deprecated. Instead use Adjustment#unfinalize!", caller
  unfinalize!
end

#open?Boolean

Returns:

  • (Boolean)


97
98
99
100
# File 'app/models/spree/adjustment.rb', line 97

def open?
  ActiveSupport::Deprecation.warn "Adjustment#open? is deprecated. Instead use Adjustment#finalized?", caller
  !closed?
end

#promotion?Boolean

Returns true when this is a promotion adjustment (Promotion adjustments have a PromotionAction source).

Returns:

  • (Boolean)

    true when this is a promotion adjustment (Promotion adjustments have a PromotionAction source)



133
134
135
# File 'app/models/spree/adjustment.rb', line 133

def promotion?
  source_type == 'Spree::PromotionAction'
end

#stateObject

Deprecated methods



80
81
82
83
# File 'app/models/spree/adjustment.rb', line 80

def state
  ActiveSupport::Deprecation.warn "Adjustment#state is deprecated. Instead use Adjustment#finalized?", caller
  finalized? ? "closed" : "open"
end

#state=(new_state) ⇒ Object



85
86
87
88
89
90
91
92
93
94
95
# File 'app/models/spree/adjustment.rb', line 85

def state=(new_state)
  ActiveSupport::Deprecation.warn "Adjustment#state= is deprecated. Instead use Adjustment#finalized=", caller
  case new_state
  when "open"
    self.finalized = false
  when "closed"
    self.finalized = true
  else
    raise "invaliid adjustment state #{new_state}"
  end
end

#tax?Boolean

Returns true when this is a tax adjustment (Tax adjustments have a TaxRate source).

Returns:

  • (Boolean)

    true when this is a tax adjustment (Tax adjustments have a TaxRate source)



138
139
140
# File 'app/models/spree/adjustment.rb', line 138

def tax?
  source_type == 'Spree::TaxRate'
end

#unfinalizeObject



75
76
77
# File 'app/models/spree/adjustment.rb', line 75

def unfinalize
  update_attributes(finalized: false)
end

#unfinalize!Object



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

def unfinalize!
  update_attributes!(finalized: false)
end

#update!(target = nil) ⇒ BigDecimal

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.

Parameters:

Returns:

  • (BigDecimal)

    New amount of this adjustment



155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
# File 'app/models/spree/adjustment.rb', line 155

def update!(target = nil)
  if target
    ActiveSupport::Deprecation.warn("Passing a target to Adjustment#update! is deprecated. The adjustment will use the correct target from it's adjustable association.", caller)
  end
  return amount if finalized?

  # If the adjustment has no source, do not attempt to re-calculate the amount.
  # Chances are likely that this was a manually created adjustment in the admin backend.
  if source.present?
    self.amount = source.compute_amount(target || adjustable)

    if promotion?
      self.eligible = source.promotion.eligible?(adjustable, promotion_code: promotion_code)
    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.now) if changed?
  end
  amount
end