Class: Spree::ReturnItem

Inherits:
Base
  • Object
show all
Extended by:
DisplayMoney
Defined in:
core/app/models/spree/return_item.rb,
core/app/models/spree/return_item/eligibility_validator/default.rb,
core/app/models/spree/return_item/eligibility_validator/rma_required.rb,
core/app/models/spree/return_item/eligibility_validator/base_validator.rb,
core/app/models/spree/return_item/eligibility_validator/order_completed.rb,
core/app/models/spree/return_item/eligibility_validator/inventory_shipped.rb,
core/app/models/spree/return_item/eligibility_validator/no_reimbursements.rb,
core/app/models/spree/return_item/eligibility_validator/time_since_purchase.rb,
core/app/models/spree/return_item/exchange_variant_eligibility/same_product.rb,
core/app/models/spree/return_item/exchange_variant_eligibility/same_option_value.rb

Defined Under Namespace

Modules: EligibilityValidator, ExchangeVariantEligibility

Constant Summary collapse

INTERMEDIATE_RECEPTION_STATUSES =
%i(given_to_customer lost_in_transit shipped_wrong_item short_shipped in_transit)
COMPLETED_RECEPTION_STATUSES =
INTERMEDIATE_RECEPTION_STATUSES + [:received]

Class Attribute Summary collapse

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Methods included from DisplayMoney

money_methods

Methods inherited from Base

display_includes, #initialize_preference_defaults, page, preference

Class Attribute Details

.exchange_variant_engineClass

Configurable engine for determining which variants can be exchanged for a given variant.

Returns:

  • (Class)


21
# File 'core/app/models/spree/return_item.rb', line 21

class_attribute :exchange_variant_engine

.refund_amount_calculatorClass

Configurable calculator for determining the amount ro refund when refunding.

Returns:

  • (Class)


29
# File 'core/app/models/spree/return_item.rb', line 29

class_attribute :refund_amount_calculator

.return_eligibility_validatorClass

Configurable validator for determining whether given return item is eligible for return.

Returns:

  • (Class)


13
# File 'core/app/models/spree/return_item.rb', line 13

class_attribute :return_eligibility_validator

Instance Attribute Details

#skip_customer_return_processingObject

Returns the value of attribute skip_customer_return_processing



94
95
96
# File 'core/app/models/spree/return_item.rb', line 94

def skip_customer_return_processing
  @skip_customer_return_processing
end

Class Method Details

.from_inventory_unit(inventory_unit) ⇒ Spree::ReturnItem

Returns a valid return item for the given inventory unit if one exists, or a new one if one does not

Parameters:

Returns:

  • (Spree::ReturnItem)

    a valid return item for the given inventory unit if one exists, or a new one if one does not



100
101
102
103
# File 'core/app/models/spree/return_item.rb', line 100

def self.from_inventory_unit(inventory_unit)
  valid.find_by(inventory_unit: inventory_unit) ||
    new(inventory_unit: inventory_unit).tap(&:set_default_amount)
end

Instance Method Details

#build_exchange_inventory_unitObject

Builds the exchange inventory unit for this return item, only if an exchange is required, correctly associating the variant, line item and order.



146
147
148
149
150
151
152
153
# File 'core/app/models/spree/return_item.rb', line 146

def build_exchange_inventory_unit
  # The inventory unit needs to have the new variant
  # but it also needs to know the original line item
  # for pricing information for if the inventory unit is
  # ever returned. This means that the inventory unit's line_item
  # will have a different variant than the inventory unit itself
  super(variant: exchange_variant, line_item: inventory_unit.line_item) if exchange_required?
end

#eligible_exchange_variants(stock_locations = nil) ⇒ ActiveRecord::Relation<Spree::Variant>

Note:

This uses the exchange_variant_engine configured on the class.

Returns the variants eligible for exchange for this return item

Parameters:

Returns:

  • (ActiveRecord::Relation<Spree::Variant>)

    the variants eligible for exchange for this return item



139
140
141
# File 'core/app/models/spree/return_item.rb', line 139

def eligible_exchange_variants(stock_locations = nil)
  exchange_variant_engine.eligible_variants(variant, stock_locations: stock_locations)
end

#exchange_processed?Boolean

True when an exchange has been processed for this return item

Returns:

  • (Boolean)

    true when an exchange has been processed for this return item



113
114
115
# File 'core/app/models/spree/return_item.rb', line 113

def exchange_processed?
  exchange_inventory_unit.present?
end

#exchange_requested?Boolean

Returns true when an exchange has been requested on this return item

Returns:

  • (Boolean)

    true when an exchange has been requested on this return item



107
108
109
# File 'core/app/models/spree/return_item.rb', line 107

def exchange_requested?
  exchange_variant.present?
end

#exchange_required?Boolean

Returns true when an exchange has been requested but has yet to be processed

Returns:

  • (Boolean)

    true when an exchange has been requested but has yet to be processed



119
120
121
# File 'core/app/models/spree/return_item.rb', line 119

def exchange_required?
  exchange_requested? && !exchange_processed?
end

#exchange_shipmentSpree::Shipment?

Returns the exchange inventory unit's shipment if it exists

Returns:

  • (Spree::Shipment, nil)

    the exchange inventory unit's shipment if it exists



156
157
158
# File 'core/app/models/spree/return_item.rb', line 156

def exchange_shipment
  exchange_inventory_unit.try(:shipment)
end

#part_of_exchange?Boolean

Returns:

  • (Boolean)


181
182
183
184
185
# File 'core/app/models/spree/return_item.rb', line 181

def part_of_exchange?
  # test whether this ReturnItem was either a) one for which an exchange was sent or
  #   b) the exchanged item itself being returned in lieu of the original item
  exchange_requested? || sibling_intended_for_exchange('unexchanged')
end

#potential_reception_transitionsObject



168
169
170
171
172
173
174
175
176
177
178
179
# File 'core/app/models/spree/return_item.rb', line 168

def potential_reception_transitions
  status_paths = reception_status_paths.to_states
  event_paths = reception_status_paths.events
  status_paths.delete(:cancelled)
  status_paths.delete(:expired)
  status_paths.delete(:unexchanged)
  event_paths.delete(:cancel)
  event_paths.delete(:expired)
  event_paths.delete(:unexchange)

  status_paths.map{ |s| I18n.t("spree.reception_states.#{s}", default: s.to_s.humanize) }.zip(event_paths)
end

#reception_completed?Boolean

Returns true when this retur item is in a complete reception state

Returns:

  • (Boolean)

    true when this retur item is in a complete reception state



89
90
91
# File 'core/app/models/spree/return_item.rb', line 89

def reception_completed?
  COMPLETED_RECEPTION_STATUSES.map(&:to_s).include?(reception_status.to_s)
end

#set_default_amountObject

Note:

This uses the configured refund_amount_calculator configured on the class.

Calculates and sets the default amount to be refunded.



164
165
166
# File 'core/app/models/spree/return_item.rb', line 164

def set_default_amount
  self.amount = refund_amount_calculator.new.compute(self)
end

#totalBigDecimal

Returns the cost of the item after tax

Returns:

  • (BigDecimal)

    the cost of the item after tax



124
125
126
# File 'core/app/models/spree/return_item.rb', line 124

def total
  amount + additional_tax_total
end

#total_excluding_vatBigDecimal Also known as: pre_tax_amount

Returns the cost of the item before VAT tax

Returns:

  • (BigDecimal)

    the cost of the item before VAT tax



129
130
131
# File 'core/app/models/spree/return_item.rb', line 129

def total_excluding_vat
  amount - included_tax_total
end