Class: Solidus::Returnly::RefundCalculator

Inherits:
Object
  • Object
show all
Defined in:
lib/solidus/returnly/refund_calculator.rb

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(order, line_items) ⇒ RefundCalculator

Returns a new instance of RefundCalculator.



10
11
12
13
# File 'lib/solidus/returnly/refund_calculator.rb', line 10

def initialize(order, line_items)
  self.line_items = line_items
  self.order = order
end

Instance Attribute Details

#line_items ⇒ Object

Returns the value of attribute line_items.



4
5
6
# File 'lib/solidus/returnly/refund_calculator.rb', line 4

def line_items
  @line_items
end

#order ⇒ Object

Returns the value of attribute order.



4
5
6
# File 'lib/solidus/returnly/refund_calculator.rb', line 4

def order
  @order
end

Class Method Details

.process(order, line_items) ⇒ Object



6
7
8
# File 'lib/solidus/returnly/refund_calculator.rb', line 6

def self.process(order, line_items)
  RefundPresenter.present_estimate new(order, line_items)
end

Instance Method Details

#line_item(id) ⇒ Object



48
49
50
# File 'lib/solidus/returnly/refund_calculator.rb', line 48

def line_item(id)
  returnable_line_items.find { |i| i.id == id.to_i }
end

#line_item_inventory_unit(line_item) ⇒ Object



44
45
46
# File 'lib/solidus/returnly/refund_calculator.rb', line 44

def line_item_inventory_unit(line_item)
  returnable_inventory_units.select { |iu| iu.line_item_id == line_item[:order_line_item_id].to_i }
end

#line_items_return_items ⇒ Object



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
# File 'lib/solidus/returnly/refund_calculator.rb', line 28

def line_items_return_items
  found_return_items = {}

  line_items.each do |line_item|
    with_available_inventory_units line_item do |inventory_unit, quantity|
      next unless quantity > 0

      found_return_items[line_item[:order_line_item_id]] ||= []
      return_item = create_return_item(inventory_unit)
      found_return_items[line_item[:order_line_item_id]] << set_tax(return_item)
    end
  end

  found_return_items
end

#requested_line_items ⇒ Object



62
63
64
# File 'lib/solidus/returnly/refund_calculator.rb', line 62

def requested_line_items
  line_items.map { |item| item[:order_line_item_id] }
end

#returnable_inventory_units ⇒ Object



52
53
54
55
56
# File 'lib/solidus/returnly/refund_calculator.rb', line 52

def returnable_inventory_units
  @_inventory_units ||= order.inventory_units.includes(:line_item)
                            .where(line_item_id: requested_line_items)
                            .where('state is not "returned"')
end

#returnable_line_items ⇒ Object



58
59
60
# File 'lib/solidus/returnly/refund_calculator.rb', line 58

def returnable_line_items
  @_line_items ||= returnable_inventory_units.map(&:line_item)
end

#set_tax(return_item) ⇒ Object



15
16
17
18
19
20
21
22
23
24
25
26
# File 'lib/solidus/returnly/refund_calculator.rb', line 15

def set_tax(return_item)
  percent_of_tax = (return_item.amount <= 0) ? 0 : return_item.amount /
    Spree::ReturnItem.refund_amount_calculator.new.compute(return_item)

  additional_tax_total = percent_of_tax * return_item.inventory_unit.additional_tax_total
  included_tax_total   = percent_of_tax * return_item.inventory_unit.included_tax_total

  return_item.additional_tax_total = additional_tax_total
  return_item.included_tax_total = included_tax_total

  return_item
end