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 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