Class: Solidus::Returnly::Calculator
- Inherits:
-
Object
- Object
- Solidus::Returnly::Calculator
- Defined in:
- lib/solidus/returnly/calculator.rb
Instance Attribute Summary collapse
-
#line_items ⇒ Object
Returns the value of attribute line_items.
-
#order ⇒ Object
Returns the value of attribute order.
Class Method Summary collapse
Instance Method Summary collapse
- #calculate_tax(inventory_unit) ⇒ Object
- #calculated_estimate ⇒ Object
-
#initialize(order, line_items) ⇒ Calculator
constructor
A new instance of Calculator.
- #line_item(id) ⇒ Object
- #line_item_inventory_unit(line_item) ⇒ Object
- #line_items_return_items ⇒ Object
- #present_line_items ⇒ Object
- #requested_line_items ⇒ Object
- #returnable_inventory_units ⇒ Object
- #returnable_line_items ⇒ Object
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_items ⇒ Object
Returns the value of attribute line_items.
4 5 6 |
# File 'lib/solidus/returnly/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/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_estimate ⇒ Object
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_items ⇒ Object
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_items ⇒ Object
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_items ⇒ Object
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_units ⇒ Object
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_items ⇒ Object
91 92 93 |
# File 'lib/solidus/returnly/calculator.rb', line 91 def returnable_line_items @_line_items ||= returnable_inventory_units.map(&:line_item) end |