From 65da8e759450aab2a52ef7c1f8f05baa6ee4eb09 Mon Sep 17 00:00:00 2001 From: Eric Davis Date: Wed, 28 May 2008 12:55:02 -0700 Subject: [PATCH] Completed deliverable.spent calculation. #1136 --- app/models/deliverable.rb | 2 +- app/models/fixed_deliverable.rb | 4 ++++ app/models/hourly_deliverable.rb | 17 ++++++++++++++++ spec/models/deliverable_spec.rb | 5 +++++ spec/models/fixed_deliverable_spec.rb | 9 +++++++++ spec/models/hourly_deliverable_spec.rb | 28 ++++++++++++++++++++++++++ 6 files changed, 64 insertions(+), 1 deletion(-) create mode 100644 spec/models/hourly_deliverable_spec.rb diff --git a/app/models/deliverable.rb b/app/models/deliverable.rb index 1d15b64..67e24dd 100644 --- a/app/models/deliverable.rb +++ b/app/models/deliverable.rb @@ -11,7 +11,7 @@ class Deliverable < ActiveRecord::Base # TODO: mocked def spent - 0 + 0 end # TODO LATER: Shouldn't require the default_done_ratio patch diff --git a/app/models/fixed_deliverable.rb b/app/models/fixed_deliverable.rb index a88408b..4b410a0 100644 --- a/app/models/fixed_deliverable.rb +++ b/app/models/fixed_deliverable.rb @@ -5,4 +5,8 @@ class FixedDeliverable < Deliverable def score 0 end + + def spent + (self.progress.to_f / 100 ) * self.budget + end end diff --git a/app/models/hourly_deliverable.rb b/app/models/hourly_deliverable.rb index ca71da3..8918e11 100644 --- a/app/models/hourly_deliverable.rb +++ b/app/models/hourly_deliverable.rb @@ -1,3 +1,20 @@ class HourlyDeliverable < Deliverable unloadable + + def spent + return 0 unless self.issues.size > 0 + total = 0.0 + + # Get all timelogs assigned + time_logs = self.issues.collect(&:time_entries).flatten + + # Find each Member for their rate + time_logs.each do |time_log| + member = Member.find_by_user_id_and_project_id(time_log.user_id, time_log.project_id) + total += (member.rate * time_log.hours) unless member.nil? || member.rate.nil? + end + + return total + end end + diff --git a/spec/models/deliverable_spec.rb b/spec/models/deliverable_spec.rb index 2b60581..467e17f 100644 --- a/spec/models/deliverable_spec.rb +++ b/spec/models/deliverable_spec.rb @@ -212,4 +212,9 @@ describe Deliverable, '.progress' do end describe Deliverable, '.spent' do + it 'should always return 0 (abstract class)' do + @deliverable = Deliverable.new({ :subject => 'test' }) + + @deliverable.spent.should eql(0) + end end diff --git a/spec/models/fixed_deliverable_spec.rb b/spec/models/fixed_deliverable_spec.rb index c1c2e7a..5ab501d 100644 --- a/spec/models/fixed_deliverable_spec.rb +++ b/spec/models/fixed_deliverable_spec.rb @@ -6,3 +6,12 @@ describe FixedDeliverable, '.score' do @deliverable.score.should eql(0) end end + +describe FixedDeliverable, '.spent' do + it 'should always equal the progress % * budget' do + @deliverable = FixedDeliverable.new({ :subject => 'test' }) + @deliverable.stub!(:progress).and_return(50.0) + @deliverable.stub!(:budget).and_return(5000.0) + @deliverable.spent.should eql(2500.0) + end +end diff --git a/spec/models/hourly_deliverable_spec.rb b/spec/models/hourly_deliverable_spec.rb new file mode 100644 index 0000000..35871f7 --- /dev/null +++ b/spec/models/hourly_deliverable_spec.rb @@ -0,0 +1,28 @@ +require File.dirname(__FILE__) + '/../spec_helper' + +describe HourlyDeliverable, '.spent' do + it 'should equal 0 if there are no issues for the deliverable' do + @deliverable = HourlyDeliverable.new({ :subject => 'test' }) + @deliverable.should_receive(:issues).and_return([]) + + @deliverable.spent.should eql(0) + end + + it 'should return the sum of the member timelogs' do + @project = mock_model(Project) + @user = mock_model(User) + @issue1 = mock_model(Issue) + + @issue_1_time_entry = mock_model(TimeEntry, :issue_id => @issue1.id, :user_id => @user.id, :project_id => @project.id, :hours => 1.0) + @issue1.stub!(:time_entries).and_return([@issue_1_time_entry]) + + @member = mock_model(Member, :user => @user, :project => @project, :rate => 60.0) + Member.should_receive(:find_by_user_id_and_project_id).with(@user.id, @project.id).and_return(@member) + + @deliverable = HourlyDeliverable.new({ :subject => 'test' }) + @issues = [@issue1] + @deliverable.should_receive(:issues).twice.and_return(@issues) + + @deliverable.spent.should eql(60.0) + end +end