solidus-returnly 0.8.1 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|