mirror of
https://github.com/openfoodfoundation/openfoodnetwork
synced 2026-01-24 20:36:49 +00:00
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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user