solidus-returnly 0.6.0 → 0.6.1
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/app/controllers/spree/api/returnly/api_controller.rb +1 -1
- data/lib/returnly.rb +4 -1
- data/lib/returnly/discount_calculator.rb +51 -0
- data/lib/returnly/discounts/line_item.rb +26 -0
- data/lib/returnly/discounts/order.rb +33 -0
- data/lib/returnly/refund_calculator.rb +4 -0
- data/lib/returnly/refund_presenter.rb +3 -2
- data/lib/returnly/version.rb +1 -1
- metadata +6 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 2043001dcfb19498dc6e5ef56b5b39248485632a
|
4
|
+
data.tar.gz: ec0c2f446acf7b5eac9687c8efa8d81e71f7b020
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 29c6dfe656d053f93198ce4a5987b3070b7a0511d361b44f6cf0a79912f267bb086503e7c445b549a7900c894541965788b5c26d341adb5915fedfb752616964
|
7
|
+
data.tar.gz: b315483a1960b7640f5004e537a2ecaa21d7300a8a3cc06d4754007a1cf7f1a1a46c190d59f44a8aab59817c7c70ec03aa9af0a0292e81e735f878ac924638d4
|
data/lib/returnly.rb
CHANGED
@@ -1,9 +1,12 @@
|
|
1
1
|
require 'returnly/engine'
|
2
2
|
require 'returnly/refunds_configuration'
|
3
3
|
require 'returnly/refunder'
|
4
|
+
require 'returnly/discounts/order'
|
5
|
+
require 'returnly/discounts/line_item'
|
6
|
+
require 'returnly/discount_calculator'
|
4
7
|
require 'returnly/refund_calculator'
|
5
8
|
|
6
9
|
require 'returnly/version'
|
7
10
|
require 'returnly/refund/amount_calculator'
|
8
11
|
require 'returnly/refund/return_item_restock_policy'
|
9
|
-
require 'returnly/refund_presenter'
|
12
|
+
require 'returnly/refund_presenter'
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module Returnly
|
2
|
+
class DiscountCalculator
|
3
|
+
attr_accessor :order
|
4
|
+
|
5
|
+
DISCOUNTER_CLASSES = {
|
6
|
+
'Spree::Order' => Returnly::Discounts::Order,
|
7
|
+
'Spree::LineItem' => Returnly::Discounts::LineItem
|
8
|
+
}.freeze
|
9
|
+
|
10
|
+
def initialize(order)
|
11
|
+
@order = order
|
12
|
+
end
|
13
|
+
|
14
|
+
def calculate(line_items = [])
|
15
|
+
line_items.inject(0) do |discount_amount, item|
|
16
|
+
line_item = find_line_item(item[:order_line_item_id])
|
17
|
+
next discount_amount if line_item.nil?
|
18
|
+
|
19
|
+
discount_amount += discount_amount_for(line_item, item[:units].to_i)
|
20
|
+
discount_amount
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def discount_amount_for(line_item, units)
|
27
|
+
discounters.inject(0) do |amount, discounter|
|
28
|
+
amount += discounter.discount_amount(line_item, units)
|
29
|
+
amount
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def discounters
|
34
|
+
order_promotion_adjustments.map { |promotion_adjustment| build_discounter_by(promotion_adjustment) }.compact
|
35
|
+
end
|
36
|
+
|
37
|
+
def build_discounter_by(promotion_adjustment)
|
38
|
+
discounter_class = DISCOUNTER_CLASSES[promotion_adjustment.adjustable_type]
|
39
|
+
return nil if discounter_class.nil?
|
40
|
+
discounter_class.new(order, promotion_adjustment)
|
41
|
+
end
|
42
|
+
|
43
|
+
def order_promotion_adjustments
|
44
|
+
order.all_adjustments.where(source_type: 'Spree::PromotionAction', eligible: true)
|
45
|
+
end
|
46
|
+
|
47
|
+
def find_line_item(id)
|
48
|
+
order.line_items.find_by(id: id)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
module Returnly
|
2
|
+
module Discounts
|
3
|
+
class LineItem
|
4
|
+
attr_reader :adjustment, :order
|
5
|
+
|
6
|
+
def initialize(order, adjustment)
|
7
|
+
@adjustment = adjustment
|
8
|
+
@order = order
|
9
|
+
end
|
10
|
+
|
11
|
+
def discount_amount(line_item, units = 0)
|
12
|
+
return 0.0 if units <= 0
|
13
|
+
return 0.0 if adjustment.adjustable != line_item
|
14
|
+
|
15
|
+
units = line_item.quantity if units > line_item.quantity
|
16
|
+
adjustment.amount * weight_of(line_item, units.to_d)
|
17
|
+
end
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def weight_of(line_item, units)
|
22
|
+
(units / line_item.quantity).round(2, :down)
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
module Returnly
|
2
|
+
module Discounts
|
3
|
+
class Order
|
4
|
+
attr_reader :adjustment, :order
|
5
|
+
|
6
|
+
def initialize(order, adjustment)
|
7
|
+
@adjustment = adjustment
|
8
|
+
@order = order
|
9
|
+
end
|
10
|
+
|
11
|
+
def discount_amount(line_item, units = 0)
|
12
|
+
return 0.0 if units <= 0
|
13
|
+
|
14
|
+
units = line_item.quantity if units > line_item.quantity
|
15
|
+
(adjustment.amount * price_percent(line_item) / 100) * weight_of(line_item, units.to_d)
|
16
|
+
end
|
17
|
+
|
18
|
+
private
|
19
|
+
|
20
|
+
def price_percent(line_item)
|
21
|
+
(line_item.price * 100 / order_items_price).round(2, :down)
|
22
|
+
end
|
23
|
+
|
24
|
+
def order_items_price
|
25
|
+
order.line_items.sum(&:price)
|
26
|
+
end
|
27
|
+
|
28
|
+
def weight_of(line_item, units)
|
29
|
+
(units / line_item.quantity).round(2, :down)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -24,6 +24,10 @@ module Returnly
|
|
24
24
|
return_item
|
25
25
|
end
|
26
26
|
|
27
|
+
def discount
|
28
|
+
Returnly::DiscountCalculator.new(order).calculate(line_items)
|
29
|
+
end
|
30
|
+
|
27
31
|
def shipping_tax
|
28
32
|
order.all_adjustments.where(source_type: 'Spree::TaxRate', adjustable_type: 'Spree::Shipment').sum(&:amount)
|
29
33
|
end
|
@@ -10,12 +10,13 @@ module Returnly
|
|
10
10
|
sub_total += Money.from_amount return_item.pre_tax_amount
|
11
11
|
end
|
12
12
|
|
13
|
-
|
13
|
+
discount = Money.from_amount(calculator.discount)
|
14
|
+
total_refund_amount = total - (discount * -1) # discount is negative, so we multiply it by -1 to make it positive for subtraction
|
14
15
|
shipping_tax = calculator.shipping_tax
|
15
16
|
{
|
16
17
|
product_amount: sub_total.to_f,
|
17
18
|
tax_amount: (total - sub_total).to_f,
|
18
|
-
discount_amount:
|
19
|
+
discount_amount: discount.to_f,
|
19
20
|
total_refund_amount: total_refund_amount.to_f,
|
20
21
|
refundable_shipping_amount: calculator.order.shipment_total.to_f,
|
21
22
|
refundable_shipping_tax_amount: shipping_tax.to_f,
|
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.6.
|
4
|
+
version: 0.6.1
|
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-09-
|
11
|
+
date: 2017-09-11 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: solidus
|
@@ -335,6 +335,9 @@ files:
|
|
335
335
|
- config/locales/en.yml
|
336
336
|
- config/routes.rb
|
337
337
|
- lib/returnly.rb
|
338
|
+
- lib/returnly/discount_calculator.rb
|
339
|
+
- lib/returnly/discounts/line_item.rb
|
340
|
+
- lib/returnly/discounts/order.rb
|
338
341
|
- lib/returnly/engine.rb
|
339
342
|
- lib/returnly/factories.rb
|
340
343
|
- lib/returnly/refund/amount_calculator.rb
|
@@ -366,7 +369,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
366
369
|
version: '0'
|
367
370
|
requirements: []
|
368
371
|
rubyforge_project:
|
369
|
-
rubygems_version: 2.
|
372
|
+
rubygems_version: 2.4.5.1
|
370
373
|
signing_key:
|
371
374
|
specification_version: 4
|
372
375
|
summary: Returnly integration with Solidus
|