spree_payment_calculator 0.70.1 → 1.0.0
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +1 -1
- data/app/model/spree/payment_calculator/default_tax.rb +51 -0
- data/app/model/spree/payment_calculator/flat_percent_item_total.rb +20 -0
- data/app/model/spree/payment_calculator/flat_rate.rb +17 -0
- data/app/model/spree/payment_calculator/flexi_rate.rb +35 -0
- data/app/model/spree/payment_calculator/per_item.rb +20 -0
- data/app/model/spree/payment_calculator/price_sack.rb +32 -0
- data/app/model/{payment_decorator.rb → spree/payment_decorator.rb} +1 -1
- data/app/model/spree/payment_method_decorator.rb +3 -0
- data/app/overrides/add_calculators_to_payment_methods.rb +2 -2
- data/config/locales/en.yml +2 -1
- data/config/locales/it.yml +2 -1
- data/config/routes.rb +1 -1
- data/lib/generators/spree_payment_calculator/install/install_generator.rb +1 -0
- data/lib/spree/core/environment/calculators.rb +11 -0
- data/lib/spree_payment_calculator/engine.rb +5 -26
- metadata +11 -10
- data/app/model/gateway_decorator.rb +0 -3
- data/app/model/payment_calculator/flat_percent_item_total.rb +0 -14
- data/app/model/payment_calculator/flat_rate.rb +0 -11
- data/app/model/payment_calculator/flexi_rate.rb +0 -27
- data/app/model/payment_calculator/per_item.rb +0 -11
- data/app/model/payment_calculator/price_sack.rb +0 -24
- data/app/model/payment_method_decorator.rb +0 -17
data/README.md
CHANGED
@@ -9,7 +9,7 @@ Basic Installation
|
|
9
9
|
|
10
10
|
1. Add the following to your Gemfile
|
11
11
|
<pre>
|
12
|
-
gem 'spree_payment_calculator', '~> 0.
|
12
|
+
gem 'spree_payment_calculator', '~> 1.0.0'
|
13
13
|
</pre>
|
14
14
|
2. Run `bundle install`
|
15
15
|
3. Go to Payment Method in the Admin panel and add a calculator for each type of payment you prefer
|
@@ -0,0 +1,51 @@
|
|
1
|
+
require_dependency 'spree/calculator'
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
class PaymentCalculator::DefaultTax < Calculator
|
5
|
+
def self.description
|
6
|
+
I18n.t(:default_tax)
|
7
|
+
end
|
8
|
+
|
9
|
+
def compute(computable)
|
10
|
+
case computable
|
11
|
+
when Spree::Order
|
12
|
+
compute_order(computable)
|
13
|
+
when Spree::LineItem
|
14
|
+
compute_line_item(computable)
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
|
19
|
+
private
|
20
|
+
|
21
|
+
def rate
|
22
|
+
rate = self.calculable
|
23
|
+
end
|
24
|
+
|
25
|
+
def compute_order(order)
|
26
|
+
matched_line_items = order.line_items.select do |line_item|
|
27
|
+
line_item.product.tax_category == rate.tax_category
|
28
|
+
end
|
29
|
+
|
30
|
+
line_items_total = matched_line_items.sum(&:total)
|
31
|
+
round_to_two_places(line_items_total * rate.amount)
|
32
|
+
end
|
33
|
+
|
34
|
+
def compute_line_item(line_item)
|
35
|
+
if line_item.product.tax_category == rate.tax_category
|
36
|
+
deduced_total_by_rate(line_item.total, rate)
|
37
|
+
else
|
38
|
+
0
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
def round_to_two_places(amount)
|
43
|
+
BigDecimal.new(amount.to_s).round(2, BigDecimal::ROUND_HALF_UP)
|
44
|
+
end
|
45
|
+
|
46
|
+
def deduced_total_by_rate(total, rate)
|
47
|
+
round_to_two_places(total - ( total / (1 + rate.amount) ) )
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require_dependency 'spree/calculator'
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
class PaymentCalculator::FlatPercentItemTotal < Calculator
|
5
|
+
preference :flat_percent, :decimal, :default => 0
|
6
|
+
|
7
|
+
attr_accessible :preferred_flat_percent
|
8
|
+
|
9
|
+
def self.description
|
10
|
+
I18n.t(:flat_percent)
|
11
|
+
end
|
12
|
+
|
13
|
+
def compute(object)
|
14
|
+
return unless object.present? and object.line_items.present?
|
15
|
+
item_total = object.line_items.map(&:amount).sum
|
16
|
+
value = item_total * BigDecimal(self.preferred_flat_percent.to_s) / 100.0
|
17
|
+
(value * 100).round.to_f / 100
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require_dependency 'spree/calculator'
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
class PaymentCalculator::FlatRate < Calculator
|
5
|
+
preference :amount, :decimal, :default => 0
|
6
|
+
|
7
|
+
attr_accessible :preferred_amount
|
8
|
+
|
9
|
+
def self.description
|
10
|
+
I18n.t(:flat_rate_per_order)
|
11
|
+
end
|
12
|
+
|
13
|
+
def compute(object=nil)
|
14
|
+
self.preferred_amount
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
require_dependency 'spree/calculator'
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
class PaymentCalculator::FlexiRate < Calculator
|
5
|
+
preference :first_item, :decimal, :default => 0.0
|
6
|
+
preference :additional_item, :decimal, :default => 0.0
|
7
|
+
preference :max_items, :integer, :default => 0
|
8
|
+
|
9
|
+
attr_accessible :preferred_first_item, :preferred_additional_item, :preferred_max_items
|
10
|
+
|
11
|
+
def self.description
|
12
|
+
I18n.t(:flexible_rate)
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.available?(object)
|
16
|
+
true
|
17
|
+
end
|
18
|
+
|
19
|
+
def compute(object)
|
20
|
+
sum = 0
|
21
|
+
max = self.preferred_max_items.to_i
|
22
|
+
items_count = object.line_items.map(&:quantity).sum
|
23
|
+
items_count.times do |i|
|
24
|
+
# check max value to avoid divide by 0 errors
|
25
|
+
if (max == 0 && i == 0) || (max > 0) && (i % max == 0)
|
26
|
+
sum += self.preferred_first_item.to_f
|
27
|
+
else
|
28
|
+
sum += self.preferred_additional_item.to_f
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
sum
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require_dependency 'spree/calculator'
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
class PaymentCalculator::PerItem < Calculator
|
5
|
+
preference :amount, :decimal, :default => 0
|
6
|
+
|
7
|
+
attr_accessible :preferred_amount
|
8
|
+
|
9
|
+
def self.description
|
10
|
+
I18n.t(:flat_rate_per_item)
|
11
|
+
end
|
12
|
+
|
13
|
+
def compute(object=nil)
|
14
|
+
return 0 if object.nil?
|
15
|
+
self.preferred_amount * object.line_items.reduce(0) do |sum, value|
|
16
|
+
sum + value.quantity
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require_dependency 'spree/calculator'
|
2
|
+
|
3
|
+
module Spree
|
4
|
+
class PaymentCalculator::PriceSack < Calculator
|
5
|
+
preference :minimal_amount, :decimal, :default => 0
|
6
|
+
preference :normal_amount, :decimal, :default => 0
|
7
|
+
preference :discount_amount, :decimal, :default => 0
|
8
|
+
|
9
|
+
attr_accessible :preferred_minimal_amount,
|
10
|
+
:preferred_normal_amount,
|
11
|
+
:preferred_discount_amount
|
12
|
+
|
13
|
+
def self.description
|
14
|
+
I18n.t(:price_sack)
|
15
|
+
end
|
16
|
+
|
17
|
+
# as object we always get line items, as calculable we have Coupon, ShippingMethod
|
18
|
+
def compute(object)
|
19
|
+
if object.is_a?(Array)
|
20
|
+
base = object.map { |o| o.respond_to?(:amount) ? o.amount : o.to_d }.sum
|
21
|
+
else
|
22
|
+
base = object.respond_to?(:amount) ? object.amount : object.to_d
|
23
|
+
end
|
24
|
+
|
25
|
+
if base >= self.preferred_minimal_amount
|
26
|
+
self.preferred_normal_amount
|
27
|
+
else
|
28
|
+
self.preferred_discount_amount
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -1,5 +1,5 @@
|
|
1
|
-
Deface::Override.new(:virtual_path => 'admin/payment_methods/_form',
|
1
|
+
Deface::Override.new(:virtual_path => 'spree/admin/payment_methods/_form',
|
2
2
|
:name => 'add_calculators_to_payment_methods',
|
3
3
|
:insert_before => %q{[id='preference-settings']},
|
4
|
-
:text => %q{<% @calculators = PaymentMethod.
|
4
|
+
:text => %q{<% @calculators = Spree::PaymentMethod.calculators.sort_by(&:name) rescue nil %><%= render :partial => 'spree/admin/shared/calculator_fields', :locals => {:f => f}},
|
5
5
|
:disabled => false)
|
data/config/locales/en.yml
CHANGED
data/config/locales/it.yml
CHANGED
data/config/routes.rb
CHANGED
@@ -11,6 +11,7 @@ module SpreePaymentCalculator
|
|
11
11
|
#inject_into_file "app/assets/stylesheets/store/all.css", " *= require store/spree_payment_calculator\n", :before => /\*\//, :verbose => true
|
12
12
|
#inject_into_file "app/assets/stylesheets/admin/all.css", " *= require admin/spree_payment_calculator\n", :before => /\*\//, :verbose => true
|
13
13
|
end
|
14
|
+
|
14
15
|
end
|
15
16
|
end
|
16
17
|
end
|
@@ -17,35 +17,14 @@ module SpreePaymentCalculator
|
|
17
17
|
Dir.glob(File.join(File.dirname(__FILE__), "../../app/overrides/*.rb")) do |c|
|
18
18
|
Rails.application.config.cache_classes ? require(c) : load(c)
|
19
19
|
end
|
20
|
+
|
21
|
+
Dir.glob(File.join(File.dirname(__FILE__), "../../lib/spree/environment/calculator.rb")) do |c|
|
22
|
+
Rails.application.config.cache_classes ? require(c) : load(c)
|
23
|
+
end
|
20
24
|
end
|
21
|
-
|
22
25
|
initializer 'spree.register.calculators' do |app|
|
23
|
-
if Gem::Specification::find_by_name('spree_paypal_express')
|
24
|
-
BillingIntegration.class_eval do
|
25
|
-
calculated_adjustments
|
26
|
-
end
|
27
|
-
app.config.spree.calculators.add_class('billing_integrations')
|
28
|
-
app.config.spree.calculators.billing_integrations = [
|
29
|
-
PaymentCalculator::PriceSack,
|
30
|
-
PaymentCalculator::FlatPercentItemTotal,
|
31
|
-
PaymentCalculator::FlatRate,
|
32
|
-
PaymentCalculator::FlexiRate,
|
33
|
-
PaymentCalculator::PerItem
|
34
|
-
]
|
35
|
-
end
|
36
|
-
|
37
|
-
app.config.spree.calculators.add_class('payment_methods')
|
38
|
-
app.config.spree.calculators.add_class('gateways')
|
39
|
-
|
40
26
|
app.config.spree.calculators.payment_methods = [
|
41
|
-
PaymentCalculator::
|
42
|
-
PaymentCalculator::FlatPercentItemTotal,
|
43
|
-
PaymentCalculator::FlatRate,
|
44
|
-
PaymentCalculator::FlexiRate,
|
45
|
-
PaymentCalculator::PerItem
|
46
|
-
]
|
47
|
-
|
48
|
-
app.config.spree.calculators.gateways = [
|
27
|
+
PaymentCalculator::DefaultTax,
|
49
28
|
PaymentCalculator::PriceSack,
|
50
29
|
PaymentCalculator::FlatPercentItemTotal,
|
51
30
|
PaymentCalculator::FlatRate,
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: spree_payment_calculator
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 1.0.0
|
5
5
|
prerelease:
|
6
6
|
platform: ruby
|
7
7
|
authors:
|
@@ -9,7 +9,7 @@ authors:
|
|
9
9
|
autorequire:
|
10
10
|
bindir: bin
|
11
11
|
cert_chain: []
|
12
|
-
date: 2012-07-
|
12
|
+
date: 2012-07-12 00:00:00.000000000 Z
|
13
13
|
dependencies:
|
14
14
|
- !ruby/object:Gem::Dependency
|
15
15
|
name: spree_core
|
@@ -52,20 +52,21 @@ files:
|
|
52
52
|
- README.md
|
53
53
|
- LICENSE
|
54
54
|
- lib/generators/spree_payment_calculator/install/install_generator.rb
|
55
|
+
- lib/spree/core/environment/calculators.rb
|
55
56
|
- lib/spree_payment_calculator/engine.rb
|
56
57
|
- lib/spree_payment_calculator.rb
|
57
58
|
- app/assets/javascripts/admin/spree_payment_calculator.js
|
58
59
|
- app/assets/javascripts/store/spree_payment_calculator.js
|
59
60
|
- app/assets/stylesheets/admin/spree_payment_calculator.css
|
60
61
|
- app/assets/stylesheets/store/spree_payment_calculator.css
|
61
|
-
- app/model/
|
62
|
-
- app/model/payment_calculator/flat_percent_item_total.rb
|
63
|
-
- app/model/payment_calculator/flat_rate.rb
|
64
|
-
- app/model/payment_calculator/flexi_rate.rb
|
65
|
-
- app/model/payment_calculator/per_item.rb
|
66
|
-
- app/model/payment_calculator/price_sack.rb
|
67
|
-
- app/model/payment_decorator.rb
|
68
|
-
- app/model/payment_method_decorator.rb
|
62
|
+
- app/model/spree/payment_calculator/default_tax.rb
|
63
|
+
- app/model/spree/payment_calculator/flat_percent_item_total.rb
|
64
|
+
- app/model/spree/payment_calculator/flat_rate.rb
|
65
|
+
- app/model/spree/payment_calculator/flexi_rate.rb
|
66
|
+
- app/model/spree/payment_calculator/per_item.rb
|
67
|
+
- app/model/spree/payment_calculator/price_sack.rb
|
68
|
+
- app/model/spree/payment_decorator.rb
|
69
|
+
- app/model/spree/payment_method_decorator.rb
|
69
70
|
- app/overrides/add_calculators_to_payment_methods.rb
|
70
71
|
- config/locales/en.yml
|
71
72
|
- config/locales/it.yml
|
@@ -1,14 +0,0 @@
|
|
1
|
-
class PaymentCalculator::FlatPercentItemTotal < Calculator
|
2
|
-
preference :flat_percent, :decimal, :default => 0
|
3
|
-
|
4
|
-
def self.description
|
5
|
-
I18n.t("flat_percent")
|
6
|
-
end
|
7
|
-
|
8
|
-
def compute(object)
|
9
|
-
return unless object.present? and object.line_items.present?
|
10
|
-
item_total = object.line_items.map(&:amount).sum
|
11
|
-
value = item_total * self.preferred_flat_percent / 100.0
|
12
|
-
(value * 100).round.to_f / 100
|
13
|
-
end
|
14
|
-
end
|
@@ -1,27 +0,0 @@
|
|
1
|
-
class PaymentCalculator::FlexiRate < Calculator
|
2
|
-
preference :first_item, :decimal, :default => 0
|
3
|
-
preference :additional_item, :decimal, :default => 0
|
4
|
-
preference :max_items, :decimal, :default => 0
|
5
|
-
|
6
|
-
def self.description
|
7
|
-
I18n.t("flexible_rate")
|
8
|
-
end
|
9
|
-
|
10
|
-
def self.available?(object)
|
11
|
-
true
|
12
|
-
end
|
13
|
-
|
14
|
-
def compute(object)
|
15
|
-
sum = 0
|
16
|
-
max = self.preferred_max_items
|
17
|
-
items_count = object.line_items.map(&:quantity).sum
|
18
|
-
items_count.times do |i|
|
19
|
-
if (i % max == 0) && (max > 0)
|
20
|
-
sum += self.preferred_first_item
|
21
|
-
else
|
22
|
-
sum += self.preferred_additional_item
|
23
|
-
end
|
24
|
-
end
|
25
|
-
return(sum)
|
26
|
-
end
|
27
|
-
end
|
@@ -1,24 +0,0 @@
|
|
1
|
-
class PaymentCalculator::PriceSack < Calculator
|
2
|
-
preference :minimal_amount, :decimal, :default => 0
|
3
|
-
preference :normal_amount, :decimal, :default => 0
|
4
|
-
preference :discount_amount, :decimal, :default => 0
|
5
|
-
|
6
|
-
def self.description
|
7
|
-
I18n.t("price_sack")
|
8
|
-
end
|
9
|
-
|
10
|
-
# as object we always get line items, as calculable we have Coupon, ShippingMethod
|
11
|
-
def compute(object)
|
12
|
-
if object.is_a?(Array)
|
13
|
-
base = object.map{ |o| o.respond_to?(:amount) ? o.amount : o.to_d }.sum
|
14
|
-
else
|
15
|
-
base = object.respond_to?(:amount) ? object.amount : object.to_d
|
16
|
-
end
|
17
|
-
|
18
|
-
if base >= self.preferred_minimal_amount
|
19
|
-
self.preferred_normal_amount
|
20
|
-
else
|
21
|
-
self.preferred_discount_amount
|
22
|
-
end
|
23
|
-
end
|
24
|
-
end
|
@@ -1,17 +0,0 @@
|
|
1
|
-
PaymentMethod.class_eval do
|
2
|
-
calculated_adjustments
|
3
|
-
|
4
|
-
def self.send_calculator(id = nil)
|
5
|
-
if id
|
6
|
-
if PaymentMethod.find(id).class.to_s.match(/Gateway/)
|
7
|
-
return Gateway.calculators.sort_by(&:name)
|
8
|
-
elsif PaymentMethod.find(id).class.to_s.match(/BillingIntegration/)
|
9
|
-
return BillingIntegration.calculators.sort_by(&:name)
|
10
|
-
else
|
11
|
-
return PaymentMethod.calculators.sort_by(&:name)
|
12
|
-
end
|
13
|
-
else
|
14
|
-
return PaymentMethod.calculators.sort_by(&:name)
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|