Merge branch '4477-fixed-expenses'
This commit is contained in:
@@ -247,11 +247,62 @@ class ContractTest < ActiveSupport::TestCase
|
||||
TimeEntry.generate!(:hours => 4, :issue => @issue2, :project => @project,
|
||||
:activity => @non_billable_activity,
|
||||
:user => @manager)
|
||||
@deliverable_2.fixed_budgets << FixedBudget.spawn(:budget => 200, :markup => '$100', :paid => true)
|
||||
|
||||
assert_equal 875, @deliverable_1.profit_left
|
||||
assert_equal 1125, @deliverable_2.profit_left
|
||||
assert_equal 2000, contract.profit_left
|
||||
assert_equal 825, @deliverable_2.profit_left
|
||||
assert_equal 1700, contract.profit_left
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
context "#fixed_budget" do
|
||||
should "sum all fixed budget amounts on the Deliverables" do
|
||||
contract = Contract.generate!
|
||||
contract.deliverables << @deliverable_1 = FixedDeliverable.generate!
|
||||
FixedBudget.generate!(:deliverable => @deliverable_1, :budget => '$1,000')
|
||||
contract.deliverables << @deliverable_2 = HourlyDeliverable.generate!
|
||||
FixedBudget.generate!(:deliverable => @deliverable_2, :budget => '$2,000')
|
||||
|
||||
assert_equal 3000, contract.fixed_budget
|
||||
end
|
||||
end
|
||||
|
||||
context "#fixed_spent" do
|
||||
should "sum all fixed budget amounts on the Deliverables which are paid" do
|
||||
contract = Contract.generate!
|
||||
contract.deliverables << @deliverable_1 = FixedDeliverable.generate!
|
||||
FixedBudget.generate!(:deliverable => @deliverable_1, :budget => '$1,000', :paid => true)
|
||||
contract.deliverables << @deliverable_2 = HourlyDeliverable.generate!
|
||||
FixedBudget.generate!(:deliverable => @deliverable_2, :budget => '$2,000')
|
||||
|
||||
assert_equal 1000, contract.fixed_spent
|
||||
end
|
||||
end
|
||||
|
||||
context "#fixed_markup_budget" do
|
||||
should "sum all fixed budget markup values on the Deliverables" do
|
||||
contract = Contract.generate!
|
||||
contract.deliverables << @deliverable_1 = FixedDeliverable.generate!
|
||||
FixedBudget.generate!(:deliverable => @deliverable_1, :budget => '$1,000', :markup => '$100')
|
||||
contract.deliverables << @deliverable_2 = HourlyDeliverable.generate!
|
||||
FixedBudget.generate!(:deliverable => @deliverable_2, :budget => '$2,000', :markup => '200%')
|
||||
|
||||
assert_equal (100) + (2.00 * 2000), contract.fixed_markup_budget
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
context "#fixed_markup_spent" do
|
||||
should "sum all fixed budget markup values on the Deliverables which are paid" do
|
||||
contract = Contract.generate!
|
||||
contract.deliverables << @deliverable_1 = FixedDeliverable.generate!
|
||||
FixedBudget.generate!(:deliverable => @deliverable_1, :budget => '$1,000', :markup => '$100', :paid => true)
|
||||
contract.deliverables << @deliverable_2 = HourlyDeliverable.generate!
|
||||
FixedBudget.generate!(:deliverable => @deliverable_2, :budget => '$2,000', :markup => '200%')
|
||||
|
||||
assert_equal (100) + (0), contract.fixed_markup_spent
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
@@ -5,6 +5,7 @@ class DeliverableTest < ActiveSupport::TestCase
|
||||
should_belong_to :manager
|
||||
should_have_many :labor_budgets
|
||||
should_have_many :overhead_budgets
|
||||
should_have_many :fixed_budgets
|
||||
should_have_many :issues
|
||||
|
||||
should_validate_presence_of :title
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
require File.dirname(__FILE__) + '/../test_helper'
|
||||
|
||||
class FixedBudgetTest < ActiveSupport::TestCase
|
||||
should_belong_to :deliverable
|
||||
|
||||
context "#markup_value" do
|
||||
setup do
|
||||
@fixed_budget = FixedBudget.new(:budget => 1000)
|
||||
end
|
||||
|
||||
context "with no markup" do
|
||||
should "be 0" do
|
||||
assert_equal nil, @fixed_budget.markup
|
||||
assert_equal 0, @fixed_budget.markup_value
|
||||
end
|
||||
end
|
||||
|
||||
context "with a % markup" do
|
||||
should "equal the budget times the %" do
|
||||
@fixed_budget.markup = '50%'
|
||||
assert_equal 500, @fixed_budget.markup_value
|
||||
end
|
||||
end
|
||||
|
||||
context "with a $ markup" do
|
||||
should "equal the $ markup (straight markup)" do
|
||||
@fixed_budget.markup = '$4,000.57'
|
||||
assert_equal 4000.57, @fixed_budget.markup_value
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
@@ -13,8 +13,9 @@ class FixedDeliverableTest < ActiveSupport::TestCase
|
||||
LaborBudget.generate!(:deliverable => deliverable, :budget => 200)
|
||||
LaborBudget.generate!(:deliverable => deliverable, :budget => 200)
|
||||
OverheadBudget.generate!(:deliverable => deliverable, :budget => 200)
|
||||
FixedBudget.generate!(:deliverable => deliverable, :budget => '$100', :markup => '50%') # $50 markup
|
||||
|
||||
assert_equal 400, deliverable.profit_budget
|
||||
assert_equal 400 - 150, deliverable.profit_budget
|
||||
end
|
||||
|
||||
should "be 0 if there is no total" do
|
||||
|
||||
@@ -20,13 +20,14 @@ class HourlyDeliverableTest < ActiveSupport::TestCase
|
||||
assert_equal 0, d.total
|
||||
end
|
||||
|
||||
should "multiply the total number of labor budget hours by the contract billable rate" do
|
||||
should "multiply the total number of labor budget hours by the contract billable rate and add the fixed budget and markup" do
|
||||
contract = Contract.generate!(:billable_rate => 100.0)
|
||||
d = HourlyDeliverable.generate!(:contract => contract)
|
||||
d.labor_budgets << LaborBudget.generate!(:hours => 10)
|
||||
d.overhead_budgets << OverheadBudget.generate!(:hours => 20)
|
||||
d.fixed_budgets << FixedBudget.generate!(:budget => '$100', :markup => '50%') # $50 markup
|
||||
|
||||
assert_equal 100.0 * 10, d.total
|
||||
assert_equal (100.0 * 10) + (100 + 50), d.total
|
||||
end
|
||||
end
|
||||
|
||||
@@ -86,9 +87,10 @@ class HourlyDeliverableTest < ActiveSupport::TestCase
|
||||
LaborBudget.generate!(:deliverable => @deliverable, :hours => 5, :budget => 250)
|
||||
LaborBudget.generate!(:deliverable => @deliverable, :hours => 5, :budget => 250)
|
||||
OverheadBudget.generate!(:deliverable => @deliverable, :hours => 3, :budget => 225)
|
||||
FixedBudget.generate!(:deliverable => @deliverable, :budget => '$100', :markup => '50%') # $50 markup
|
||||
|
||||
assert_equal 1500, @deliverable.total
|
||||
assert_equal 1500 - (225 + 250 + 250), @deliverable.profit_budget
|
||||
assert_equal 1650, @deliverable.total # has the FixedBudget items added to the total also
|
||||
assert_equal 1650 - (225 + 250 + 250 + 100 + 50), @deliverable.profit_budget
|
||||
end
|
||||
end
|
||||
|
||||
|
||||
@@ -476,4 +476,152 @@ class RetainerDeliverableTest < ActiveSupport::TestCase
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
context "#fixed_budget_total" do
|
||||
setup do
|
||||
@contract = Contract.generate!(:billable_rate => 100)
|
||||
@deliverable = RetainerDeliverable.generate!(:start_date => '2010-01-01', :end_date => '2010-03-31', :contract => @contract)
|
||||
@deliverable.fixed_budgets << FixedBudget.spawn(:budget => 1000)
|
||||
@deliverable.fixed_budgets << FixedBudget.spawn(:budget => 2000)
|
||||
@deliverable.save!
|
||||
|
||||
assert_equal 3000 * 3, @deliverable.fixed_budget_total
|
||||
end
|
||||
|
||||
context "with a empty period" do
|
||||
should "use all periods" do
|
||||
assert_equal 9000, @deliverable.fixed_budget_total(nil)
|
||||
end
|
||||
end
|
||||
|
||||
context "with a period out of the retainer range" do
|
||||
should "filter the records" do
|
||||
assert_equal 0, @deliverable.fixed_budget_total(Date.new(2011,1,1))
|
||||
end
|
||||
end
|
||||
|
||||
context "with an invalid period" do
|
||||
should "return 0" do
|
||||
assert_equal 0, @deliverable.fixed_budget_total('1')
|
||||
end
|
||||
end
|
||||
|
||||
context "with a period in the retainer range" do
|
||||
should "filter the records" do
|
||||
assert_equal 3000, @deliverable.fixed_budget_total(Date.new(2010,2,1))
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
context "#fixed_budget_total_spent" do
|
||||
setup do
|
||||
@contract = Contract.generate!(:billable_rate => 100)
|
||||
@deliverable = RetainerDeliverable.generate!(:start_date => '2010-01-01', :end_date => '2010-03-31', :contract => @contract)
|
||||
@deliverable.fixed_budgets << FixedBudget.spawn(:budget => 1000, :paid => true)
|
||||
@deliverable.fixed_budgets << FixedBudget.spawn(:budget => 2000)
|
||||
@deliverable.save!
|
||||
|
||||
assert_equal 1000 * 3, @deliverable.fixed_budget_total_spent
|
||||
end
|
||||
|
||||
context "with a empty period" do
|
||||
should "use all periods" do
|
||||
assert_equal 3000, @deliverable.fixed_budget_total_spent(nil)
|
||||
end
|
||||
end
|
||||
|
||||
context "with a period out of the retainer range" do
|
||||
should "filter the records" do
|
||||
assert_equal 0, @deliverable.fixed_budget_total_spent(Date.new(2011,1,1))
|
||||
end
|
||||
end
|
||||
|
||||
context "with an invalid period" do
|
||||
should "return 0" do
|
||||
assert_equal 0, @deliverable.fixed_budget_total_spent('1')
|
||||
end
|
||||
end
|
||||
|
||||
context "with a period in the retainer range" do
|
||||
should "filter the records" do
|
||||
assert_equal 1000, @deliverable.fixed_budget_total_spent(Date.new(2010,2,1))
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
context "#fixed_markup_budget_total" do
|
||||
setup do
|
||||
@contract = Contract.generate!(:billable_rate => 100)
|
||||
@deliverable = RetainerDeliverable.generate!(:start_date => '2010-01-01', :end_date => '2010-03-31', :contract => @contract)
|
||||
@deliverable.fixed_budgets << FixedBudget.spawn(:budget => 1000, :markup => '50%')
|
||||
@deliverable.fixed_budgets << FixedBudget.spawn(:budget => 2000, :markup => '$1000')
|
||||
@deliverable.save!
|
||||
|
||||
assert_equal (500 + 1000) * 3, @deliverable.fixed_markup_budget_total
|
||||
end
|
||||
|
||||
context "with a empty period" do
|
||||
should "use all periods" do
|
||||
assert_equal 4500, @deliverable.fixed_markup_budget_total(nil)
|
||||
end
|
||||
end
|
||||
|
||||
context "with a period out of the retainer range" do
|
||||
should "filter the records" do
|
||||
assert_equal 0, @deliverable.fixed_markup_budget_total(Date.new(2011,1,1))
|
||||
end
|
||||
end
|
||||
|
||||
context "with an invalid period" do
|
||||
should "return 0" do
|
||||
assert_equal 0, @deliverable.fixed_markup_budget_total('1')
|
||||
end
|
||||
end
|
||||
|
||||
context "with a period in the retainer range" do
|
||||
should "filter the records" do
|
||||
assert_equal 1500, @deliverable.fixed_markup_budget_total(Date.new(2010,2,1))
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
|
||||
context "#fixed_markup_budget_total_spent" do
|
||||
setup do
|
||||
@contract = Contract.generate!(:billable_rate => 100)
|
||||
@deliverable = RetainerDeliverable.generate!(:start_date => '2010-01-01', :end_date => '2010-03-31', :contract => @contract)
|
||||
@deliverable.fixed_budgets << FixedBudget.spawn(:budget => 1000, :markup => '50%', :paid => true)
|
||||
@deliverable.fixed_budgets << FixedBudget.spawn(:budget => 2000, :markup => '$1000')
|
||||
@deliverable.save!
|
||||
|
||||
assert_equal (500) * 3, @deliverable.fixed_markup_budget_total_spent
|
||||
end
|
||||
|
||||
context "with a empty period" do
|
||||
should "use all periods" do
|
||||
assert_equal 1500, @deliverable.fixed_markup_budget_total_spent(nil)
|
||||
end
|
||||
end
|
||||
|
||||
context "with a period out of the retainer range" do
|
||||
should "filter the records" do
|
||||
assert_equal 0, @deliverable.fixed_markup_budget_total_spent(Date.new(2011,1,1))
|
||||
end
|
||||
end
|
||||
|
||||
context "with an invalid period" do
|
||||
should "return 0" do
|
||||
assert_equal 0, @deliverable.fixed_markup_budget_total_spent('1')
|
||||
end
|
||||
end
|
||||
|
||||
context "with a period in the retainer range" do
|
||||
should "filter the records" do
|
||||
assert_equal 500, @deliverable.fixed_markup_budget_total_spent(Date.new(2010,2,1))
|
||||
end
|
||||
end
|
||||
|
||||
end
|
||||
end
|
||||
|
||||
Reference in New Issue
Block a user