solidus-returnly 0.8.1 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -0
- data/lib/returnly.rb +2 -0
- data/lib/returnly/builders/customer_return.rb +28 -0
- data/lib/returnly/builders/return_item.rb +42 -0
- data/lib/returnly/engine.rb +5 -4
- data/lib/returnly/refund_calculator.rb +21 -63
- data/lib/returnly/refund_presenter.rb +0 -22
- data/lib/returnly/refunder.rb +7 -11
- data/lib/returnly/refunds_configuration.rb +4 -0
- data/lib/returnly/version.rb +1 -1
- metadata +4 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 47ed17c5959d2c1e1f2210d1881f1322627cd2eb
|
4
|
+
data.tar.gz: fdccd81627f2e2f086fe2e797d99759328212b1a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: b683d9cd40b4104862c419964f11d09998bf3ba5e7a174fa667ca9e3e53a2b2eec3dae27b78016a5195f4565a1d8f4b50434a976f3dfad311cf90f9f357307ca
|
7
|
+
data.tar.gz: c606673074120c983143a2118bf2f1e6971443a210df6d617da78e4da0b41f6545dfdfd6a9f317a52e6731083ac78afe75c89d033bdb1d14ed4b16beb669f2e6
|
data/README.md
CHANGED
@@ -195,6 +195,7 @@ Returnly.configure do |config|
|
|
195
195
|
config.refund_calculator = CustomRefunderCalculator
|
196
196
|
config.reimbursement_type_no_items = CustomOriginalPaymentNoItems
|
197
197
|
config.refund_presenter = CustomRefundPresenter
|
198
|
+
config.return_item_builder = CustomReturnItemBuilder
|
198
199
|
end
|
199
200
|
```
|
200
201
|
|
data/lib/returnly.rb
CHANGED
@@ -4,6 +4,8 @@ require 'returnly/refunder'
|
|
4
4
|
require 'returnly/discounts/order'
|
5
5
|
require 'returnly/discounts/line_item'
|
6
6
|
require 'returnly/discount_calculator'
|
7
|
+
require 'returnly/builders/customer_return'
|
8
|
+
require 'returnly/builders/return_item'
|
7
9
|
require 'returnly/refund_calculator'
|
8
10
|
|
9
11
|
require 'returnly/version'
|
@@ -0,0 +1,28 @@
|
|
1
|
+
module Returnly
|
2
|
+
module Builders
|
3
|
+
class CustomerReturn
|
4
|
+
class << self
|
5
|
+
def build_by_return_items(return_items)
|
6
|
+
Spree::CustomerReturn.create(
|
7
|
+
return_items: return_items,
|
8
|
+
stock_location_id: stock_location_id(return_items.first)
|
9
|
+
)
|
10
|
+
end
|
11
|
+
|
12
|
+
def build_by_stock_location(stock_location)
|
13
|
+
Spree::CustomerReturn.new(stock_location: stock_location)
|
14
|
+
end
|
15
|
+
|
16
|
+
private
|
17
|
+
|
18
|
+
def stock_location_id(return_item)
|
19
|
+
return_item_order(return_item).shipments.last.stock_location_id
|
20
|
+
end
|
21
|
+
|
22
|
+
def return_item_order(return_item)
|
23
|
+
return_item.inventory_unit.order
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,42 @@
|
|
1
|
+
module Returnly
|
2
|
+
module Builders
|
3
|
+
class ReturnItem
|
4
|
+
attr_accessor :order
|
5
|
+
|
6
|
+
def initialize(order)
|
7
|
+
@order = order
|
8
|
+
end
|
9
|
+
|
10
|
+
def build_by_requested_line_items(requested_line_items)
|
11
|
+
requested_line_items.each_with_object([]) do |request_line_item, return_items|
|
12
|
+
quantity = request_line_item[:units].to_i
|
13
|
+
next return_items unless quantity > 0
|
14
|
+
|
15
|
+
inventory_units_by(request_line_item[:order_line_item_id]).take(quantity).each do |inventory_unit|
|
16
|
+
return_items << build_by_inventory_unit(inventory_unit, request_line_item)
|
17
|
+
end
|
18
|
+
|
19
|
+
return_items
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def build_by_inventory_unit(inventory_unit, options = {})
|
24
|
+
Spree::ReturnItem.new(
|
25
|
+
amount: inventory_unit.line_item.price,
|
26
|
+
acceptance_status: 'accepted',
|
27
|
+
inventory_unit_id: inventory_unit.id,
|
28
|
+
reception_status_event: 'receive',
|
29
|
+
resellable: options[:restock]
|
30
|
+
)
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
def inventory_units_by(line_item_ids)
|
36
|
+
order.inventory_units.includes(:line_item)
|
37
|
+
.where(line_item_id: line_item_ids)
|
38
|
+
.where.not(state: 'returned')
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
data/lib/returnly/engine.rb
CHANGED
@@ -1,10 +1,11 @@
|
|
1
1
|
module Returnly
|
2
2
|
class << self
|
3
3
|
mattr_accessor :return_item_amount_calculator,
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
4
|
+
:return_item_builder,
|
5
|
+
:return_item_restock_policy,
|
6
|
+
:refunder,
|
7
|
+
:refund_calculator,
|
8
|
+
:refund_presenter
|
8
9
|
end
|
9
10
|
|
10
11
|
def self.configure(&block)
|
@@ -12,89 +12,47 @@ module Returnly
|
|
12
12
|
self.order = order
|
13
13
|
end
|
14
14
|
|
15
|
-
def set_tax(return_item)
|
16
|
-
percent_of_tax = (return_item.amount <= 0) ? 0 : return_item.amount /
|
17
|
-
Spree::ReturnItem.refund_amount_calculator.new.compute(return_item)
|
18
|
-
|
19
|
-
additional_tax_total = percent_of_tax * return_item.inventory_unit.additional_tax_total
|
20
|
-
included_tax_total = percent_of_tax * return_item.inventory_unit.included_tax_total
|
21
|
-
|
22
|
-
return_item.additional_tax_total = additional_tax_total
|
23
|
-
return_item.included_tax_total = included_tax_total
|
24
|
-
|
25
|
-
return_item
|
26
|
-
end
|
27
|
-
|
28
15
|
def discount
|
29
16
|
Returnly::DiscountCalculator.new(order).calculate(line_items)
|
30
17
|
end
|
31
18
|
|
32
|
-
def shipping_tax
|
33
|
-
order.all_adjustments.where(source_type: 'Spree::TaxRate', adjustable_type: 'Spree::Shipment').sum(&:amount).to_d.round(2, :down)
|
34
|
-
end
|
35
|
-
|
36
19
|
def line_item_tax(line_item)
|
37
20
|
(line_item.adjustments.tax.sum(&:amount).to_d / line_item.quantity).round(2, :down)
|
38
21
|
end
|
39
22
|
|
40
23
|
def line_items_return_items
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
found_return_items[line_item[:order_line_item_id]] ||= []
|
48
|
-
return_item = create_return_item(inventory_unit, restock: line_item[:restock])
|
49
|
-
found_return_items[line_item[:order_line_item_id]] << set_tax(return_item)
|
50
|
-
end
|
24
|
+
available_return_items.each_with_object({}) do |return_item, return_items|
|
25
|
+
line_item_id = return_item.inventory_unit.line_item_id
|
26
|
+
return_items[line_item_id] ||= []
|
27
|
+
return_items[line_item_id] << set_tax(return_item)
|
28
|
+
return_items
|
51
29
|
end
|
52
|
-
|
53
|
-
found_return_items
|
54
30
|
end
|
55
31
|
|
56
|
-
def
|
57
|
-
|
58
|
-
end
|
59
|
-
|
60
|
-
def line_item(id)
|
61
|
-
returnable_line_items.find { |i| i.id == id.to_i }
|
62
|
-
end
|
63
|
-
|
64
|
-
def returnable_inventory_units
|
65
|
-
@_inventory_units ||= order.inventory_units.includes(:line_item)
|
66
|
-
.where(line_item_id: requested_line_items)
|
67
|
-
.where('state != ?', 'returned')
|
32
|
+
def shipping_tax
|
33
|
+
order.all_adjustments.where(source_type: 'Spree::TaxRate', adjustable_type: 'Spree::Shipment').sum(&:amount).to_d.round(2, :down)
|
68
34
|
end
|
69
35
|
|
70
|
-
|
71
|
-
@_line_items ||= returnable_inventory_units.map(&:line_item)
|
72
|
-
end
|
36
|
+
protected
|
73
37
|
|
74
|
-
def
|
75
|
-
line_items
|
38
|
+
def available_return_items
|
39
|
+
self.class.return_item_builder_class.new(order).build_by_requested_line_items(line_items)
|
76
40
|
end
|
77
41
|
|
42
|
+
def set_tax(return_item)
|
43
|
+
percent_of_tax = if return_item.amount <= 0
|
44
|
+
0
|
45
|
+
else
|
46
|
+
return_item.amount / Spree::ReturnItem.refund_amount_calculator.new.compute(return_item)
|
47
|
+
end
|
78
48
|
|
79
|
-
|
80
|
-
|
81
|
-
def create_return_item(inventory_unit, restock: false)
|
82
|
-
Spree::ReturnItem.new(
|
83
|
-
amount: inventory_unit.line_item.price,
|
84
|
-
acceptance_status: 'accepted',
|
85
|
-
inventory_unit_id: inventory_unit.id,
|
86
|
-
reception_status_event: 'receive',
|
87
|
-
resellable: restock
|
88
|
-
)
|
89
|
-
end
|
49
|
+
additional_tax_total = percent_of_tax * return_item.inventory_unit.additional_tax_total
|
50
|
+
included_tax_total = percent_of_tax * return_item.inventory_unit.included_tax_total
|
90
51
|
|
91
|
-
|
92
|
-
|
52
|
+
return_item.additional_tax_total = additional_tax_total
|
53
|
+
return_item.included_tax_total = included_tax_total
|
93
54
|
|
94
|
-
|
95
|
-
available_inventory_units.each do |inventory_unit|
|
96
|
-
yield inventory_unit, quantity
|
97
|
-
end
|
55
|
+
return_item
|
98
56
|
end
|
99
57
|
end
|
100
58
|
end
|
@@ -25,28 +25,6 @@ module Returnly
|
|
25
25
|
}
|
26
26
|
end
|
27
27
|
|
28
|
-
def self.present_line_items(calculator)
|
29
|
-
calculator.line_items_return_items.values.map do |return_items|
|
30
|
-
line_item = return_items.first.inventory_unit.line_item
|
31
|
-
|
32
|
-
total_amount = 0.0
|
33
|
-
sub_total = 0.0
|
34
|
-
|
35
|
-
return_items.each do |return_item|
|
36
|
-
total_amount += return_item.total
|
37
|
-
sub_total += return_item.pre_tax_amount
|
38
|
-
end
|
39
|
-
|
40
|
-
{
|
41
|
-
order_line_item_id: line_item.id,
|
42
|
-
quantity: return_items.size,
|
43
|
-
total_amount: total_amount.to_f,
|
44
|
-
tax_amount: (total_amount - sub_total).to_f
|
45
|
-
}
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
|
50
28
|
def self.present_refund(refunder)
|
51
29
|
customer_return = refunder.customer_return
|
52
30
|
|
data/lib/returnly/refunder.rb
CHANGED
@@ -14,7 +14,6 @@ module Returnly
|
|
14
14
|
def initialize(order:, line_items:, product_refund_amount:, shipping_refund_amount:)
|
15
15
|
self.order = order
|
16
16
|
self.line_items = line_items
|
17
|
-
self.customer_return = Spree::CustomerReturn.new customer_return_params
|
18
17
|
self.product_refund_amount = product_refund_amount
|
19
18
|
self.shipping_refund_amount = shipping_refund_amount
|
20
19
|
|
@@ -70,6 +69,7 @@ module Returnly
|
|
70
69
|
end
|
71
70
|
|
72
71
|
def proceed_without_line_items
|
72
|
+
self.customer_return = Returnly::Builders::CustomerReturn.build_by_stock_location(stock_location)
|
73
73
|
reimburse_without_items!
|
74
74
|
RefundPresenter.present_refund(self)
|
75
75
|
end
|
@@ -95,20 +95,16 @@ module Returnly
|
|
95
95
|
end
|
96
96
|
|
97
97
|
def each_return_item
|
98
|
-
|
99
|
-
customer_return.return_items
|
98
|
+
return_items = refund_calculator.line_items_return_items.values.flatten
|
99
|
+
self.customer_return = Returnly::Builders::CustomerReturn.build_by_return_items(return_items)
|
100
|
+
|
101
|
+
return_items.each do |return_item|
|
100
102
|
yield return_item
|
101
103
|
end
|
102
104
|
end
|
103
105
|
|
104
|
-
def
|
105
|
-
|
106
|
-
stock_location_id: stock_location_id
|
107
|
-
}
|
108
|
-
end
|
109
|
-
|
110
|
-
def stock_location_id
|
111
|
-
order.shipments.last.stock_location.id
|
106
|
+
def stock_location
|
107
|
+
order.shipments.last.stock_location
|
112
108
|
end
|
113
109
|
end
|
114
110
|
end
|
@@ -4,6 +4,10 @@ module Returnly
|
|
4
4
|
Returnly.return_item_amount_calculator || Returnly::Refund::AmountCalculator
|
5
5
|
end
|
6
6
|
|
7
|
+
def return_item_builder_class
|
8
|
+
Returnly.return_item_builder || Returnly::Builders::ReturnItem
|
9
|
+
end
|
10
|
+
|
7
11
|
# return item qualifies to be restocked (after refund)
|
8
12
|
def return_item_restock_policy_class
|
9
13
|
Returnly.return_item_restock_policy || Returnly::Refund::ReturnItemRestockPolicy
|
data/lib/returnly/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: solidus-returnly
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Returnly Technologies, Inc
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-11-
|
11
|
+
date: 2017-11-17 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: solidus
|
@@ -338,6 +338,8 @@ files:
|
|
338
338
|
- config/locales/en.yml
|
339
339
|
- config/routes.rb
|
340
340
|
- lib/returnly.rb
|
341
|
+
- lib/returnly/builders/customer_return.rb
|
342
|
+
- lib/returnly/builders/return_item.rb
|
341
343
|
- lib/returnly/discount_calculator.rb
|
342
344
|
- lib/returnly/discounts/line_item.rb
|
343
345
|
- lib/returnly/discounts/order.rb
|