require File.dirname(__FILE__) + '/../test_helper' class ContractTest < ActiveSupport::TestCase should_belong_to :account_executive should_belong_to :project should_belong_to :payment_term should_have_many :deliverables should_validate_presence_of :name should_validate_presence_of :account_executive should_validate_presence_of :project should_validate_presence_of :start_date should_validate_presence_of :end_date should_not_allow_mass_assignment_of :project_id, :project, :discount_type should_allow_values_for :discount_type, "$", "%", nil, '' should_not_allow_values_for :discount_type, ["amount", "percent", "bar"] should_allow_values_for :status, "", nil, 'open', 'locked', 'closed' should_not_allow_values_for :status, "other", "things", "1" context "end_date" do should "be after start_date" do @contract = Contract.new(:start_date => Date.today, :end_date => Date.yesterday) assert @contract.invalid? assert_equal "must be greater than start date", @contract.errors.on(:end_date) end end should "default executed to false" do @contract = Contract.new assert_equal false, @contract.executed end should "default status to open" do @contract = Contract.new assert_equal "open", @contract.status end context "#labor_budget" do should "sum all of the labor budgets of the Deliverables" do contract = Contract.generate! contract.deliverables << @deliverable_1 = FixedDeliverable.generate! LaborBudget.generate!(:deliverable => @deliverable_1, :budget => 100) contract.deliverables << @deliverable_2 = FixedDeliverable.generate! LaborBudget.generate!(:deliverable => @deliverable_2, :budget => 100) assert_equal 200, contract.labor_budget end end context "#labor_spent" do setup do configure_overhead_plugin end should "sum all of the labor spent on the Deliverables" do @project = Project.generate! @manager = User.generate! @role = Role.generate! User.add_to_project(@manager, @project, @role) @rate = Rate.generate!(:project => @project, :user => @manager, :date_in_effect => Date.yesterday, :amount => 100) contract = Contract.generate! contract.deliverables << @deliverable_1 = FixedDeliverable.generate! @deliverable_1.issues << @issue1 = Issue.generate_for_project!(@project) TimeEntry.generate!(:hours => 5, :issue => @issue1, :project => @project, :activity => @billable_activity, :user => @manager) contract.deliverables << @deliverable_2 = HourlyDeliverable.generate! @deliverable_2.issues << @issue2 = Issue.generate_for_project!(@project) TimeEntry.generate!(:hours => 20, :issue => @issue2, :project => @project, :activity => @billable_activity, :user => @manager) assert_equal 2500, contract.labor_spent end end context "#overhead_budget" do should "sum all of the overhead budgets of the Deliverables" do contract = Contract.generate! contract.deliverables << @deliverable_1 = FixedDeliverable.generate! OverheadBudget.generate!(:deliverable => @deliverable_1, :budget => 100) contract.deliverables << @deliverable_2 = FixedDeliverable.generate! OverheadBudget.generate!(:deliverable => @deliverable_2, :budget => 100) assert_equal 200, contract.overhead_budget end end context "#overhead_spent" do setup do configure_overhead_plugin end should "sum all of the overhead spent on the Deliverables" do @project = Project.generate! @manager = User.generate! @role = Role.generate! User.add_to_project(@manager, @project, @role) @rate = Rate.generate!(:project => @project, :user => @manager, :date_in_effect => Date.yesterday, :amount => 100) contract = Contract.generate! contract.deliverables << @deliverable_1 = FixedDeliverable.generate! @deliverable_1.issues << @issue1 = Issue.generate_for_project!(@project) TimeEntry.generate!(:hours => 10, :issue => @issue1, :project => @project, :activity => @non_billable_activity, :user => @manager) contract.deliverables << @deliverable_2 = HourlyDeliverable.generate! @deliverable_2.issues << @issue2 = Issue.generate_for_project!(@project) TimeEntry.generate!(:hours => 10, :issue => @issue2, :project => @project, :activity => @non_billable_activity, :user => @manager) assert_equal 2000, contract.overhead_spent end end context "#estimated_hour_budget" do should "sum all of the labor and overhead budgets of the Deliverables" do contract = Contract.generate! contract.deliverables << @deliverable_1 = FixedDeliverable.generate! LaborBudget.generate!(:deliverable => @deliverable_1, :hours => 50) contract.deliverables << @deliverable_2 = HourlyDeliverable.generate! OverheadBudget.generate!(:deliverable => @deliverable_2, :hours => 60) assert_equal 110, contract.estimated_hour_budget end end context "#estimated_hour_spent" do should "sum all of the hours spent on the Deliverables" do @project = Project.generate! contract = Contract.generate! contract.deliverables << @deliverable_1 = FixedDeliverable.generate! @deliverable_1.issues << @issue1 = Issue.generate_for_project!(@project) @deliverable_1.issues << @issue2 = Issue.generate_for_project!(@project) TimeEntry.generate!(:hours => 10, :issue => @issue1, :project => @project) TimeEntry.generate!(:hours => 10, :issue => @issue2, :project => @project) contract.deliverables << @deliverable_2 = HourlyDeliverable.generate! @deliverable_2.issues << @issue3 = Issue.generate_for_project!(@project) @deliverable_2.issues << @issue4 = Issue.generate_for_project!(@project) TimeEntry.generate!(:hours => 10, :issue => @issue3, :project => @project) TimeEntry.generate!(:hours => 10, :issue => @issue4, :project => @project) assert_equal 40, contract.estimated_hour_spent end end context "#total_budget" do should "sum all of the totals of the Deliverables" do contract = Contract.generate!(:billable_rate => 100.0) contract.deliverables << @deliverable_1 = FixedDeliverable.generate!(:total => 10_000) contract.deliverables << @deliverable_2 = HourlyDeliverable.generate! LaborBudget.generate!(:deliverable => @deliverable_2, :hours => 10) OverheadBudget.generate!(:deliverable => @deliverable_2, :hours => 20) assert_equal 10_000 + (10 * 100), contract.total_budget end end context "#profit_budget" do should "sum all of the profit budgets of the Deliverables" do contract = Contract.generate!(:billable_rate => 100.0) contract.deliverables << @deliverable_1 = FixedDeliverable.generate!(:total => 10_000) LaborBudget.generate!(:deliverable => @deliverable_1, :budget => 2000) OverheadBudget.generate!(:deliverable => @deliverable_1, :budget => 2000) contract.deliverables << @deliverable_2 = HourlyDeliverable.generate! LaborBudget.generate!(:deliverable => @deliverable_2, :hours => 10) OverheadBudget.generate!(:deliverable => @deliverable_2, :hours => 20) assert_equal 10_000 - 4000, @deliverable_1.profit_budget assert_equal (10 * 100.0) - 0, @deliverable_2.profit_budget assert_equal 7000, contract.profit_budget end end context "#total_spent" do should "sum all of the total spents on the Deliverables" do configure_overhead_plugin contract = Contract.generate!(:billable_rate => 150.0) @project = Project.generate! @developer = User.generate! @role = Role.generate! User.add_to_project(@developer, @project, @role) contract.deliverables << @deliverable_1 = FixedDeliverable.generate!(:total => 10_000) contract.deliverables << @deliverable_2 = HourlyDeliverable.generate!(:contract => contract) @deliverable_2.issues << @issue1 = Issue.generate_for_project!(@project) TimeEntry.generate!(:hours => 15, :issue => @issue1, :project => @project, :activity => @billable_activity, :user => @developer) assert_equal 10_000, @deliverable_1.total_spent assert_equal 2250, @deliverable_2.total_spent assert_equal 12_250, contract.total_spent end end context "#profit_left" do should "sum all of the profit left on all of the Deliverables" do configure_overhead_plugin contract = Contract.generate!(:billable_rate => 150.0) @project = Project.generate! @developer = User.generate! @manager = User.generate! @role = Role.generate! User.add_to_project(@developer, @project, @role) User.add_to_project(@manager, @project, @role) @rate = Rate.generate!(:project => @project, :user => @developer, :date_in_effect => Date.yesterday, :amount => 55) @rate = Rate.generate!(:project => @project, :user => @manager, :date_in_effect => Date.yesterday, :amount => 75) contract.deliverables << @deliverable_1 = FixedDeliverable.generate!(:total => 2000) @deliverable_1.issues << @issue1 = Issue.generate_for_project!(@project) TimeEntry.generate!(:hours => 15, :issue => @issue1, :project => @project, :activity => @billable_activity, :user => @developer) TimeEntry.generate!(:hours => 4, :issue => @issue1, :project => @project, :activity => @non_billable_activity, :user => @manager) contract.deliverables << @deliverable_2 = HourlyDeliverable.generate!(:contract => contract) @deliverable_2.issues << @issue2 = Issue.generate_for_project!(@project) TimeEntry.generate!(:hours => 15, :issue => @issue2, :project => @project, :activity => @billable_activity, :user => @developer) 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 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