Added a helper method to TimeEntry that will encapsulate the rate API for a TimeEntry.
* TimeEntry#cost will return the amount the TimeEntry costs based on: ** logged hours times the assigned rate amount ** logged hours times the effective project rate for the user ** logged hours times the effective default rate for the user ** 0 if the user has no rates at all #1924
This commit is contained in:
1 parent
2d3fbf02b0
commit
6aa00eeeb9
3 files changed
+68
No files matched your search
@@ -2,6 +2,7 @@ require 'redmine'
|
|||||||
|
|
||||||
require 'rate_users_helper_patch'
|
require 'rate_users_helper_patch'
|
||||||
require 'rate_sort_helper_patch'
|
require 'rate_sort_helper_patch'
|
||||||
|
require 'rate_time_entry_patch'
|
||||||
|
|
||||||
require 'rate_project_hook'
|
require 'rate_project_hook'
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,38 @@
|
|||||||
|
require_dependency 'time_entry'
|
||||||
|
|
||||||
|
module RateTimeEntryPatch
|
||||||
|
def self.included(base) # :nodoc:
|
||||||
|
base.extend(ClassMethods)
|
||||||
|
|
||||||
|
base.send(:include, InstanceMethods)
|
||||||
|
|
||||||
|
# Same as typing in the class
|
||||||
|
base.class_eval do
|
||||||
|
unloadable # Send unloadable so it will not be unloaded in development
|
||||||
|
belongs_to :rate
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
module ClassMethods
|
||||||
|
|
||||||
|
end
|
||||||
|
|
||||||
|
module InstanceMethods
|
||||||
|
# Returns the current cost of the TimeEntry based on it's rate and hours
|
||||||
|
def cost
|
||||||
|
if self.rate.nil?
|
||||||
|
amount = Rate.amount_for(self.user, self.project, self.spent_on.to_s)
|
||||||
|
else
|
||||||
|
amount = rate.amount
|
||||||
|
end
|
||||||
|
|
||||||
|
return 0.0 if amount.nil?
|
||||||
|
|
||||||
|
return amount.to_f * hours.to_f
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
TimeEntry.send(:include, RateTimeEntryPatch)
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
require File.dirname(__FILE__) + '/../spec_helper'
|
||||||
|
|
||||||
|
describe TimeEntry, 'cost' do
|
||||||
|
before(:each) do
|
||||||
|
@user = mock_model(User)
|
||||||
|
@project = mock_model(Project)
|
||||||
|
@date = Date.today.to_s
|
||||||
|
@time_entry = TimeEntry.new({:user => @user, :project => @project, :spent_on => @date, :hours => 10.0})
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'should return 0.0 if there are no rates for the user' do
|
||||||
|
Rate.should_receive(:amount_for).with(@user, @project, @date).and_return(nil)
|
||||||
|
@time_entry.cost.should eql(0.0)
|
||||||
|
end
|
||||||
|
|
||||||
|
describe 'should return the product of hours by' do
|
||||||
|
it 'the results of Rate.amount_for' do
|
||||||
|
Rate.should_receive(:amount_for).with(@user, @project, @date).and_return(200.0)
|
||||||
|
@time_entry.cost.should eql(200.0 * @time_entry.hours)
|
||||||
|
end
|
||||||
|
|
||||||
|
it 'the assigned rate' do
|
||||||
|
rate = mock_model(Rate, :amount => 100.0)
|
||||||
|
@time_entry.should_receive(:rate).at_least(:twice).and_return(rate)
|
||||||
|
@time_entry.cost.should eql(rate.amount * @time_entry.hours)
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
||||||
|
end
|
||||||
Reference in new issue
Block a user