Class: Solidus::Returnly::Calculator

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

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(order, line_items) ⇒ Calculator

Returns a new instance of Calculator.



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

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

Instance Attribute Details

#line_itemsObject

Returns the value of attribute line_items.



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

def line_items
  @line_items
end

#orderObject

Returns the value of attribute order.



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

def order
  @order
end

Class Method Details

.process(order, line_items) ⇒ Object



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

def self.process(order, line_items)
  new(order, line_items).calculated_estimate
end

Instance Method Details

#calculate_tax(inventory_unit) ⇒ Object



47
48
49
50
51
# File 'lib/solidus/returnly/calculator.rb', line 47

def calculate_tax(inventory_unit)
  return_item = Spree::ReturnItem.from_inventory_unit(inventory_unit)
  (return_item.amount <= 0) ? 0 : return_item.amount /
      Spree::ReturnItem.refund_amount_calculator.new.compute(return_item)
end

#calculated_estimateObject



15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/solidus/returnly/calculator.rb', line 15

def calculated_estimate
  total = line_items_return_items.values.sum {|iu| iu.sum(&:pre_tax_amount)}

  tax_amount = returnable_inventory_units.sum do |inventory_unit|
    calculate_tax inventory_unit
  end

  {
      total_amount: total,
      subtotal_amount: total - tax_amount,
      tax_amount: tax_amount,
      discount_amount: order.promo_total,
      shipping_amount: order.shipment_total,
      line_items: present_line_items
  }
end

#line_item(id) ⇒ Object



81
82
83
# File 'lib/solidus/returnly/calculator.rb', line 81

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

#line_item_inventory_unit(line_item) ⇒ Object



77
78
79
# File 'lib/solidus/returnly/calculator.rb', line 77

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_itemsObject



54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/solidus/returnly/calculator.rb', line 54

def line_items_return_items
  found_return_items = {}

  self.line_items.each do |line_item|
    quantity = line_item[:quantity].to_i

    if quantity > 0
      available_inventory_units = line_item_inventory_unit(line_item).slice(0, quantity)

      available_inventory_units.each do |inventory_unit|
        found_return_items[line_item[:order_line_item_id]] ||= []
        found_return_items[line_item[:order_line_item_id]] << Spree::ReturnItem.new({amount: inventory_unit.line_item.price,
                                                                                     acceptance_status: 'accepted',
                                                                                     inventory_unit_id: inventory_unit.id,
                                                                                     reception_status_event: 'receive'
                                                                                    })
      end
    end
  end

  found_return_items
end

#present_line_itemsObject



32
33
34
35
36
37
38
39
40
41
42
43
44
# File 'lib/solidus/returnly/calculator.rb', line 32

def present_line_items
  line_items_return_items.map do |line_item_id, inventory_units|
    line_item = line_item(line_item_id)

    {
        order_line_item_id: line_item.id,
        quantity: inventory_units.size,
        total_amount: inventory_units.sum(&:amount),
        tax_amount: line_item.included_tax_total,
        discount_amount: line_item.adjustment_total,
    }
  end
end

#requested_line_itemsObject



95
96
97
# File 'lib/solidus/returnly/calculator.rb', line 95

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

#returnable_inventory_unitsObject



85
86
87
88
89
# File 'lib/solidus/returnly/calculator.rb', line 85

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_itemsObject



91
92
93
# File 'lib/solidus/returnly/calculator.rb', line 91

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