More intuitive logic for minimum billable turnover

This commit is contained in:
Rob Harrington
2016-04-29 17:18:35 +10:00
parent 8dd2d17cd5
commit 1d7308bf5d
8 changed files with 23 additions and 23 deletions

View File

@@ -10,7 +10,7 @@ angular.module("admin.businessModelConfiguration").controller "BusinessModelConf
Math.min($scope.bill(), Number($scope.cap))
$scope.finalBill = ->
return 0 if Number($scope.turnover) <= Number($scope.min_bill_to)
return 0 if Number($scope.turnover) < Number($scope.minBillableTurnover)
$scope.cappedBill()
$scope.capReached = ->

View File

@@ -21,7 +21,7 @@ Spree::AppConfiguration.class_eval do
preference :account_invoices_monthly_cap, :decimal, default: 0
preference :account_invoices_tax_rate, :decimal, default: 0
preference :shop_trial_length_days, :integer, default: 30
preference :minimum_billable_turnover, :integer, default: -1
preference :minimum_billable_turnover, :integer, default: 0
# Monitoring
preference :last_job_queue_heartbeat_at, :string, default: nil

View File

@@ -54,11 +54,11 @@
.row
.three.columns.alpha
= f.label :minimum_billable_turnover, t(:minimum_monthly_billable_turnover)
%span.icon-question-sign{'ofn-with-tip' => "Minimum monthly turnover before a shopfront will be charged for using OFN. Enterprises turning over less than this amount in a month will not be charged, either as a percentage or fixed rate. When set to -1 enterprises with no turnover will be charge the fixed rate as specified."}
%span.icon-question-sign{'ofn-with-tip' => "Minimum monthly turnover before a shopfront will be charged for using OFN. Enterprises turning over less than this amount in a month will not be charged, either as a percentage or fixed rate."}
.two.columns.omega
.input-symbol.before
%span= Spree::Money.currency_symbol
= f.number_field :minimum_billable_turnover, min: -1.0, class: "fullwidth", 'watch-value-as' => 'min_bill_to'
= f.number_field :minimum_billable_turnover, min: 0, class: "fullwidth", 'watch-value-as' => 'minBillableTurnover'
.row
.five.columns.alpha.omega.form-buttons{"data-hook" => "buttons"}

View File

@@ -1,6 +1,6 @@
module OpenFoodNetwork
class BillCalculator
attr_accessor :turnover, :fixed, :rate, :cap, :tax_rate, :min_bill_to
attr_accessor :turnover, :fixed, :rate, :cap, :tax_rate, :minimum_billable_turnover
def initialize(opts={})
@turnover = opts[:turnover] || 0
@@ -8,13 +8,13 @@ module OpenFoodNetwork
@rate = opts[:rate] || Spree::Config[:account_invoices_monthly_rate]
@cap = opts[:cap] || Spree::Config[:account_invoices_monthly_cap]
@tax_rate = opts[:tax_rate] || Spree::Config[:account_invoices_tax_rate]
@min_bill_to = opts[:minimum_billable_turnover] || Spree::Config[:minimum_billable_turnover]
@minimum_billable_turnover = opts[:minimum_billable_turnover] || Spree::Config[:minimum_billable_turnover]
end
def bill
return 0 if turnover < minimum_billable_turnover
bill = fixed + (turnover * rate)
bill = [bill, cap].min if cap > 0
bill = turnover > min_bill_to ? bill : 0
bill * (1 + tax_rate)
end
end

View File

@@ -12,7 +12,7 @@ module OpenFoodNetwork
validates :account_invoices_monthly_rate, presence: true, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 1 }
validates :account_invoices_monthly_cap, presence: true, numericality: { greater_than_or_equal_to: 0 }
validates :account_invoices_tax_rate, presence: true, numericality: { greater_than_or_equal_to: 0, less_than_or_equal_to: 1 }
validates :minimum_billable_turnover, presence: true, numericality: { greater_than_or_equal_to: -1 }
validates :minimum_billable_turnover, presence: true, numericality: { greater_than_or_equal_to: 0 }
def initialize(attr, button=nil)
attr.each { |k,v| instance_variable_set("@#{k}", v) }

View File

@@ -11,7 +11,7 @@ describe Admin::BusinessModelConfigurationController, type: :controller do
account_invoices_monthly_cap: 50,
account_invoices_tax_rate: 0.1,
shop_trial_length_days: 30,
minimum_billable_turnover: -1
minimum_billable_turnover: 0
})
end
@@ -56,7 +56,7 @@ describe Admin::BusinessModelConfigurationController, type: :controller do
params[:settings][:account_invoices_monthly_cap] = '-1'
params[:settings][:account_invoices_tax_rate] = '4'
params[:settings][:shop_trial_length_days] = '-30'
params[:settings][:minimum_billable_turnover] = '-2'
params[:settings][:minimum_billable_turnover] = '-1'
spree_get :update, params
end
@@ -68,7 +68,7 @@ describe Admin::BusinessModelConfigurationController, type: :controller do
expect(Spree::Config.account_invoices_monthly_cap).to eq 50
expect(Spree::Config.account_invoices_tax_rate).to eq 0.1
expect(Spree::Config.shop_trial_length_days).to eq 30
expect(Spree::Config.minimum_billable_turnover).to eq -1
expect(Spree::Config.minimum_billable_turnover).to eq 0
end
end
@@ -79,7 +79,7 @@ describe Admin::BusinessModelConfigurationController, type: :controller do
params[:settings][:account_invoices_monthly_cap] = '30'
params[:settings][:account_invoices_tax_rate] = '0.15'
params[:settings][:shop_trial_length_days] = '20'
params[:settings][:minimum_billable_turnover] = '0'
params[:settings][:minimum_billable_turnover] = '10'
end
it "sets global config to the specified values" do
@@ -90,7 +90,7 @@ describe Admin::BusinessModelConfigurationController, type: :controller do
expect(Spree::Config.account_invoices_monthly_cap).to eq 30
expect(Spree::Config.account_invoices_tax_rate).to eq 0.15
expect(Spree::Config.shop_trial_length_days).to eq 20
expect(Spree::Config.minimum_billable_turnover).to eq 0
expect(Spree::Config.minimum_billable_turnover).to eq 10
end
end
end

View File

@@ -12,7 +12,7 @@ describe UpdateAccountInvoices do
Spree::Config.set(:account_invoices_monthly_fixed, 5)
Spree::Config.set(:account_invoices_monthly_rate, 0.02)
Spree::Config.set(:account_invoices_monthly_cap, 50)
Spree::Config.set(:minimum_billable_turnover, -1)
Spree::Config.set(:minimum_billable_turnover, 0)
end
describe "units specs" do

View File

@@ -33,8 +33,8 @@ describe BillablePeriod, type: :model do
context "when no tax is charged" do
before { Spree::Config.set(:account_invoices_tax_rate, 0) }
context "when no minimum billable turnover" do
before { Spree::Config.set(:minimum_billable_turnover, -1) }
context "when minimum billable turnover is zero" do
before { Spree::Config.set(:minimum_billable_turnover, 0) }
context "when a fixed cost is included" do
before { Spree::Config.set(:account_invoices_monthly_fixed, 10) }
@@ -47,8 +47,8 @@ describe BillablePeriod, type: :model do
end
end
context "when minimum billable turnover exists" do
before { Spree::Config.set(:minimum_billable_turnover, 0) }
context "when minimum billable turnover is > zero" do
before { Spree::Config.set(:minimum_billable_turnover, 1) }
context "when a fixed cost is included" do
before { Spree::Config.set(:account_invoices_monthly_fixed, 10) }
@@ -65,8 +65,8 @@ describe BillablePeriod, type: :model do
context "when tax is charged" do
before { Spree::Config.set(:account_invoices_tax_rate, 0.1) }
context "when no minimum billable turnover" do
before { Spree::Config.set(:minimum_billable_turnover, -1) }
context "when minimum billable turnover is zero" do
before { Spree::Config.set(:minimum_billable_turnover, 0) }
context "when a fixed cost is included" do
before { Spree::Config.set(:account_invoices_monthly_fixed, 10) }
@@ -79,8 +79,8 @@ describe BillablePeriod, type: :model do
end
end
context "when minimum billable turnover exists" do
before { Spree::Config.set(:minimum_billable_turnover, 0) }
context "when minimum billable turnover is > zero" do
before { Spree::Config.set(:minimum_billable_turnover, 1) }
context "when a fixed cost is included" do
before { Spree::Config.set(:account_invoices_monthly_fixed, 10) }
@@ -102,7 +102,7 @@ describe BillablePeriod, type: :model do
before { Spree::Config.set(:account_invoices_tax_rate, 0) }
context "when no minimum billable turnover" do
before { Spree::Config.set(:minimum_billable_turnover, -1) }
before { Spree::Config.set(:minimum_billable_turnover, 0) }
context "when a fixed cost is included" do
before { Spree::Config.set(:account_invoices_monthly_fixed, 10) }