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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 3a68dddf53275a4a8d9a815ecb84153ac0992163
4
- data.tar.gz: 66e1b0e6ff2c68a00186243fd5c75a09351e32f7
3
+ metadata.gz: 47ed17c5959d2c1e1f2210d1881f1322627cd2eb
4
+ data.tar.gz: fdccd81627f2e2f086fe2e797d99759328212b1a
5
5
  SHA512:
6
- metadata.gz: 0d73382881e2a144f1404457833901e2c900daaf29ca96ca609588c125cbb06d4f55a952d5eb4f3b4b1c175d20ccf385814301308d41537fefd25a0b358fbbf8
7
- data.tar.gz: 589bae74172827ed883ac463b5af2d33bb18ce43c257edc9c6f7f5edaac0bf84e9d3260a4ab4b03abf2350a38ea576243d06d5cbfde2e756507fe8841a92f14e
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
@@ -1,10 +1,11 @@
1
1
  module Returnly
2
2
  class << self
3
3
  mattr_accessor :return_item_amount_calculator,
4
- :return_item_restock_policy,
5
- :refunder,
6
- :refund_calculator,
7
- :refund_presenter
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
- found_return_items = {}
42
-
43
- line_items.each do |line_item|
44
- with_available_inventory_units line_item do |inventory_unit, quantity|
45
- next unless quantity > 0
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 line_item_inventory_unit(line_item)
57
- returnable_inventory_units.select { |iu| iu.line_item_id == line_item[:order_line_item_id].to_i }
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
- def returnable_line_items
71
- @_line_items ||= returnable_inventory_units.map(&:line_item)
72
- end
36
+ protected
73
37
 
74
- def requested_line_items
75
- line_items.map { |item| item[:order_line_item_id] }
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
- protected
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
- def with_available_inventory_units(line_item)
92
- quantity = line_item[:units].to_i
52
+ return_item.additional_tax_total = additional_tax_total
53
+ return_item.included_tax_total = included_tax_total
93
54
 
94
- available_inventory_units = line_item_inventory_unit(line_item).slice(0, quantity)
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
 
@@ -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
- customer_return.return_items = refund_calculator.line_items_return_items.values.flatten
99
- customer_return.return_items.each do |return_item|
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 customer_return_params
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
@@ -1,5 +1,5 @@
1
1
  module Returnly
2
- VERSION = '0.8.1'
2
+ VERSION = '0.9.0'
3
3
 
4
4
  def platform_version
5
5
  defined?(Solidus)
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.8.1
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-15 00:00:00.000000000 Z
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