/
Charge.rb
72 lines (63 loc) · 2.03 KB
/
Charge.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
#!/usr/bin/env ruby -w
# encoding: UTF-8
#
# = Charge.rb -- The TaskJuggler III Project Management Software
#
# Copyright (c) 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014
# by Chris Schlaeger <cs@taskjuggler.org>
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of version 2 of the GNU General Public License as
# published by the Free Software Foundation.
#
require 'taskjuggler/TjTime'
class TaskJuggler
# This class describes a one-time or per time charge that can be associated
# with a Task. The charge can take effect either on starting the task,
# finishing it, or per time interval.
class Charge
# Create a new Charge object. _amount_ is either the one-time charge or the
# per-day-rate. _task_ is the Task that owns this charge. _scenarioIdx_ is
# the index of the scenario this Charge belongs to.
def initialize(amount, mode, task, scenarioIdx)
@amount = amount
unless [ :onStart, :onEnd, :perDiem ].include?(mode)
raise "Unsupported mode #{mode}"
end
@mode = mode
@task = task
@scenarioIdx = scenarioIdx
end
# Compute the total charge for the TimeInterval described by _period_.
def turnover(period)
case @mode
when :onStart
return period.contains?(@task['start', @scenarioIdx]) ? @amount : 0.0
when :onEnd
return period.contains?(@task['end', @scenarioIdx]) ? @amount : 0.0
else
iv = period.intersection(TimeInterval.new(@task['start', @scenarioIdx],
@task['end', @scenarioIdx]))
if iv
return (iv.duration / (60 * 60 * 24)) * @amount
else
return 0.0
end
end
end
# Dump object in human readable form.
def to_s
case @mode
when :onStart
mode = 'on start'
when :onEnd
mode = 'on end'
when :perDiem
mode = 'per day'
else
mode = 'unknown'
end
"#{@amount} #{mode}"
end
end
end