Updating Bill Calculator to include a minimum billable turnover. Shopfronts are not charged if their tunrover is under the minimum billable.

This commit is contained in:
Lynne Davis
2016-03-17 11:15:06 +00:00
parent b43e770420
commit bfaefa4dc9
2 changed files with 339 additions and 60 deletions

View File

@@ -1,6 +1,6 @@
module OpenFoodNetwork
class BillCalculator
attr_accessor :turnover, :fixed, :rate, :cap, :tax_rate
attr_accessor :turnover, :fixed, :rate, :cap, :tax_rate, :min_bill_to
def initialize(opts={})
@turnover = opts[:turnover] || 0
@@ -8,11 +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[:min_bill_to] || Spree::Config[:minimum_billable_turnover]
end
def bill
bill = fixed + (turnover * rate)
bill = cap > 0 ? [bill, cap].min : bill
bill = turnover > min_bill_to ? bill : 0
bill * (1 + tax_rate)
end
end

View File

@@ -34,94 +34,371 @@ describe BillablePeriod, type: :model do
context "when no tax is charged" do
before { Spree::Config.set(:account_invoices_tax_rate, 0) }
context "when a fixed cost is included" do
before { Spree::Config.set(:account_invoices_monthly_fixed, 10) }
context "when no minimum billable turnover" do
before { Spree::Config.set(:minimum_billable_turnover, 0) }
context "when a percentage of turnover is included" do
before { Spree::Config.set(:account_invoices_monthly_rate, 0.5) }
context "when a fixed cost is included" do
before { Spree::Config.set(:account_invoices_monthly_fixed, 10) }
context "when the bill is capped" do
context "at a level higher than the fixed charge plus the product of the rate and turnover" do
before { Spree::Config.set(:account_invoices_monthly_cap, 65) }
it { expect(subject.bill).to eq 60 }
context "when a percentage of turnover is included" do
before { Spree::Config.set(:account_invoices_monthly_rate, 0.5) }
context "when the bill is capped" do
context "at a level higher than the fixed charge plus the product of the rate and turnover" do
before { Spree::Config.set(:account_invoices_monthly_cap, 65) }
it { expect(subject.bill).to eq 60 }
end
context "at a level lower than the fixed charge plus the product of the rate and turnover" do
before { Spree::Config.set(:account_invoices_monthly_cap, 55) }
it { expect(subject.bill).to eq 55 }
end
end
context "at a level lower than the fixed charge plus the product of the rate and turnover" do
before { Spree::Config.set(:account_invoices_monthly_cap, 55) }
it { expect(subject.bill).to eq 55 }
context "when the bill is not capped" do
before { Spree::Config.set(:account_invoices_monthly_cap, 0) }
it { expect(subject.bill).to eq 60 }
end
end
context "when the bill is not capped" do
before { Spree::Config.set(:account_invoices_monthly_cap, 0) }
it { expect(subject.bill).to eq 60 }
context "when a percentage of turnover is not included" do
before { Spree::Config.set(:account_invoices_monthly_rate, 0) }
context "when the bill is capped" do
context "at a level higher than the fixed charge" do
before { Spree::Config.set(:account_invoices_monthly_cap, 15) }
it { expect(subject.bill).to eq 10 }
end
context "at a level lower than the fixed charge" do
before { Spree::Config.set(:account_invoices_monthly_cap, 5) }
it { expect(subject.bill).to eq 5 }
end
end
context "when the bill is not capped" do
before { Spree::Config.set(:account_invoices_monthly_cap, 0) }
it { expect(subject.bill).to eq 10 }
end
end
end
context "when a percentage of turnover is not included" do
before { Spree::Config.set(:account_invoices_monthly_rate, 0) }
context "when a fixed cost is not included" do
before { Spree::Config.set(:account_invoices_monthly_fixed, 0) }
context "when the bill is capped" do
context "at a level higher than the fixed charge" do
before { Spree::Config.set(:account_invoices_monthly_cap, 15) }
it { expect(subject.bill).to eq 10 }
context "when a percentage of turnover is included" do
before { Spree::Config.set(:account_invoices_monthly_rate, 0.5) }
context "when the bill is capped" do
context "at a level higher than the product of the rate and turnover" do
before { Spree::Config.set(:account_invoices_monthly_cap, 55) }
it { expect(subject.bill).to eq 50 }
end
context "at a level lower than the product of the rate and turnover" do
before { Spree::Config.set(:account_invoices_monthly_cap, 45) }
it { expect(subject.bill).to eq 45 }
end
end
context "at a level lower than the fixed charge" do
before { Spree::Config.set(:account_invoices_monthly_cap, 5) }
it { expect(subject.bill).to eq 5 }
context "when the bill is not capped" do
before { Spree::Config.set(:account_invoices_monthly_cap, 0) }
it { expect(subject.bill).to eq 50 }
end
end
context "when the bill is not capped" do
before { Spree::Config.set(:account_invoices_monthly_cap, 0) }
it { expect(subject.bill).to eq 10 }
context "when a percentage of turnover is not included" do
before { Spree::Config.set(:account_invoices_monthly_rate, 0) }
context "when the bill is capped" do
before { Spree::Config.set(:account_invoices_monthly_cap, 20) }
it { expect(subject.bill).to eq 0 }
end
context "when the bill is not capped" do
before { Spree::Config.set(:account_invoices_monthly_cap, 0) }
it { expect(subject.bill).to eq 0 }
end
end
end
end
context "when a fixed cost is not included" do
before { Spree::Config.set(:account_invoices_monthly_fixed, 0) }
context "when turnover is above minimum billable turnover" do
before { Spree::Config.set(:minimum_billable_turnover, 99) }
context "when a percentage of turnover is included" do
before { Spree::Config.set(:account_invoices_monthly_rate, 0.5) }
context "when a fixed cost is included" do
before { Spree::Config.set(:account_invoices_monthly_fixed, 10) }
context "when the bill is capped" do
context "at a level higher than the product of the rate and turnover" do
before { Spree::Config.set(:account_invoices_monthly_cap, 55) }
it { expect(subject.bill).to eq 50 }
context "when a percentage of turnover is included" do
before { Spree::Config.set(:account_invoices_monthly_rate, 0.5) }
context "when the bill is capped" do
context "at a level higher than the fixed charge plus the product of the rate and turnover" do
before { Spree::Config.set(:account_invoices_monthly_cap, 65) }
it { expect(subject.bill).to eq 60 }
end
context "at a level lower than the fixed charge plus the product of the rate and turnover" do
before { Spree::Config.set(:account_invoices_monthly_cap, 55) }
it { expect(subject.bill).to eq 55 }
end
end
context "at a level lower than the product of the rate and turnover" do
before { Spree::Config.set(:account_invoices_monthly_cap, 45) }
it { expect(subject.bill).to eq 45 }
context "when the bill is not capped" do
before { Spree::Config.set(:account_invoices_monthly_cap, 0) }
it { expect(subject.bill).to eq 60 }
end
end
context "when the bill is not capped" do
before { Spree::Config.set(:account_invoices_monthly_cap, 0) }
it { expect(subject.bill).to eq 50 }
context "when a percentage of turnover is not included" do
before { Spree::Config.set(:account_invoices_monthly_rate, 0) }
context "when the bill is capped" do
context "at a level higher than the fixed charge" do
before { Spree::Config.set(:account_invoices_monthly_cap, 15) }
it { expect(subject.bill).to eq 10 }
end
context "at a level lower than the fixed charge" do
before { Spree::Config.set(:account_invoices_monthly_cap, 5) }
it { expect(subject.bill).to eq 5 }
end
end
context "when the bill is not capped" do
before { Spree::Config.set(:account_invoices_monthly_cap, 0) }
it { expect(subject.bill).to eq 10 }
end
end
end
context "when a percentage of turnover is not included" do
before { Spree::Config.set(:account_invoices_monthly_rate, 0) }
context "when a fixed cost is not included" do
before { Spree::Config.set(:account_invoices_monthly_fixed, 0) }
context "when the bill is capped" do
before { Spree::Config.set(:account_invoices_monthly_cap, 20) }
it { expect(subject.bill).to eq 0 }
context "when a percentage of turnover is included" do
before { Spree::Config.set(:account_invoices_monthly_rate, 0.5) }
context "when the bill is capped" do
context "at a level higher than the product of the rate and turnover" do
before { Spree::Config.set(:account_invoices_monthly_cap, 55) }
it { expect(subject.bill).to eq 50 }
end
context "at a level lower than the product of the rate and turnover" do
before { Spree::Config.set(:account_invoices_monthly_cap, 45) }
it { expect(subject.bill).to eq 45 }
end
end
context "when the bill is not capped" do
before { Spree::Config.set(:account_invoices_monthly_cap, 0) }
it { expect(subject.bill).to eq 50 }
end
end
context "when the bill is not capped" do
before { Spree::Config.set(:account_invoices_monthly_cap, 0) }
it { expect(subject.bill).to eq 0 }
context "when a percentage of turnover is not included" do
before { Spree::Config.set(:account_invoices_monthly_rate, 0) }
context "when the bill is capped" do
before { Spree::Config.set(:account_invoices_monthly_cap, 20) }
it { expect(subject.bill).to eq 0 }
end
context "when the bill is not capped" do
before { Spree::Config.set(:account_invoices_monthly_cap, 0) }
it { expect(subject.bill).to eq 0 }
end
end
end
end
context "when turnover is below minimum billable turnover" do
before { Spree::Config.set(:minimum_billable_turnover, 101) }
context "when a fixed cost is included" do
before { Spree::Config.set(:account_invoices_monthly_fixed, 10) }
context "when a percentage of turnover is included" do
before { Spree::Config.set(:account_invoices_monthly_rate, 0.5) }
context "when the bill is capped" do
context "at a level higher than the fixed charge plus the product of the rate and turnover" do
before { Spree::Config.set(:account_invoices_monthly_cap, 65) }
it { expect(subject.bill).to eq 0 }
end
context "at a level lower than the fixed charge plus the product of the rate and turnover" do
before { Spree::Config.set(:account_invoices_monthly_cap, 55) }
it { expect(subject.bill).to eq 0 }
end
end
context "when the bill is not capped" do
before { Spree::Config.set(:account_invoices_monthly_cap, 0) }
it { expect(subject.bill).to eq 0 }
end
end
context "when a percentage of turnover is not included" do
before { Spree::Config.set(:account_invoices_monthly_rate, 0) }
context "when the bill is capped" do
context "at a level higher than the fixed charge" do
before { Spree::Config.set(:account_invoices_monthly_cap, 15) }
it { expect(subject.bill).to eq 0 }
end
context "at a level lower than the fixed charge" do
before { Spree::Config.set(:account_invoices_monthly_cap, 5) }
it { expect(subject.bill).to eq 0 }
end
end
context "when the bill is not capped" do
before { Spree::Config.set(:account_invoices_monthly_cap, 0) }
it { expect(subject.bill).to eq 0 }
end
end
end
context "when a fixed cost is not included" do
before { Spree::Config.set(:account_invoices_monthly_fixed, 0) }
context "when a percentage of turnover is included" do
before { Spree::Config.set(:account_invoices_monthly_rate, 0.5) }
context "when the bill is capped" do
context "at a level higher than the product of the rate and turnover" do
before { Spree::Config.set(:account_invoices_monthly_cap, 55) }
it { expect(subject.bill).to eq 0 }
end
context "at a level lower than the product of the rate and turnover" do
before { Spree::Config.set(:account_invoices_monthly_cap, 45) }
it { expect(subject.bill).to eq 0 }
end
end
context "when the bill is not capped" do
before { Spree::Config.set(:account_invoices_monthly_cap, 0) }
it { expect(subject.bill).to eq 0 }
end
end
context "when a percentage of turnover is not included" do
before { Spree::Config.set(:account_invoices_monthly_rate, 0) }
context "when the bill is capped" do
before { Spree::Config.set(:account_invoices_monthly_cap, 20) }
it { expect(subject.bill).to eq 0 }
end
context "when the bill is not capped" do
before { Spree::Config.set(:account_invoices_monthly_cap, 0) }
it { expect(subject.bill).to eq 0 }
end
end
end
end
context "when tax is charged" do
before { Spree::Config.set(:account_invoices_tax_rate, 0.1) }
context "when turnover is above minimum billable turnover" do
before { Spree::Config.set(:minimum_billable_turnover, 99) }
context "when a fixed cost is included" do
before { Spree::Config.set(:account_invoices_monthly_fixed, 10) }
context "when a percentage of turnover is included" do
before { Spree::Config.set(:account_invoices_monthly_rate, 0.5) }
context "when the bill is capped" do
context "at a level higher than the fixed charge plus the product of the rate and turnover" do
before { Spree::Config.set(:account_invoices_monthly_cap, 61) }
it { expect(subject.bill).to eq 66 }
end
context "at a level lower than the fixed charge plus the product of the rate and turnover" do
before { Spree::Config.set(:account_invoices_monthly_cap, 59) }
it {
expect(subject.bill.to_f).to eq 64.9
}
end
end
context "when the bill is not capped" do
before { Spree::Config.set(:account_invoices_monthly_cap, 0) }
it { expect(subject.bill).to eq 66 }
end
end
context "when a percentage of turnover is not included" do
before { Spree::Config.set(:account_invoices_monthly_rate, 0) }
context "when the bill is capped" do
context "at a level higher than the fixed charge" do
before { Spree::Config.set(:account_invoices_monthly_cap, 11) }
it { expect(subject.bill).to eq 11 }
end
context "at a level lower than the fixed charge" do
before { Spree::Config.set(:account_invoices_monthly_cap, 9) }
it { expect(subject.bill.to_f).to eq 9.9 }
end
end
context "when the bill is not capped" do
before { Spree::Config.set(:account_invoices_monthly_cap, 0) }
it { expect(subject.bill).to eq 11 }
end
end
end
context "when a fixed cost is not included" do
before { Spree::Config.set(:account_invoices_monthly_fixed, 0) }
context "when a percentage of turnover is included" do
before { Spree::Config.set(:account_invoices_monthly_rate, 0.5) }
context "when the bill is capped" do
context "at a level higher than the product of the rate and turnover" do
before { Spree::Config.set(:account_invoices_monthly_cap, 51) }
it { expect(subject.bill).to eq 55 }
end
context "at a level lower than the product of the rate and turnover" do
before { Spree::Config.set(:account_invoices_monthly_cap, 49) }
it { expect(subject.bill.to_f).to eq 53.9 }
end
end
context "when the bill is not capped" do
before { Spree::Config.set(:account_invoices_monthly_cap, 0) }
it { expect(subject.bill).to eq 55 }
end
end
context "when a percentage of turnover is not included" do
before { Spree::Config.set(:account_invoices_monthly_rate, 0) }
context "when the bill is capped" do
before { Spree::Config.set(:account_invoices_monthly_cap, 20) }
it { expect(subject.bill).to eq 0 }
end
context "when the bill is not capped" do
before { Spree::Config.set(:account_invoices_monthly_cap, 0) }
it { expect(subject.bill).to eq 0 }
end
end
end
end
end
end
context "when tax is charged" do
before { Spree::Config.set(:account_invoices_tax_rate, 0.1) }
context "when turnover is below minimum billable turnover" do
before { Spree::Config.set(:minimum_billable_turnover, 101) }
context "when a fixed cost is included" do
before { Spree::Config.set(:account_invoices_monthly_fixed, 10) }
@@ -132,20 +409,20 @@ describe BillablePeriod, type: :model do
context "when the bill is capped" do
context "at a level higher than the fixed charge plus the product of the rate and turnover" do
before { Spree::Config.set(:account_invoices_monthly_cap, 61) }
it { expect(subject.bill).to eq 66 }
it { expect(subject.bill).to eq 0 }
end
context "at a level lower than the fixed charge plus the product of the rate and turnover" do
before { Spree::Config.set(:account_invoices_monthly_cap, 59) }
it {
expect(subject.bill.to_f).to eq 64.9
expect(subject.bill.to_f).to eq 0
}
end
end
context "when the bill is not capped" do
before { Spree::Config.set(:account_invoices_monthly_cap, 0) }
it { expect(subject.bill).to eq 66 }
it { expect(subject.bill).to eq 0 }
end
end
@@ -155,18 +432,18 @@ describe BillablePeriod, type: :model do
context "when the bill is capped" do
context "at a level higher than the fixed charge" do
before { Spree::Config.set(:account_invoices_monthly_cap, 11) }
it { expect(subject.bill).to eq 11 }
it { expect(subject.bill).to eq 0 }
end
context "at a level lower than the fixed charge" do
before { Spree::Config.set(:account_invoices_monthly_cap, 9) }
it { expect(subject.bill.to_f).to eq 9.9 }
it { expect(subject.bill.to_f).to eq 0 }
end
end
context "when the bill is not capped" do
before { Spree::Config.set(:account_invoices_monthly_cap, 0) }
it { expect(subject.bill).to eq 11 }
it { expect(subject.bill).to eq 0 }
end
end
end
@@ -180,18 +457,18 @@ describe BillablePeriod, type: :model do
context "when the bill is capped" do
context "at a level higher than the product of the rate and turnover" do
before { Spree::Config.set(:account_invoices_monthly_cap, 51) }
it { expect(subject.bill).to eq 55 }
it { expect(subject.bill).to eq 0 }
end
context "at a level lower than the product of the rate and turnover" do
before { Spree::Config.set(:account_invoices_monthly_cap, 49) }
it { expect(subject.bill.to_f).to eq 53.9 }
it { expect(subject.bill.to_f).to eq 0 }
end
end
context "when the bill is not capped" do
before { Spree::Config.set(:account_invoices_monthly_cap, 0) }
it { expect(subject.bill).to eq 55 }
it { expect(subject.bill).to eq 0 }
end
end