doc/TaskJuggler/TaskScenario.html in taskjuggler-0.1.1 vs doc/TaskJuggler/TaskScenario.html in taskjuggler-0.2.0
- old
+ new
@@ -145,12 +145,10 @@
<li><a href="#method-i-markAsRunaway">#markAsRunaway</a></li>
<li><a href="#method-i-markMilestone">#markMilestone</a></li>
- <li><a href="#method-i-nextSlot">#nextSlot</a></li>
-
<li><a href="#method-i-postScheduleCheck">#postScheduleCheck</a></li>
<li><a href="#method-i-preScheduleCheck">#preScheduleCheck</a></li>
<li><a href="#method-i-prepareScheduling">#prepareScheduling</a></li>
@@ -337,16 +335,28 @@
<li><a href="../TaskJuggler/HTMLElements.html">TaskJuggler::HTMLElements</a></li>
<li><a href="../TaskJuggler/HTMLGraphics.html">TaskJuggler::HTMLGraphics</a></li>
+ <li><a href="../TaskJuggler/ICalReport.html">TaskJuggler::ICalReport</a></li>
+
+ <li><a href="../TaskJuggler/ICalendar.html">TaskJuggler::ICalendar</a></li>
+
+ <li><a href="../TaskJuggler/ICalendar/Component.html">TaskJuggler::ICalendar::Component</a></li>
+
+ <li><a href="../TaskJuggler/ICalendar/Event.html">TaskJuggler::ICalendar::Event</a></li>
+
+ <li><a href="../TaskJuggler/ICalendar/Journal.html">TaskJuggler::ICalendar::Journal</a></li>
+
+ <li><a href="../TaskJuggler/ICalendar/Person.html">TaskJuggler::ICalendar::Person</a></li>
+
+ <li><a href="../TaskJuggler/ICalendar/Todo.html">TaskJuggler::ICalendar::Todo</a></li>
+
<li><a href="../TaskJuggler/Interval.html">TaskJuggler::Interval</a></li>
<li><a href="../TaskJuggler/IntervalList.html">TaskJuggler::IntervalList</a></li>
- <li><a href="../TaskJuggler/IntervalListAttribute.html">TaskJuggler::IntervalListAttribute</a></li>
-
<li><a href="../TaskJuggler/JobInfo.html">TaskJuggler::JobInfo</a></li>
<li><a href="../TaskJuggler/Journal.html">TaskJuggler::Journal</a></li>
<li><a href="../TaskJuggler/JournalEntry.html">TaskJuggler::JournalEntry</a></li>
@@ -457,10 +467,12 @@
<li><a href="../TaskJuggler/ReportBase.html">TaskJuggler::ReportBase</a></li>
<li><a href="../TaskJuggler/ReportContext.html">TaskJuggler::ReportContext</a></li>
+ <li><a href="../TaskJuggler/ReportScenario.html">TaskJuggler::ReportScenario</a></li>
+
<li><a href="../TaskJuggler/ReportServer.html">TaskJuggler::ReportServer</a></li>
<li><a href="../TaskJuggler/ReportServerIface.html">TaskJuggler::ReportServerIface</a></li>
<li><a href="../TaskJuggler/ReportServerRecord.html">TaskJuggler::ReportServerRecord</a></li>
@@ -515,10 +527,12 @@
<li><a href="../TaskJuggler/ScenarioListAttribute.html">TaskJuggler::ScenarioListAttribute</a></li>
<li><a href="../TaskJuggler/Scoreboard.html">TaskJuggler::Scoreboard</a></li>
+ <li><a href="../TaskJuggler/ScoreboardInterval.html">TaskJuggler::ScoreboardInterval</a></li>
+
<li><a href="../TaskJuggler/SheetHandlerBase.html">TaskJuggler::SheetHandlerBase</a></li>
<li><a href="../TaskJuggler/SheetReceiver.html">TaskJuggler::SheetReceiver</a></li>
<li><a href="../TaskJuggler/SheetSender.html">TaskJuggler::SheetSender</a></li>
@@ -561,10 +575,14 @@
<li><a href="../TaskJuggler/TableOfContents.html">TaskJuggler::TableOfContents</a></li>
<li><a href="../TaskJuggler/TableReport.html">TaskJuggler::TableReport</a></li>
+ <li><a href="../TaskJuggler/TagFile.html">TaskJuggler::TagFile</a></li>
+
+ <li><a href="../TaskJuggler/TagFile/TagFileEntry.html">TaskJuggler::TagFile::TagFileEntry</a></li>
+
<li><a href="../TaskJuggler/Task.html">TaskJuggler::Task</a></li>
<li><a href="../TaskJuggler/TaskDepListAttribute.html">TaskJuggler::TaskDepListAttribute</a></li>
<li><a href="../TaskJuggler/TaskDependency.html">TaskJuggler::TaskDependency</a></li>
@@ -611,10 +629,14 @@
<li><a href="../TaskJuggler/TextParser/TokenDoc.html">TaskJuggler::TextParser::TokenDoc</a></li>
<li><a href="../TaskJuggler/TextReport.html">TaskJuggler::TextReport</a></li>
+ <li><a href="../TaskJuggler/TimeInterval.html">TaskJuggler::TimeInterval</a></li>
+
+ <li><a href="../TaskJuggler/TimeIntervalListAttribute.html">TaskJuggler::TimeIntervalListAttribute</a></li>
+
<li><a href="../TaskJuggler/TimeSheet.html">TaskJuggler::TimeSheet</a></li>
<li><a href="../TaskJuggler/TimeSheetReceiver.html">TaskJuggler::TimeSheetReceiver</a></li>
<li><a href="../TaskJuggler/TimeSheetRecord.html">TaskJuggler::TimeSheetRecord</a></li>
@@ -774,15 +796,24 @@
id="new-source">
<pre>
<span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 24</span>
24: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">task</span>, <span class="ruby-identifier">scenarioIdx</span>, <span class="ruby-identifier">attributes</span>)
25: <span class="ruby-keyword kw">super</span>
-26:
-27: <span class="ruby-comment cmt"># A list of all allocated leaf resources.</span>
-28: <span class="ruby-ivar">@candidates</span> = []
-29: <span class="ruby-ivar">@dCache</span> = <span class="ruby-constant">DataCache</span>.<span class="ruby-identifier">instance</span>
-30: <span class="ruby-keyword kw">end</span></pre>
+26: <span class="ruby-comment cmt"># Attributed are only really created when they are accessed the first</span>
+27: <span class="ruby-comment cmt"># time. So make sure some needed attributes really exist so we don't</span>
+28: <span class="ruby-comment cmt"># have to check for existance each time we access them.</span>
+29: <span class="ruby-node">%( allocate assignedresources booking charge chargeset complete
+30: criticalness depends duration effort end forward length
+31: maxend maxstart minend minstart milestone pathcriticalness
+32: precedes scheduled shifts start status )</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">attr</span><span class="ruby-operator">|</span>
+33: <span class="ruby-ivar">@property</span>[<span class="ruby-identifier">attr</span>, <span class="ruby-ivar">@scenarioIdx</span>]
+34: <span class="ruby-keyword kw">end</span>
+35:
+36: <span class="ruby-comment cmt"># A list of all allocated leaf resources.</span>
+37: <span class="ruby-ivar">@candidates</span> = []
+38: <span class="ruby-ivar">@dCache</span> = <span class="ruby-constant">DataCache</span>.<span class="ruby-identifier">instance</span>
+39: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -825,26 +856,26 @@
<div class="method-source-code"
id="-ref-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 102</span>
-102: <span class="ruby-keyword kw">def</span> <span class="ruby-constant">Xref</span>
-103: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'depends'</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">dependency</span><span class="ruby-operator">|</span>
-104: <span class="ruby-identifier">depTask</span> = <span class="ruby-identifier">checkDependency</span>(<span class="ruby-identifier">dependency</span>, <span class="ruby-value str">'depends'</span>)
-105: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'startpreds'</span>).<span class="ruby-identifier">push</span>([ <span class="ruby-identifier">depTask</span>, <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">onEnd</span> ])
-106: <span class="ruby-identifier">depTask</span>[<span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">onEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'endsuccs'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'startsuccs'</span>, <span class="ruby-ivar">@scenarioIdx</span>].
-107: <span class="ruby-identifier">push</span>([ <span class="ruby-ivar">@property</span>, <span class="ruby-keyword kw">false</span> ])
-108: <span class="ruby-keyword kw">end</span>
-109:
-110: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'precedes'</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">dependency</span><span class="ruby-operator">|</span>
-111: <span class="ruby-identifier">predTask</span> = <span class="ruby-identifier">checkDependency</span>(<span class="ruby-identifier">dependency</span>, <span class="ruby-value str">'precedes'</span>)
-112: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'endsuccs'</span>).<span class="ruby-identifier">push</span>([ <span class="ruby-identifier">predTask</span>, <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">onEnd</span> ])
-113: <span class="ruby-identifier">predTask</span>[<span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">onEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'endpreds'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'startpreds'</span>, <span class="ruby-ivar">@scenarioIdx</span>].
-114: <span class="ruby-identifier">push</span>([<span class="ruby-ivar">@property</span>, <span class="ruby-keyword kw">true</span> ])
-115: <span class="ruby-keyword kw">end</span>
-116: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 131</span>
+131: <span class="ruby-keyword kw">def</span> <span class="ruby-constant">Xref</span>
+132: <span class="ruby-ivar">@depends</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">dependency</span><span class="ruby-operator">|</span>
+133: <span class="ruby-identifier">depTask</span> = <span class="ruby-identifier">checkDependency</span>(<span class="ruby-identifier">dependency</span>, <span class="ruby-value str">'depends'</span>)
+134: <span class="ruby-ivar">@startpreds</span>.<span class="ruby-identifier">push</span>([ <span class="ruby-identifier">depTask</span>, <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">onEnd</span> ])
+135: <span class="ruby-identifier">depTask</span>[<span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">onEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'endsuccs'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'startsuccs'</span>, <span class="ruby-ivar">@scenarioIdx</span>].
+136: <span class="ruby-identifier">push</span>([ <span class="ruby-ivar">@property</span>, <span class="ruby-keyword kw">false</span> ])
+137: <span class="ruby-keyword kw">end</span>
+138:
+139: <span class="ruby-ivar">@precedes</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">dependency</span><span class="ruby-operator">|</span>
+140: <span class="ruby-identifier">predTask</span> = <span class="ruby-identifier">checkDependency</span>(<span class="ruby-identifier">dependency</span>, <span class="ruby-value str">'precedes'</span>)
+141: <span class="ruby-ivar">@endsuccs</span>.<span class="ruby-identifier">push</span>([ <span class="ruby-identifier">predTask</span>, <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">onEnd</span> ])
+142: <span class="ruby-identifier">predTask</span>[<span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">onEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'endpreds'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'startpreds'</span>, <span class="ruby-ivar">@scenarioIdx</span>].
+143: <span class="ruby-identifier">push</span>([<span class="ruby-ivar">@property</span>, <span class="ruby-keyword kw">true</span> ])
+144: <span class="ruby-keyword kw">end</span>
+145: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -871,16 +902,16 @@
<div class="method-source-code"
id="add-ooking-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1170</span>
-1170: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">addBooking</span>(<span class="ruby-identifier">booking</span>)
-1171: <span class="ruby-comment cmt"># This append operation will not trigger a copy to sub-scenarios.</span>
-1172: <span class="ruby-comment cmt"># Bookings are only valid for the scenario they are defined in.</span>
-1173: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'booking'</span>, <span class="ruby-ivar">@scenarioIdx</span>] <span class="ruby-operator"><<</span> <span class="ruby-identifier">booking</span>
-1174: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1220</span>
+1220: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">addBooking</span>(<span class="ruby-identifier">booking</span>)
+1221: <span class="ruby-comment cmt"># This append operation will not trigger a copy to sub-scenarios.</span>
+1222: <span class="ruby-comment cmt"># Bookings are only valid for the scenario they are defined in.</span>
+1223: <span class="ruby-ivar">@booking</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">booking</span>
+1224: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -913,38 +944,38 @@
<div class="method-source-code"
id="calc-riticalness-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 746</span>
-746: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">calcCriticalness</span>
-747: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'criticalness'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = <span class="ruby-value">0.0</span>
-748: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'pathcriticalness'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = <span class="ruby-keyword kw">nil</span>
-749:
-750: <span class="ruby-comment cmt"># Users feel that milestones are somewhat important. So we use an</span>
-751: <span class="ruby-comment cmt"># arbitrary value larger than 0 for them. We make it priority dependent,</span>
-752: <span class="ruby-comment cmt"># so the user has some control over it. Priority 0 is 0, 500 is 1.0 and</span>
-753: <span class="ruby-comment cmt"># 1000 is 2.0. These values are pretty much randomly picked and probably</span>
-754: <span class="ruby-comment cmt"># require some more tuning based on real projects.</span>
-755: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'milestone'</span>)
-756: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'criticalness'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = <span class="ruby-identifier">a</span>(<span class="ruby-value str">'priority'</span>) <span class="ruby-operator">/</span> <span class="ruby-value">500.0</span>
-757: <span class="ruby-keyword kw">end</span>
-758:
-759: <span class="ruby-comment cmt"># Task without efforts of allocations are not critical.</span>
-760: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'effort'</span>) <span class="ruby-operator"><=</span> <span class="ruby-value">0</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@candidates</span>.<span class="ruby-identifier">empty?</span>
-761:
-762: <span class="ruby-comment cmt"># Determine the average criticalness of all allocated resources.</span>
-763: <span class="ruby-identifier">criticalness</span> = <span class="ruby-value">0.0</span>
-764: <span class="ruby-ivar">@candidates</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resource</span><span class="ruby-operator">|</span>
-765: <span class="ruby-identifier">criticalness</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">resource</span>[<span class="ruby-value str">'criticalness'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
-766: <span class="ruby-keyword kw">end</span>
-767: <span class="ruby-identifier">criticalness</span> <span class="ruby-operator">/=</span> <span class="ruby-ivar">@candidates</span>.<span class="ruby-identifier">length</span>
-768:
-769: <span class="ruby-comment cmt"># The task criticalness is the product of effort and average resource</span>
-770: <span class="ruby-comment cmt"># criticalness.</span>
-771: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'criticalness'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = <span class="ruby-identifier">a</span>(<span class="ruby-value str">'effort'</span>) * <span class="ruby-identifier">criticalness</span>
-772: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 788</span>
+788: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">calcCriticalness</span>
+789: <span class="ruby-ivar">@criticalness</span> = <span class="ruby-value">0.0</span>
+790: <span class="ruby-ivar">@pathcriticalness</span> = <span class="ruby-keyword kw">nil</span>
+791:
+792: <span class="ruby-comment cmt"># Users feel that milestones are somewhat important. So we use an</span>
+793: <span class="ruby-comment cmt"># arbitrary value larger than 0 for them. We make it priority dependent,</span>
+794: <span class="ruby-comment cmt"># so the user has some control over it. Priority 0 is 0, 500 is 1.0 and</span>
+795: <span class="ruby-comment cmt"># 1000 is 2.0. These values are pretty much randomly picked and probably</span>
+796: <span class="ruby-comment cmt"># require some more tuning based on real projects.</span>
+797: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@milestone</span>
+798: <span class="ruby-ivar">@criticalness</span> = <span class="ruby-ivar">@priority</span> <span class="ruby-operator">/</span> <span class="ruby-value">500.0</span>
+799: <span class="ruby-keyword kw">end</span>
+800:
+801: <span class="ruby-comment cmt"># Task without efforts of allocations are not critical.</span>
+802: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@effort</span> <span class="ruby-operator"><=</span> <span class="ruby-value">0</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@candidates</span>.<span class="ruby-identifier">empty?</span>
+803:
+804: <span class="ruby-comment cmt"># Determine the average criticalness of all allocated resources.</span>
+805: <span class="ruby-identifier">criticalness</span> = <span class="ruby-value">0.0</span>
+806: <span class="ruby-ivar">@candidates</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resource</span><span class="ruby-operator">|</span>
+807: <span class="ruby-identifier">criticalness</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">resource</span>[<span class="ruby-value str">'criticalness'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
+808: <span class="ruby-keyword kw">end</span>
+809: <span class="ruby-identifier">criticalness</span> <span class="ruby-operator">/=</span> <span class="ruby-ivar">@candidates</span>.<span class="ruby-identifier">length</span>
+810:
+811: <span class="ruby-comment cmt"># The task criticalness is the product of effort and average resource</span>
+812: <span class="ruby-comment cmt"># criticalness.</span>
+813: <span class="ruby-ivar">@criticalness</span> = <span class="ruby-ivar">@effort</span> * <span class="ruby-identifier">criticalness</span>
+814: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -978,59 +1009,59 @@
<div class="method-source-code"
id="calc-ath-riticalness-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 780</span>
-780: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">calcPathCriticalness</span>(<span class="ruby-identifier">atEnd</span> = <span class="ruby-keyword kw">false</span>)
-781: <span class="ruby-comment cmt"># If we have computed this already, just return the value. If we are only</span>
-782: <span class="ruby-comment cmt"># at the end of the task, we do not include the criticalness of this task</span>
-783: <span class="ruby-comment cmt"># as it is not really part of the path.</span>
-784: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'pathcriticalness'</span>)
-785: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'pathcriticalness'</span>) <span class="ruby-operator">-</span> (<span class="ruby-identifier">atEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value">0</span> <span class="ruby-operator">:</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'criticalness'</span>))
-786: <span class="ruby-keyword kw">end</span>
-787:
-788: <span class="ruby-identifier">maxCriticalness</span> = <span class="ruby-value">0.0</span>
-789:
-790: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">atEnd</span>
-791: <span class="ruby-comment cmt"># At the end, we only care about pathes through the successors of this</span>
-792: <span class="ruby-comment cmt"># task or its parent tasks.</span>
-793: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">criticalness</span> = <span class="ruby-identifier">calcPathCriticalnessEndSuccs</span>) <span class="ruby-operator">></span> <span class="ruby-identifier">maxCriticalness</span>
-794: <span class="ruby-identifier">maxCriticalness</span> = <span class="ruby-identifier">criticalness</span>
-795: <span class="ruby-keyword kw">end</span>
-796: <span class="ruby-keyword kw">else</span>
-797: <span class="ruby-comment cmt"># At the start of the task, we have two options.</span>
-798: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">container?</span>
-799: <span class="ruby-comment cmt"># For container tasks, we ignore all dependencies and check the pathes</span>
-800: <span class="ruby-comment cmt"># through all the children.</span>
-801: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">children</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span><span class="ruby-operator">|</span>
-802: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">criticalness</span> = <span class="ruby-identifier">task</span>.<span class="ruby-identifier">calcPathCriticalness</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-keyword kw">false</span>)) <span class="ruby-operator">></span>
-803: <span class="ruby-identifier">maxCriticalness</span>
-804: <span class="ruby-identifier">maxCriticalness</span> = <span class="ruby-identifier">criticalness</span>
-805: <span class="ruby-keyword kw">end</span>
-806: <span class="ruby-keyword kw">end</span>
-807: <span class="ruby-keyword kw">else</span>
-808: <span class="ruby-comment cmt"># For leaf tasks, we check all pathes through the start successors and</span>
-809: <span class="ruby-comment cmt"># then the pathes through the end successors of this task and all its</span>
-810: <span class="ruby-comment cmt"># parent tasks.</span>
-811: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'startsuccs'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
-812: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">criticalness</span> = <span class="ruby-identifier">task</span>.<span class="ruby-identifier">calcPathCriticalness</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">onEnd</span>)) <span class="ruby-operator">></span>
-813: <span class="ruby-identifier">maxCriticalness</span>
-814: <span class="ruby-identifier">maxCriticalness</span> = <span class="ruby-identifier">criticalness</span>
-815: <span class="ruby-keyword kw">end</span>
-816: <span class="ruby-keyword kw">end</span>
-817:
-818: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">criticalness</span> = <span class="ruby-identifier">calcPathCriticalnessEndSuccs</span>) <span class="ruby-operator">></span> <span class="ruby-identifier">maxCriticalness</span>
-819: <span class="ruby-identifier">maxCriticalness</span> = <span class="ruby-identifier">criticalness</span>
-820: <span class="ruby-keyword kw">end</span>
-821:
-822: <span class="ruby-identifier">maxCriticalness</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'criticalness'</span>)
-823: <span class="ruby-keyword kw">end</span>
-824: <span class="ruby-keyword kw">end</span>
-825:
-826: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'pathcriticalness'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = <span class="ruby-identifier">maxCriticalness</span>
-827: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 822</span>
+822: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">calcPathCriticalness</span>(<span class="ruby-identifier">atEnd</span> = <span class="ruby-keyword kw">false</span>)
+823: <span class="ruby-comment cmt"># If we have computed this already, just return the value. If we are only</span>
+824: <span class="ruby-comment cmt"># at the end of the task, we do not include the criticalness of this task</span>
+825: <span class="ruby-comment cmt"># as it is not really part of the path.</span>
+826: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@pathcriticalness</span>
+827: <span class="ruby-keyword kw">return</span> <span class="ruby-ivar">@pathcriticalness</span> <span class="ruby-operator">-</span> (<span class="ruby-identifier">atEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value">0</span> <span class="ruby-operator">:</span> <span class="ruby-ivar">@criticalness</span>)
+828: <span class="ruby-keyword kw">end</span>
+829:
+830: <span class="ruby-identifier">maxCriticalness</span> = <span class="ruby-value">0.0</span>
+831:
+832: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">atEnd</span>
+833: <span class="ruby-comment cmt"># At the end, we only care about pathes through the successors of this</span>
+834: <span class="ruby-comment cmt"># task or its parent tasks.</span>
+835: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">criticalness</span> = <span class="ruby-identifier">calcPathCriticalnessEndSuccs</span>) <span class="ruby-operator">></span> <span class="ruby-identifier">maxCriticalness</span>
+836: <span class="ruby-identifier">maxCriticalness</span> = <span class="ruby-identifier">criticalness</span>
+837: <span class="ruby-keyword kw">end</span>
+838: <span class="ruby-keyword kw">else</span>
+839: <span class="ruby-comment cmt"># At the start of the task, we have two options.</span>
+840: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">container?</span>
+841: <span class="ruby-comment cmt"># For container tasks, we ignore all dependencies and check the pathes</span>
+842: <span class="ruby-comment cmt"># through all the children.</span>
+843: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">children</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span><span class="ruby-operator">|</span>
+844: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">criticalness</span> = <span class="ruby-identifier">task</span>.<span class="ruby-identifier">calcPathCriticalness</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-keyword kw">false</span>)) <span class="ruby-operator">></span>
+845: <span class="ruby-identifier">maxCriticalness</span>
+846: <span class="ruby-identifier">maxCriticalness</span> = <span class="ruby-identifier">criticalness</span>
+847: <span class="ruby-keyword kw">end</span>
+848: <span class="ruby-keyword kw">end</span>
+849: <span class="ruby-keyword kw">else</span>
+850: <span class="ruby-comment cmt"># For leaf tasks, we check all pathes through the start successors and</span>
+851: <span class="ruby-comment cmt"># then the pathes through the end successors of this task and all its</span>
+852: <span class="ruby-comment cmt"># parent tasks.</span>
+853: <span class="ruby-ivar">@startsuccs</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
+854: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">criticalness</span> = <span class="ruby-identifier">task</span>.<span class="ruby-identifier">calcPathCriticalness</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">onEnd</span>)) <span class="ruby-operator">></span>
+855: <span class="ruby-identifier">maxCriticalness</span>
+856: <span class="ruby-identifier">maxCriticalness</span> = <span class="ruby-identifier">criticalness</span>
+857: <span class="ruby-keyword kw">end</span>
+858: <span class="ruby-keyword kw">end</span>
+859:
+860: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">criticalness</span> = <span class="ruby-identifier">calcPathCriticalnessEndSuccs</span>) <span class="ruby-operator">></span> <span class="ruby-identifier">maxCriticalness</span>
+861: <span class="ruby-identifier">maxCriticalness</span> = <span class="ruby-identifier">criticalness</span>
+862: <span class="ruby-keyword kw">end</span>
+863:
+864: <span class="ruby-identifier">maxCriticalness</span> <span class="ruby-operator">+=</span> <span class="ruby-ivar">@criticalness</span>
+865: <span class="ruby-keyword kw">end</span>
+866: <span class="ruby-keyword kw">end</span>
+867:
+868: <span class="ruby-ivar">@pathcriticalness</span> = <span class="ruby-identifier">maxCriticalness</span>
+869: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -1061,53 +1092,53 @@
<div class="method-source-code"
id="can-nherit-ate--source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 962</span>
- 962: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">canInheritDate?</span>(<span class="ruby-identifier">atEnd</span>)
- 963: <span class="ruby-comment cmt"># Inheriting a start or end date from the enclosing task or the project</span>
- 964: <span class="ruby-comment cmt"># is allowed for the following scenarios:</span>
- 965: <span class="ruby-comment cmt"># - --> - inhS*1 - <-- - inhE*1</span>
- 966: <span class="ruby-comment cmt"># - --> | inhS | <-- - inhE</span>
- 967: <span class="ruby-comment cmt"># - x-> - inhS - <-x - inhE</span>
- 968: <span class="ruby-comment cmt"># - x-> | inhS | <-x - inhE</span>
- 969: <span class="ruby-comment cmt"># - x-> -D inhS -D <-x - inhE</span>
- 970: <span class="ruby-comment cmt"># - x-> |D inhS |D <-x - inhE</span>
- 971: <span class="ruby-comment cmt"># - --> -D inhS -D <-- - inhE</span>
- 972: <span class="ruby-comment cmt"># - --> |D inhS |D <-- - inhE</span>
- 973: <span class="ruby-comment cmt"># - <-- | inhS | --> - inhE</span>
- 974: <span class="ruby-comment cmt">#</span>
- 975: <span class="ruby-comment cmt"># *1 when no bookings but allocations are present</span>
- 976:
- 977: <span class="ruby-identifier">thisEnd</span>, <span class="ruby-identifier">thatEnd</span> = <span class="ruby-identifier">atEnd</span> <span class="ruby-operator">?</span> [ <span class="ruby-value str">'end'</span>, <span class="ruby-value str">'start'</span> ] <span class="ruby-operator">:</span> [ <span class="ruby-value str">'start'</span>, <span class="ruby-value str">'end'</span> ]
- 978: <span class="ruby-comment cmt"># Return false if we already have a date for this end or if we have a</span>
- 979: <span class="ruby-comment cmt"># strong dependency for this end.</span>
- 980: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-identifier">thisEnd</span>) <span class="ruby-operator">||</span> <span class="ruby-identifier">hasStrongDeps</span>(<span class="ruby-identifier">atEnd</span>)
- 981:
- 982: <span class="ruby-comment cmt"># Containter task can inherit the date if they have no dependencies at</span>
- 983: <span class="ruby-comment cmt"># this end.</span>
- 984: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">container?</span>
- 985:
- 986: <span class="ruby-identifier">hasThatSpec</span> = <span class="ruby-identifier">a</span>(<span class="ruby-identifier">thatEnd</span>) <span class="ruby-operator">||</span> <span class="ruby-identifier">hasStrongDeps</span>(<span class="ruby-operator">!</span><span class="ruby-identifier">atEnd</span>)
- 987: <span class="ruby-identifier">hasDurationSpec</span> = <span class="ruby-identifier">hasDurationSpec?</span>
- 988:
- 989: <span class="ruby-comment cmt"># Check for tasks that have no start and end spec, no duration spec but</span>
- 990: <span class="ruby-comment cmt"># allocates. They can inherit the start and end date.</span>
- 991: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">hasThatSpec</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">hasDurationSpec</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'allocate'</span>).<span class="ruby-identifier">empty?</span>
- 992:
- 993: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'forward'</span>) <span class="ruby-operator">^</span> <span class="ruby-identifier">atEnd</span>
- 994: <span class="ruby-comment cmt"># the scheduling direction is pointing away from this end</span>
- 995: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">hasDurationSpec</span> <span class="ruby-operator">||</span> <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'booking'</span>).<span class="ruby-identifier">empty?</span>
- 996:
- 997: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">hasThatSpec</span>
- 998: <span class="ruby-keyword kw">else</span>
- 999: <span class="ruby-comment cmt"># the scheduling direction is pointing towards this end</span>
-1000: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">a</span>(<span class="ruby-identifier">thatEnd</span>) <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">hasDurationSpec</span> <span class="ruby-operator">&&</span>
-1001: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'booking'</span>).<span class="ruby-identifier">empty?</span> <span class="ruby-comment cmt">#&& a('allocate').empty?</span>
-1002: <span class="ruby-keyword kw">end</span>
-1003: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1012</span>
+1012: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">canInheritDate?</span>(<span class="ruby-identifier">atEnd</span>)
+1013: <span class="ruby-comment cmt"># Inheriting a start or end date from the enclosing task or the project</span>
+1014: <span class="ruby-comment cmt"># is allowed for the following scenarios:</span>
+1015: <span class="ruby-comment cmt"># - --> - inhS*1 - <-- - inhE*1</span>
+1016: <span class="ruby-comment cmt"># - --> | inhS | <-- - inhE</span>
+1017: <span class="ruby-comment cmt"># - x-> - inhS - <-x - inhE</span>
+1018: <span class="ruby-comment cmt"># - x-> | inhS | <-x - inhE</span>
+1019: <span class="ruby-comment cmt"># - x-> -D inhS -D <-x - inhE</span>
+1020: <span class="ruby-comment cmt"># - x-> |D inhS |D <-x - inhE</span>
+1021: <span class="ruby-comment cmt"># - --> -D inhS -D <-- - inhE</span>
+1022: <span class="ruby-comment cmt"># - --> |D inhS |D <-- - inhE</span>
+1023: <span class="ruby-comment cmt"># - <-- | inhS | --> - inhE</span>
+1024: <span class="ruby-comment cmt">#</span>
+1025: <span class="ruby-comment cmt"># *1 when no bookings but allocations are present</span>
+1026:
+1027: <span class="ruby-identifier">thisEnd</span>, <span class="ruby-identifier">thatEnd</span> = <span class="ruby-identifier">atEnd</span> <span class="ruby-operator">?</span> [ <span class="ruby-value str">'end'</span>, <span class="ruby-value str">'start'</span> ] <span class="ruby-operator">:</span> [ <span class="ruby-value str">'start'</span>, <span class="ruby-value str">'end'</span> ]
+1028: <span class="ruby-comment cmt"># Return false if we already have a date for this end or if we have a</span>
+1029: <span class="ruby-comment cmt"># strong dependency for this end.</span>
+1030: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-identifier">thisEnd</span>) <span class="ruby-operator">||</span> <span class="ruby-identifier">hasStrongDeps</span>(<span class="ruby-identifier">atEnd</span>)
+1031:
+1032: <span class="ruby-comment cmt"># Containter task can inherit the date if they have no dependencies at</span>
+1033: <span class="ruby-comment cmt"># this end.</span>
+1034: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">container?</span>
+1035:
+1036: <span class="ruby-identifier">hasThatSpec</span> = <span class="ruby-identifier">a</span>(<span class="ruby-identifier">thatEnd</span>) <span class="ruby-operator">||</span> <span class="ruby-identifier">hasStrongDeps</span>(<span class="ruby-operator">!</span><span class="ruby-identifier">atEnd</span>)
+1037: <span class="ruby-identifier">hasDurationSpec</span> = <span class="ruby-identifier">hasDurationSpec?</span>
+1038:
+1039: <span class="ruby-comment cmt"># Check for tasks that have no start and end spec, no duration spec but</span>
+1040: <span class="ruby-comment cmt"># allocates. They can inherit the start and end date.</span>
+1041: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">hasThatSpec</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">hasDurationSpec</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@allocate</span>.<span class="ruby-identifier">empty?</span>
+1042:
+1043: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@forward</span> <span class="ruby-operator">^</span> <span class="ruby-identifier">atEnd</span>
+1044: <span class="ruby-comment cmt"># the scheduling direction is pointing away from this end</span>
+1045: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">hasDurationSpec</span> <span class="ruby-operator">||</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@booking</span>.<span class="ruby-identifier">empty?</span>
+1046:
+1047: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">hasThatSpec</span>
+1048: <span class="ruby-keyword kw">else</span>
+1049: <span class="ruby-comment cmt"># the scheduling direction is pointing towards this end</span>
+1050: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">a</span>(<span class="ruby-identifier">thatEnd</span>) <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">hasDurationSpec</span> <span class="ruby-operator">&&</span>
+1051: <span class="ruby-ivar">@booking</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-comment cmt">#&& @allocate.empty?</span>
+1052: <span class="ruby-keyword kw">end</span>
+1053: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -1137,22 +1168,22 @@
<div class="method-source-code"
id="candidates-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 716</span>
-716: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">candidates</span>
-717: <span class="ruby-ivar">@candidates</span> = []
-718: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'allocate'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">allocation</span><span class="ruby-operator">|</span>
-719: <span class="ruby-identifier">allocation</span>.<span class="ruby-identifier">candidates</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">candidate</span><span class="ruby-operator">|</span>
-720: <span class="ruby-identifier">candidate</span>.<span class="ruby-identifier">allLeaves</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resource</span><span class="ruby-operator">|</span>
-721: <span class="ruby-ivar">@candidates</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">resource</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@candidates</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">resource</span>)
-722: <span class="ruby-keyword kw">end</span>
-723: <span class="ruby-keyword kw">end</span>
-724: <span class="ruby-keyword kw">end</span>
-725: <span class="ruby-ivar">@candidates</span>
-726: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 758</span>
+758: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">candidates</span>
+759: <span class="ruby-ivar">@candidates</span> = []
+760: <span class="ruby-ivar">@allocate</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">allocation</span><span class="ruby-operator">|</span>
+761: <span class="ruby-identifier">allocation</span>.<span class="ruby-identifier">candidates</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">candidate</span><span class="ruby-operator">|</span>
+762: <span class="ruby-identifier">candidate</span>.<span class="ruby-identifier">allLeaves</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resource</span><span class="ruby-operator">|</span>
+763: <span class="ruby-ivar">@candidates</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">resource</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@candidates</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">resource</span>)
+764: <span class="ruby-keyword kw">end</span>
+765: <span class="ruby-keyword kw">end</span>
+766: <span class="ruby-keyword kw">end</span>
+767: <span class="ruby-ivar">@candidates</span>
+768: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -1190,175 +1221,175 @@
<div class="method-source-code"
id="check-or-oops-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 549</span>
-549: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">checkForLoops</span>(<span class="ruby-identifier">path</span>, <span class="ruby-identifier">atEnd</span>, <span class="ruby-identifier">fromOutside</span>, <span class="ruby-identifier">forward</span>)
-550: <span class="ruby-comment cmt"># Check if we have been here before on this path.</span>
-551: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">path</span>.<span class="ruby-identifier">include?</span>([ <span class="ruby-ivar">@property</span>, <span class="ruby-identifier">atEnd</span> ])
-552: <span class="ruby-identifier">warning</span>(<span class="ruby-value str">'loop_detected'</span>,
-553: <span class="ruby-node">"Dependency loop detected at #{atEnd ? 'end' : 'start'} "</span> <span class="ruby-operator">+</span>
-554: <span class="ruby-node">"of task #{@property.fullId}"</span>, <span class="ruby-keyword kw">false</span>)
-555: <span class="ruby-identifier">skip</span> = <span class="ruby-keyword kw">true</span>
-556: <span class="ruby-identifier">path</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">t</span>, <span class="ruby-identifier">e</span><span class="ruby-operator">|</span>
-557: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">t</span> <span class="ruby-operator">==</span> <span class="ruby-ivar">@property</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">e</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">atEnd</span>
-558: <span class="ruby-identifier">skip</span> = <span class="ruby-keyword kw">false</span>
-559: <span class="ruby-keyword kw">next</span>
-560: <span class="ruby-keyword kw">end</span>
-561: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">skip</span>
-562: <span class="ruby-identifier">info</span>(<span class="ruby-node">"loop_at_#{e ? 'end' : 'start'}"</span>,
-563: <span class="ruby-node">"Loop ctnd. at #{e ? 'end' : 'start'} of task #{t.fullId}"</span>,
-564: <span class="ruby-identifier">t</span>.<span class="ruby-identifier">sourceFileInfo</span>)
-565: <span class="ruby-keyword kw">end</span>
-566: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'loop_end'</span>, <span class="ruby-value str">"Aborting"</span>)
-567: <span class="ruby-keyword kw">end</span>
-568: <span class="ruby-comment cmt"># Used for debugging only</span>
-569: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">false</span>
-570: <span class="ruby-identifier">pathText</span> = <span class="ruby-value str">''</span>
-571: <span class="ruby-identifier">path</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">t</span>, <span class="ruby-identifier">e</span><span class="ruby-operator">|</span>
-572: <span class="ruby-identifier">pathText</span> <span class="ruby-operator">+=</span> <span class="ruby-node">"#{t.fullId}(#{e ? 'end' : 'start'}) -> "</span>
-573: <span class="ruby-keyword kw">end</span>
-574: <span class="ruby-identifier">pathText</span> <span class="ruby-operator">+=</span> <span class="ruby-node">"#{@property.fullId}(#{atEnd ? 'end' : 'start'})"</span>
-575: <span class="ruby-identifier">puts</span> <span class="ruby-identifier">pathText</span>
-576: <span class="ruby-keyword kw">end</span>
-577: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@deadEndFlags</span>[(<span class="ruby-identifier">atEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value">2</span> <span class="ruby-operator">:</span> <span class="ruby-value">0</span>) <span class="ruby-operator">+</span> (<span class="ruby-identifier">fromOutside</span> <span class="ruby-operator">?</span> <span class="ruby-value">1</span> <span class="ruby-operator">:</span> <span class="ruby-value">0</span>)]
-578: <span class="ruby-identifier">path</span> <span class="ruby-operator"><<</span> [ <span class="ruby-ivar">@property</span>, <span class="ruby-identifier">atEnd</span> ]
-579:
-580: <span class="ruby-comment cmt"># To find loops we have to traverse the graph in a certain order. When we</span>
-581: <span class="ruby-comment cmt"># enter a task we can either come from outside or inside. The following</span>
-582: <span class="ruby-comment cmt"># graph explains these definitions:</span>
-583: <span class="ruby-comment cmt">#</span>
-584: <span class="ruby-comment cmt"># | / \ |</span>
-585: <span class="ruby-comment cmt"># outside v / \ v outside</span>
-586: <span class="ruby-comment cmt"># +------------------------------+</span>
-587: <span class="ruby-comment cmt"># | / Task \ |</span>
-588: <span class="ruby-comment cmt"># -->| o <--- ---> o |<--</span>
-589: <span class="ruby-comment cmt"># |/ Start End \|</span>
-590: <span class="ruby-comment cmt"># /+------------------------------+\</span>
-591: <span class="ruby-comment cmt"># / ^ ^ \</span>
-592: <span class="ruby-comment cmt"># | inside |</span>
-593: <span class="ruby-comment cmt">#</span>
-594: <span class="ruby-comment cmt"># At the top we have the parent task. At the botton the child tasks.</span>
-595: <span class="ruby-comment cmt"># The horizontal arrors are start predecessors or end successors.</span>
-596: <span class="ruby-comment cmt"># As the graph is doubly-linked, we need to becareful to only find real</span>
-597: <span class="ruby-comment cmt"># loops. When coming from outside, we only continue to the inside and vice</span>
-598: <span class="ruby-comment cmt"># versa. Horizontal moves are only made when we are in a leaf task.</span>
-599: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">atEnd</span>
-600: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">fromOutside</span>
-601: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">container?</span>
-602: <span class="ruby-comment cmt">#</span>
-603: <span class="ruby-comment cmt"># |</span>
-604: <span class="ruby-comment cmt"># v</span>
-605: <span class="ruby-comment cmt"># +--------</span>
-606: <span class="ruby-comment cmt"># -->| o--+</span>
-607: <span class="ruby-comment cmt"># +----|---</span>
-608: <span class="ruby-comment cmt"># |</span>
-609: <span class="ruby-comment cmt"># V</span>
-610: <span class="ruby-comment cmt">#</span>
-611: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">children</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">child</span><span class="ruby-operator">|</span>
-612: <span class="ruby-identifier">child</span>.<span class="ruby-identifier">checkForLoops</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">path</span>, <span class="ruby-keyword kw">false</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-identifier">forward</span>)
-613: <span class="ruby-keyword kw">end</span>
-614: <span class="ruby-keyword kw">else</span>
-615: <span class="ruby-comment cmt"># |</span>
-616: <span class="ruby-comment cmt"># v</span>
-617: <span class="ruby-comment cmt"># +--------</span>
-618: <span class="ruby-comment cmt"># -->| o----></span>
-619: <span class="ruby-comment cmt"># +--------</span>
-620: <span class="ruby-comment cmt">#</span>
-621: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">forward</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'forward'</span>)) <span class="ruby-operator">||</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'milestone'</span>)
-622: <span class="ruby-identifier">checkForLoops</span>(<span class="ruby-identifier">path</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-keyword kw">false</span>, <span class="ruby-keyword kw">true</span>)
-623: <span class="ruby-keyword kw">end</span>
-624: <span class="ruby-keyword kw">end</span>
-625: <span class="ruby-keyword kw">else</span>
-626: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'startpreds'</span>).<span class="ruby-identifier">empty?</span>
-627: <span class="ruby-comment cmt">#</span>
-628: <span class="ruby-comment cmt"># ^</span>
-629: <span class="ruby-comment cmt"># |</span>
-630: <span class="ruby-comment cmt"># +-|------</span>
-631: <span class="ruby-comment cmt"># | o <--</span>
-632: <span class="ruby-comment cmt"># +--------</span>
-633: <span class="ruby-comment cmt"># ^</span>
-634: <span class="ruby-comment cmt"># |</span>
-635: <span class="ruby-comment cmt">#</span>
-636: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parent</span>
-637: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parent</span>.<span class="ruby-identifier">checkForLoops</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">path</span>, <span class="ruby-keyword kw">false</span>, <span class="ruby-keyword kw">false</span>,
-638: <span class="ruby-identifier">forward</span>)
-639: <span class="ruby-keyword kw">end</span>
-640: <span class="ruby-keyword kw">else</span>
-641:
-642: <span class="ruby-comment cmt"># +--------</span>
-643: <span class="ruby-comment cmt"># <---- o <--</span>
-644: <span class="ruby-comment cmt"># +--------</span>
-645: <span class="ruby-comment cmt"># ^</span>
-646: <span class="ruby-comment cmt"># |</span>
-647: <span class="ruby-comment cmt">#</span>
-648: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'startpreds'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">targetEnd</span><span class="ruby-operator">|</span>
-649: <span class="ruby-identifier">task</span>.<span class="ruby-identifier">checkForLoops</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">path</span>, <span class="ruby-identifier">targetEnd</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-identifier">forward</span>)
-650: <span class="ruby-keyword kw">end</span>
-651: <span class="ruby-keyword kw">end</span>
-652: <span class="ruby-keyword kw">end</span>
-653: <span class="ruby-keyword kw">else</span>
-654: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">fromOutside</span>
-655: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">container?</span>
-656: <span class="ruby-comment cmt">#</span>
-657: <span class="ruby-comment cmt"># |</span>
-658: <span class="ruby-comment cmt"># v</span>
-659: <span class="ruby-comment cmt"># --------+</span>
-660: <span class="ruby-comment cmt"># +--o |<--</span>
-661: <span class="ruby-comment cmt"># ---|----+</span>
-662: <span class="ruby-comment cmt"># |</span>
-663: <span class="ruby-comment cmt"># v</span>
-664: <span class="ruby-comment cmt">#</span>
-665: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">children</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">child</span><span class="ruby-operator">|</span>
-666: <span class="ruby-identifier">child</span>.<span class="ruby-identifier">checkForLoops</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">path</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-identifier">forward</span>)
-667: <span class="ruby-keyword kw">end</span>
-668: <span class="ruby-keyword kw">else</span>
-669: <span class="ruby-comment cmt"># |</span>
-670: <span class="ruby-comment cmt"># v</span>
-671: <span class="ruby-comment cmt"># --------+</span>
-672: <span class="ruby-comment cmt"># <----o |<--</span>
-673: <span class="ruby-comment cmt"># --------+</span>
-674: <span class="ruby-comment cmt">#</span>
-675: <span class="ruby-keyword kw">if</span> (<span class="ruby-operator">!</span><span class="ruby-identifier">forward</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'forward'</span>)) <span class="ruby-operator">||</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'milestone'</span>)
-676: <span class="ruby-identifier">checkForLoops</span>(<span class="ruby-identifier">path</span>, <span class="ruby-keyword kw">false</span>, <span class="ruby-keyword kw">false</span>, <span class="ruby-keyword kw">false</span>)
-677: <span class="ruby-keyword kw">end</span>
-678: <span class="ruby-keyword kw">end</span>
-679: <span class="ruby-keyword kw">else</span>
-680: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'endsuccs'</span>).<span class="ruby-identifier">empty?</span>
-681: <span class="ruby-comment cmt">#</span>
-682: <span class="ruby-comment cmt"># ^</span>
-683: <span class="ruby-comment cmt"># |</span>
-684: <span class="ruby-comment cmt"># ------|-+</span>
-685: <span class="ruby-comment cmt"># --> o |</span>
-686: <span class="ruby-comment cmt"># --------+</span>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 591</span>
+591: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">checkForLoops</span>(<span class="ruby-identifier">path</span>, <span class="ruby-identifier">atEnd</span>, <span class="ruby-identifier">fromOutside</span>, <span class="ruby-identifier">forward</span>)
+592: <span class="ruby-comment cmt"># Check if we have been here before on this path.</span>
+593: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">path</span>.<span class="ruby-identifier">include?</span>([ <span class="ruby-ivar">@property</span>, <span class="ruby-identifier">atEnd</span> ])
+594: <span class="ruby-identifier">warning</span>(<span class="ruby-value str">'loop_detected'</span>,
+595: <span class="ruby-node">"Dependency loop detected at #{atEnd ? 'end' : 'start'} "</span> <span class="ruby-operator">+</span>
+596: <span class="ruby-node">"of task #{@property.fullId}"</span>, <span class="ruby-keyword kw">false</span>)
+597: <span class="ruby-identifier">skip</span> = <span class="ruby-keyword kw">true</span>
+598: <span class="ruby-identifier">path</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">t</span>, <span class="ruby-identifier">e</span><span class="ruby-operator">|</span>
+599: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">t</span> <span class="ruby-operator">==</span> <span class="ruby-ivar">@property</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">e</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">atEnd</span>
+600: <span class="ruby-identifier">skip</span> = <span class="ruby-keyword kw">false</span>
+601: <span class="ruby-keyword kw">next</span>
+602: <span class="ruby-keyword kw">end</span>
+603: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">skip</span>
+604: <span class="ruby-identifier">info</span>(<span class="ruby-node">"loop_at_#{e ? 'end' : 'start'}"</span>,
+605: <span class="ruby-node">"Loop ctnd. at #{e ? 'end' : 'start'} of task #{t.fullId}"</span>,
+606: <span class="ruby-identifier">t</span>.<span class="ruby-identifier">sourceFileInfo</span>)
+607: <span class="ruby-keyword kw">end</span>
+608: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'loop_end'</span>, <span class="ruby-value str">"Aborting"</span>)
+609: <span class="ruby-keyword kw">end</span>
+610: <span class="ruby-comment cmt"># Used for debugging only</span>
+611: <span class="ruby-keyword kw">if</span> <span class="ruby-keyword kw">false</span>
+612: <span class="ruby-identifier">pathText</span> = <span class="ruby-value str">''</span>
+613: <span class="ruby-identifier">path</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">t</span>, <span class="ruby-identifier">e</span><span class="ruby-operator">|</span>
+614: <span class="ruby-identifier">pathText</span> <span class="ruby-operator">+=</span> <span class="ruby-node">"#{t.fullId}(#{e ? 'end' : 'start'}) -> "</span>
+615: <span class="ruby-keyword kw">end</span>
+616: <span class="ruby-identifier">pathText</span> <span class="ruby-operator">+=</span> <span class="ruby-node">"#{@property.fullId}(#{atEnd ? 'end' : 'start'})"</span>
+617: <span class="ruby-identifier">puts</span> <span class="ruby-identifier">pathText</span>
+618: <span class="ruby-keyword kw">end</span>
+619: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@deadEndFlags</span>[(<span class="ruby-identifier">atEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value">2</span> <span class="ruby-operator">:</span> <span class="ruby-value">0</span>) <span class="ruby-operator">+</span> (<span class="ruby-identifier">fromOutside</span> <span class="ruby-operator">?</span> <span class="ruby-value">1</span> <span class="ruby-operator">:</span> <span class="ruby-value">0</span>)]
+620: <span class="ruby-identifier">path</span> <span class="ruby-operator"><<</span> [ <span class="ruby-ivar">@property</span>, <span class="ruby-identifier">atEnd</span> ]
+621:
+622: <span class="ruby-comment cmt"># To find loops we have to traverse the graph in a certain order. When we</span>
+623: <span class="ruby-comment cmt"># enter a task we can either come from outside or inside. The following</span>
+624: <span class="ruby-comment cmt"># graph explains these definitions:</span>
+625: <span class="ruby-comment cmt">#</span>
+626: <span class="ruby-comment cmt"># | / \ |</span>
+627: <span class="ruby-comment cmt"># outside v / \ v outside</span>
+628: <span class="ruby-comment cmt"># +------------------------------+</span>
+629: <span class="ruby-comment cmt"># | / Task \ |</span>
+630: <span class="ruby-comment cmt"># -->| o <--- ---> o |<--</span>
+631: <span class="ruby-comment cmt"># |/ Start End \|</span>
+632: <span class="ruby-comment cmt"># /+------------------------------+\</span>
+633: <span class="ruby-comment cmt"># / ^ ^ \</span>
+634: <span class="ruby-comment cmt"># | inside |</span>
+635: <span class="ruby-comment cmt">#</span>
+636: <span class="ruby-comment cmt"># At the top we have the parent task. At the botton the child tasks.</span>
+637: <span class="ruby-comment cmt"># The horizontal arrors are start predecessors or end successors.</span>
+638: <span class="ruby-comment cmt"># As the graph is doubly-linked, we need to becareful to only find real</span>
+639: <span class="ruby-comment cmt"># loops. When coming from outside, we only continue to the inside and vice</span>
+640: <span class="ruby-comment cmt"># versa. Horizontal moves are only made when we are in a leaf task.</span>
+641: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">atEnd</span>
+642: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">fromOutside</span>
+643: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">container?</span>
+644: <span class="ruby-comment cmt">#</span>
+645: <span class="ruby-comment cmt"># |</span>
+646: <span class="ruby-comment cmt"># v</span>
+647: <span class="ruby-comment cmt"># +--------</span>
+648: <span class="ruby-comment cmt"># -->| o--+</span>
+649: <span class="ruby-comment cmt"># +----|---</span>
+650: <span class="ruby-comment cmt"># |</span>
+651: <span class="ruby-comment cmt"># V</span>
+652: <span class="ruby-comment cmt">#</span>
+653: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">children</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">child</span><span class="ruby-operator">|</span>
+654: <span class="ruby-identifier">child</span>.<span class="ruby-identifier">checkForLoops</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">path</span>, <span class="ruby-keyword kw">false</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-identifier">forward</span>)
+655: <span class="ruby-keyword kw">end</span>
+656: <span class="ruby-keyword kw">else</span>
+657: <span class="ruby-comment cmt"># |</span>
+658: <span class="ruby-comment cmt"># v</span>
+659: <span class="ruby-comment cmt"># +--------</span>
+660: <span class="ruby-comment cmt"># -->| o----></span>
+661: <span class="ruby-comment cmt"># +--------</span>
+662: <span class="ruby-comment cmt">#</span>
+663: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">forward</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@forward</span>) <span class="ruby-operator">||</span> <span class="ruby-ivar">@milestone</span>
+664: <span class="ruby-identifier">checkForLoops</span>(<span class="ruby-identifier">path</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-keyword kw">false</span>, <span class="ruby-keyword kw">true</span>)
+665: <span class="ruby-keyword kw">end</span>
+666: <span class="ruby-keyword kw">end</span>
+667: <span class="ruby-keyword kw">else</span>
+668: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@startpreds</span>.<span class="ruby-identifier">empty?</span>
+669: <span class="ruby-comment cmt">#</span>
+670: <span class="ruby-comment cmt"># ^</span>
+671: <span class="ruby-comment cmt"># |</span>
+672: <span class="ruby-comment cmt"># +-|------</span>
+673: <span class="ruby-comment cmt"># | o <--</span>
+674: <span class="ruby-comment cmt"># +--------</span>
+675: <span class="ruby-comment cmt"># ^</span>
+676: <span class="ruby-comment cmt"># |</span>
+677: <span class="ruby-comment cmt">#</span>
+678: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parent</span>
+679: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parent</span>.<span class="ruby-identifier">checkForLoops</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">path</span>, <span class="ruby-keyword kw">false</span>, <span class="ruby-keyword kw">false</span>,
+680: <span class="ruby-identifier">forward</span>)
+681: <span class="ruby-keyword kw">end</span>
+682: <span class="ruby-keyword kw">else</span>
+683:
+684: <span class="ruby-comment cmt"># +--------</span>
+685: <span class="ruby-comment cmt"># <---- o <--</span>
+686: <span class="ruby-comment cmt"># +--------</span>
687: <span class="ruby-comment cmt"># ^</span>
688: <span class="ruby-comment cmt"># |</span>
689: <span class="ruby-comment cmt">#</span>
-690: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parent</span>
-691: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parent</span>.<span class="ruby-identifier">checkForLoops</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">path</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-keyword kw">false</span>,
-692: <span class="ruby-identifier">forward</span>)
-693: <span class="ruby-keyword kw">end</span>
-694: <span class="ruby-keyword kw">else</span>
-695: <span class="ruby-comment cmt"># --------+</span>
-696: <span class="ruby-comment cmt"># --> o----></span>
-697: <span class="ruby-comment cmt"># --------+</span>
-698: <span class="ruby-comment cmt"># ^</span>
+690: <span class="ruby-ivar">@startpreds</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">targetEnd</span><span class="ruby-operator">|</span>
+691: <span class="ruby-identifier">task</span>.<span class="ruby-identifier">checkForLoops</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">path</span>, <span class="ruby-identifier">targetEnd</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-identifier">forward</span>)
+692: <span class="ruby-keyword kw">end</span>
+693: <span class="ruby-keyword kw">end</span>
+694: <span class="ruby-keyword kw">end</span>
+695: <span class="ruby-keyword kw">else</span>
+696: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">fromOutside</span>
+697: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">container?</span>
+698: <span class="ruby-comment cmt">#</span>
699: <span class="ruby-comment cmt"># |</span>
-700: <span class="ruby-comment cmt">#</span>
-701: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'endsuccs'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">targetEnd</span><span class="ruby-operator">|</span>
-702: <span class="ruby-identifier">task</span>.<span class="ruby-identifier">checkForLoops</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">path</span>, <span class="ruby-identifier">targetEnd</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-identifier">forward</span>)
-703: <span class="ruby-keyword kw">end</span>
-704: <span class="ruby-keyword kw">end</span>
-705: <span class="ruby-keyword kw">end</span>
-706: <span class="ruby-keyword kw">end</span>
-707:
-708: <span class="ruby-identifier">path</span>.<span class="ruby-identifier">pop</span>
-709: <span class="ruby-ivar">@deadEndFlags</span>[(<span class="ruby-identifier">atEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value">2</span> <span class="ruby-operator">:</span> <span class="ruby-value">0</span>) <span class="ruby-operator">+</span> (<span class="ruby-identifier">fromOutside</span> <span class="ruby-operator">?</span> <span class="ruby-value">1</span> <span class="ruby-operator">:</span> <span class="ruby-value">0</span>)] = <span class="ruby-keyword kw">true</span>
-710: <span class="ruby-comment cmt"># puts "Finished with #{@property.fullId} #{atEnd ? 'end' : 'start'} " +</span>
-711: <span class="ruby-comment cmt"># "#{fromOutside ? 'outside' : 'inside'}"</span>
-712: <span class="ruby-keyword kw">end</span></pre>
+700: <span class="ruby-comment cmt"># v</span>
+701: <span class="ruby-comment cmt"># --------+</span>
+702: <span class="ruby-comment cmt"># +--o |<--</span>
+703: <span class="ruby-comment cmt"># ---|----+</span>
+704: <span class="ruby-comment cmt"># |</span>
+705: <span class="ruby-comment cmt"># v</span>
+706: <span class="ruby-comment cmt">#</span>
+707: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">children</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">child</span><span class="ruby-operator">|</span>
+708: <span class="ruby-identifier">child</span>.<span class="ruby-identifier">checkForLoops</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">path</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-identifier">forward</span>)
+709: <span class="ruby-keyword kw">end</span>
+710: <span class="ruby-keyword kw">else</span>
+711: <span class="ruby-comment cmt"># |</span>
+712: <span class="ruby-comment cmt"># v</span>
+713: <span class="ruby-comment cmt"># --------+</span>
+714: <span class="ruby-comment cmt"># <----o |<--</span>
+715: <span class="ruby-comment cmt"># --------+</span>
+716: <span class="ruby-comment cmt">#</span>
+717: <span class="ruby-keyword kw">if</span> (<span class="ruby-operator">!</span><span class="ruby-identifier">forward</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@forward</span>) <span class="ruby-operator">||</span> <span class="ruby-ivar">@milestone</span>
+718: <span class="ruby-identifier">checkForLoops</span>(<span class="ruby-identifier">path</span>, <span class="ruby-keyword kw">false</span>, <span class="ruby-keyword kw">false</span>, <span class="ruby-keyword kw">false</span>)
+719: <span class="ruby-keyword kw">end</span>
+720: <span class="ruby-keyword kw">end</span>
+721: <span class="ruby-keyword kw">else</span>
+722: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@endsuccs</span>.<span class="ruby-identifier">empty?</span>
+723: <span class="ruby-comment cmt">#</span>
+724: <span class="ruby-comment cmt"># ^</span>
+725: <span class="ruby-comment cmt"># |</span>
+726: <span class="ruby-comment cmt"># ------|-+</span>
+727: <span class="ruby-comment cmt"># --> o |</span>
+728: <span class="ruby-comment cmt"># --------+</span>
+729: <span class="ruby-comment cmt"># ^</span>
+730: <span class="ruby-comment cmt"># |</span>
+731: <span class="ruby-comment cmt">#</span>
+732: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parent</span>
+733: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parent</span>.<span class="ruby-identifier">checkForLoops</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">path</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-keyword kw">false</span>,
+734: <span class="ruby-identifier">forward</span>)
+735: <span class="ruby-keyword kw">end</span>
+736: <span class="ruby-keyword kw">else</span>
+737: <span class="ruby-comment cmt"># --------+</span>
+738: <span class="ruby-comment cmt"># --> o----></span>
+739: <span class="ruby-comment cmt"># --------+</span>
+740: <span class="ruby-comment cmt"># ^</span>
+741: <span class="ruby-comment cmt"># |</span>
+742: <span class="ruby-comment cmt">#</span>
+743: <span class="ruby-ivar">@endsuccs</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">targetEnd</span><span class="ruby-operator">|</span>
+744: <span class="ruby-identifier">task</span>.<span class="ruby-identifier">checkForLoops</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">path</span>, <span class="ruby-identifier">targetEnd</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-identifier">forward</span>)
+745: <span class="ruby-keyword kw">end</span>
+746: <span class="ruby-keyword kw">end</span>
+747: <span class="ruby-keyword kw">end</span>
+748: <span class="ruby-keyword kw">end</span>
+749:
+750: <span class="ruby-identifier">path</span>.<span class="ruby-identifier">pop</span>
+751: <span class="ruby-ivar">@deadEndFlags</span>[(<span class="ruby-identifier">atEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value">2</span> <span class="ruby-operator">:</span> <span class="ruby-value">0</span>) <span class="ruby-operator">+</span> (<span class="ruby-identifier">fromOutside</span> <span class="ruby-operator">?</span> <span class="ruby-value">1</span> <span class="ruby-operator">:</span> <span class="ruby-value">0</span>)] = <span class="ruby-keyword kw">true</span>
+752: <span class="ruby-comment cmt"># puts "Finished with #{@property.fullId} #{atEnd ? 'end' : 'start'} " +</span>
+753: <span class="ruby-comment cmt"># "#{fromOutside ? 'outside' : 'inside'}"</span>
+754: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -1388,42 +1419,42 @@
<div class="method-source-code"
id="collect-ime-ff-ntervals-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1436</span>
-1436: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">collectTimeOffIntervals</span>(<span class="ruby-identifier">iv</span>, <span class="ruby-identifier">minDuration</span>)
-1437: <span class="ruby-comment cmt"># This function is often called recursively for the same parameters. We</span>
-1438: <span class="ruby-comment cmt"># store the results in the cache to avoid repeated computations of the</span>
-1439: <span class="ruby-comment cmt"># same results.</span>
-1440: <span class="ruby-identifier">key</span> = [ <span class="ruby-keyword kw">self</span>, <span class="ruby-value">:TaskScenarioCollectTimeOffIntervals</span>, <span class="ruby-identifier">iv</span>, <span class="ruby-identifier">minDuration</span> ].<span class="ruby-identifier">hash</span>
-1441: <span class="ruby-ivar">@dCache</span>.<span class="ruby-identifier">cached</span>(<span class="ruby-identifier">key</span>) <span class="ruby-keyword kw">do</span>
-1442: <span class="ruby-identifier">workLoad</span> = <span class="ruby-ivar">@dCache</span>.<span class="ruby-identifier">load</span>(<span class="ruby-identifier">key</span>)
-1443: <span class="ruby-identifier">il</span> = <span class="ruby-constant">IntervalList</span>.<span class="ruby-identifier">new</span>
-1444: <span class="ruby-identifier">il</span> <span class="ruby-operator"><<</span> <span class="ruby-constant">Interval</span>.<span class="ruby-identifier">new</span>(<span class="ruby-ivar">@project</span>[<span class="ruby-value str">'start'</span>], <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'end'</span>])
-1445: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">leaf?</span>
-1446: <span class="ruby-keyword kw">unless</span> (<span class="ruby-identifier">resources</span> = <span class="ruby-identifier">a</span>(<span class="ruby-value str">'assignedresources'</span>)).<span class="ruby-identifier">empty?</span>
-1447: <span class="ruby-comment cmt"># The task has assigned resources, so we can use their common time</span>
-1448: <span class="ruby-comment cmt"># off intervals.</span>
-1449: <span class="ruby-identifier">resources</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resource</span><span class="ruby-operator">|</span>
-1450: <span class="ruby-identifier">il</span> <span class="ruby-operator">&=</span> <span class="ruby-identifier">resource</span>.<span class="ruby-identifier">collectTimeOffIntervals</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">iv</span>,
-1451: <span class="ruby-identifier">minDuration</span>)
-1452: <span class="ruby-keyword kw">end</span>
-1453: <span class="ruby-keyword kw">else</span>
-1454: <span class="ruby-comment cmt"># The task has no assigned resources. We simply use the global time</span>
-1455: <span class="ruby-comment cmt"># off intervals.</span>
-1456: <span class="ruby-identifier">il</span> <span class="ruby-operator">&=</span> <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">collectTimeOffIntervals</span>(<span class="ruby-identifier">iv</span>, <span class="ruby-identifier">minDuration</span>)
-1457: <span class="ruby-keyword kw">end</span>
-1458: <span class="ruby-keyword kw">else</span>
-1459: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">kids</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span><span class="ruby-operator">|</span>
-1460: <span class="ruby-identifier">il</span> <span class="ruby-operator">&=</span> <span class="ruby-identifier">task</span>.<span class="ruby-identifier">collectTimeOffIntervals</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">iv</span>, <span class="ruby-identifier">minDuration</span>)
-1461: <span class="ruby-keyword kw">end</span>
-1462: <span class="ruby-keyword kw">end</span>
-1463:
-1464: <span class="ruby-identifier">il</span>
-1465: <span class="ruby-keyword kw">end</span>
-1466: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1487</span>
+1487: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">collectTimeOffIntervals</span>(<span class="ruby-identifier">iv</span>, <span class="ruby-identifier">minDuration</span>)
+1488: <span class="ruby-comment cmt"># This function is often called recursively for the same parameters. We</span>
+1489: <span class="ruby-comment cmt"># store the results in the cache to avoid repeated computations of the</span>
+1490: <span class="ruby-comment cmt"># same results.</span>
+1491: <span class="ruby-identifier">key</span> = [ <span class="ruby-keyword kw">self</span>, <span class="ruby-value">:TaskScenarioCollectTimeOffIntervals</span>, <span class="ruby-identifier">iv</span>, <span class="ruby-identifier">minDuration</span> ].<span class="ruby-identifier">hash</span>
+1492: <span class="ruby-ivar">@dCache</span>.<span class="ruby-identifier">cached</span>(<span class="ruby-identifier">key</span>) <span class="ruby-keyword kw">do</span>
+1493: <span class="ruby-identifier">workLoad</span> = <span class="ruby-ivar">@dCache</span>.<span class="ruby-identifier">load</span>(<span class="ruby-identifier">key</span>)
+1494: <span class="ruby-identifier">il</span> = <span class="ruby-constant">IntervalList</span>.<span class="ruby-identifier">new</span>
+1495: <span class="ruby-identifier">il</span> <span class="ruby-operator"><<</span> <span class="ruby-constant">TimeInterval</span>.<span class="ruby-identifier">new</span>(<span class="ruby-ivar">@project</span>[<span class="ruby-value str">'start'</span>], <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'end'</span>])
+1496: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">leaf?</span>
+1497: <span class="ruby-keyword kw">unless</span> (<span class="ruby-identifier">resources</span> = <span class="ruby-ivar">@assignedresources</span>).<span class="ruby-identifier">empty?</span>
+1498: <span class="ruby-comment cmt"># The task has assigned resources, so we can use their common time</span>
+1499: <span class="ruby-comment cmt"># off intervals.</span>
+1500: <span class="ruby-identifier">resources</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resource</span><span class="ruby-operator">|</span>
+1501: <span class="ruby-identifier">il</span> <span class="ruby-operator">&=</span> <span class="ruby-identifier">resource</span>.<span class="ruby-identifier">collectTimeOffIntervals</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">iv</span>,
+1502: <span class="ruby-identifier">minDuration</span>)
+1503: <span class="ruby-keyword kw">end</span>
+1504: <span class="ruby-keyword kw">else</span>
+1505: <span class="ruby-comment cmt"># The task has no assigned resources. We simply use the global time</span>
+1506: <span class="ruby-comment cmt"># off intervals.</span>
+1507: <span class="ruby-identifier">il</span> <span class="ruby-operator">&=</span> <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">collectTimeOffIntervals</span>(<span class="ruby-identifier">iv</span>, <span class="ruby-identifier">minDuration</span>)
+1508: <span class="ruby-keyword kw">end</span>
+1509: <span class="ruby-keyword kw">else</span>
+1510: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">kids</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span><span class="ruby-operator">|</span>
+1511: <span class="ruby-identifier">il</span> <span class="ruby-operator">&=</span> <span class="ruby-identifier">task</span>.<span class="ruby-identifier">collectTimeOffIntervals</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">iv</span>, <span class="ruby-identifier">minDuration</span>)
+1512: <span class="ruby-keyword kw">end</span>
+1513: <span class="ruby-keyword kw">end</span>
+1514:
+1515: <span class="ruby-identifier">il</span>
+1516: <span class="ruby-keyword kw">end</span>
+1517: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -1455,19 +1486,19 @@
<div class="method-source-code"
id="count-esource-llocations-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 732</span>
-732: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">countResourceAllocations</span>
-733: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@candidates</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'effort'</span>) <span class="ruby-operator"><=</span> <span class="ruby-value">0</span>
-734:
-735: <span class="ruby-identifier">avgEffort</span> = <span class="ruby-identifier">a</span>(<span class="ruby-value str">'effort'</span>) <span class="ruby-operator">/</span> <span class="ruby-ivar">@candidates</span>.<span class="ruby-identifier">length</span>
-736: <span class="ruby-ivar">@candidates</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resource</span><span class="ruby-operator">|</span>
-737: <span class="ruby-identifier">resource</span>[<span class="ruby-value str">'alloctdeffort'</span>, <span class="ruby-ivar">@scenarioIdx</span>] <span class="ruby-operator">+=</span> <span class="ruby-identifier">avgEffort</span>
-738: <span class="ruby-keyword kw">end</span>
-739: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 774</span>
+774: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">countResourceAllocations</span>
+775: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@candidates</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@effort</span> <span class="ruby-operator"><=</span> <span class="ruby-value">0</span>
+776:
+777: <span class="ruby-identifier">avgEffort</span> = <span class="ruby-ivar">@effort</span> <span class="ruby-operator">/</span> <span class="ruby-ivar">@candidates</span>.<span class="ruby-identifier">length</span>
+778: <span class="ruby-ivar">@candidates</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resource</span><span class="ruby-operator">|</span>
+779: <span class="ruby-identifier">resource</span>[<span class="ruby-value str">'alloctdeffort'</span>, <span class="ruby-ivar">@scenarioIdx</span>] <span class="ruby-operator">+=</span> <span class="ruby-identifier">avgEffort</span>
+780: <span class="ruby-keyword kw">end</span>
+781: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -1498,64 +1529,64 @@
<div class="method-source-code"
id="earliest-tart-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1059</span>
-1059: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">earliestStart</span>
-1060: <span class="ruby-comment cmt"># This is the date that we will return.</span>
-1061: <span class="ruby-identifier">startDate</span> = <span class="ruby-keyword kw">nil</span>
-1062: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'depends'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">dependency</span><span class="ruby-operator">|</span>
-1063: <span class="ruby-identifier">potentialStartDate</span> =
-1064: <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">task</span>[<span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">onEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'end'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
-1065: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">potentialStartDate</span>.<span class="ruby-identifier">nil?</span>
-1066:
-1067: <span class="ruby-comment cmt"># Determine the end date of a 'length' gap.</span>
-1068: <span class="ruby-identifier">dateAfterLengthGap</span> = <span class="ruby-identifier">potentialStartDate</span>
-1069: <span class="ruby-identifier">gapLength</span> = <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">gapLength</span>
-1070: <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">gapLength</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">dateAfterLengthGap</span> <span class="ruby-operator"><</span> <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'end'</span>] <span class="ruby-keyword kw">do</span>
-1071: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">isWorkingTime</span>(<span class="ruby-identifier">dateAfterLengthGap</span>)
-1072: <span class="ruby-identifier">gapLength</span> <span class="ruby-operator">-=</span> <span class="ruby-value">1</span>
-1073: <span class="ruby-keyword kw">end</span>
-1074: <span class="ruby-identifier">dateAfterLengthGap</span> <span class="ruby-operator">+=</span> <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'scheduleGranularity'</span>]
-1075: <span class="ruby-keyword kw">end</span>
-1076:
-1077: <span class="ruby-comment cmt"># Determine the end date of a 'duration' gap.</span>
-1078: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">dateAfterLengthGap</span> <span class="ruby-operator">></span> <span class="ruby-identifier">potentialStartDate</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">gapDuration</span>
-1079: <span class="ruby-identifier">potentialStartDate</span> = <span class="ruby-identifier">dateAfterLengthGap</span>
-1080: <span class="ruby-keyword kw">else</span>
-1081: <span class="ruby-identifier">potentialStartDate</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">gapDuration</span>
-1082: <span class="ruby-keyword kw">end</span>
-1083:
-1084: <span class="ruby-identifier">startDate</span> = <span class="ruby-identifier">potentialStartDate</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">startDate</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span>
-1085: <span class="ruby-identifier">startDate</span> <span class="ruby-operator"><</span> <span class="ruby-identifier">potentialStartDate</span>
-1086: <span class="ruby-keyword kw">end</span>
-1087:
-1088: <span class="ruby-comment cmt"># If any of the parent tasks has an explicit start date, the task must</span>
-1089: <span class="ruby-comment cmt"># start at or after this date.</span>
-1090: <span class="ruby-identifier">task</span> = <span class="ruby-ivar">@property</span>
-1091: <span class="ruby-keyword kw">while</span> (<span class="ruby-identifier">task</span> = <span class="ruby-identifier">task</span>.<span class="ruby-identifier">parent</span>) <span class="ruby-keyword kw">do</span>
-1092: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">task</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>] <span class="ruby-operator">&&</span>
-1093: (<span class="ruby-identifier">startDate</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">task</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>] <span class="ruby-operator">></span> <span class="ruby-identifier">startDate</span>)
-1094: <span class="ruby-identifier">startDate</span> = <span class="ruby-identifier">task</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
-1095: <span class="ruby-keyword kw">break</span>
-1096: <span class="ruby-keyword kw">end</span>
-1097: <span class="ruby-keyword kw">end</span>
-1098:
-1099: <span class="ruby-comment cmt"># When the computed start date is after the already determined end date</span>
-1100: <span class="ruby-comment cmt"># of the task, the start dependencies were too weak. This happens when</span>
-1101: <span class="ruby-comment cmt"># task B depends on A and they are specified this way:</span>
-1102: <span class="ruby-comment cmt"># task A: | --> D-</span>
-1103: <span class="ruby-comment cmt"># task B: -D <-- |</span>
-1104: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>) <span class="ruby-operator">&&</span> <span class="ruby-identifier">startDate</span> <span class="ruby-operator">></span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>)
-1105: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'weak_start_dep'</span>,
-1106: <span class="ruby-node">"Task #{@property.fullId} has a too weak start dependencies "</span> <span class="ruby-operator">+</span>
-1107: <span class="ruby-value str">"to be scheduled properly."</span>)
-1108: <span class="ruby-keyword kw">end</span>
-1109:
-1110: <span class="ruby-identifier">startDate</span>
-1111: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1109</span>
+1109: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">earliestStart</span>
+1110: <span class="ruby-comment cmt"># This is the date that we will return.</span>
+1111: <span class="ruby-identifier">startDate</span> = <span class="ruby-keyword kw">nil</span>
+1112: <span class="ruby-ivar">@depends</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">dependency</span><span class="ruby-operator">|</span>
+1113: <span class="ruby-identifier">potentialStartDate</span> =
+1114: <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">task</span>[<span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">onEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'end'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
+1115: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">potentialStartDate</span>.<span class="ruby-identifier">nil?</span>
+1116:
+1117: <span class="ruby-comment cmt"># Determine the end date of a 'length' gap.</span>
+1118: <span class="ruby-identifier">dateAfterLengthGap</span> = <span class="ruby-identifier">potentialStartDate</span>
+1119: <span class="ruby-identifier">gapLength</span> = <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">gapLength</span>
+1120: <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">gapLength</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">dateAfterLengthGap</span> <span class="ruby-operator"><</span> <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'end'</span>] <span class="ruby-keyword kw">do</span>
+1121: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">isWorkingTime</span>(<span class="ruby-identifier">dateAfterLengthGap</span>)
+1122: <span class="ruby-identifier">gapLength</span> <span class="ruby-operator">-=</span> <span class="ruby-value">1</span>
+1123: <span class="ruby-keyword kw">end</span>
+1124: <span class="ruby-identifier">dateAfterLengthGap</span> <span class="ruby-operator">+=</span> <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'scheduleGranularity'</span>]
+1125: <span class="ruby-keyword kw">end</span>
+1126:
+1127: <span class="ruby-comment cmt"># Determine the end date of a 'duration' gap.</span>
+1128: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">dateAfterLengthGap</span> <span class="ruby-operator">></span> <span class="ruby-identifier">potentialStartDate</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">gapDuration</span>
+1129: <span class="ruby-identifier">potentialStartDate</span> = <span class="ruby-identifier">dateAfterLengthGap</span>
+1130: <span class="ruby-keyword kw">else</span>
+1131: <span class="ruby-identifier">potentialStartDate</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">gapDuration</span>
+1132: <span class="ruby-keyword kw">end</span>
+1133:
+1134: <span class="ruby-identifier">startDate</span> = <span class="ruby-identifier">potentialStartDate</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">startDate</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span>
+1135: <span class="ruby-identifier">startDate</span> <span class="ruby-operator"><</span> <span class="ruby-identifier">potentialStartDate</span>
+1136: <span class="ruby-keyword kw">end</span>
+1137:
+1138: <span class="ruby-comment cmt"># If any of the parent tasks has an explicit start date, the task must</span>
+1139: <span class="ruby-comment cmt"># start at or after this date.</span>
+1140: <span class="ruby-identifier">task</span> = <span class="ruby-ivar">@property</span>
+1141: <span class="ruby-keyword kw">while</span> (<span class="ruby-identifier">task</span> = <span class="ruby-identifier">task</span>.<span class="ruby-identifier">parent</span>) <span class="ruby-keyword kw">do</span>
+1142: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">task</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>] <span class="ruby-operator">&&</span>
+1143: (<span class="ruby-identifier">startDate</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">task</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>] <span class="ruby-operator">></span> <span class="ruby-identifier">startDate</span>)
+1144: <span class="ruby-identifier">startDate</span> = <span class="ruby-identifier">task</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
+1145: <span class="ruby-keyword kw">break</span>
+1146: <span class="ruby-keyword kw">end</span>
+1147: <span class="ruby-keyword kw">end</span>
+1148:
+1149: <span class="ruby-comment cmt"># When the computed start date is after the already determined end date</span>
+1150: <span class="ruby-comment cmt"># of the task, the start dependencies were too weak. This happens when</span>
+1151: <span class="ruby-comment cmt"># task B depends on A and they are specified this way:</span>
+1152: <span class="ruby-comment cmt"># task A: | --> D-</span>
+1153: <span class="ruby-comment cmt"># task B: -D <-- |</span>
+1154: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@end</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">startDate</span> <span class="ruby-operator">></span> <span class="ruby-ivar">@end</span>
+1155: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'weak_start_dep'</span>,
+1156: <span class="ruby-node">"Task #{@property.fullId} has a too weak start dependencies "</span> <span class="ruby-operator">+</span>
+1157: <span class="ruby-value str">"to be scheduled properly."</span>)
+1158: <span class="ruby-keyword kw">end</span>
+1159:
+1160: <span class="ruby-identifier">startDate</span>
+1161: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -1586,30 +1617,30 @@
<div class="method-source-code"
id="finish-cheduling-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 335</span>
-335: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">finishScheduling</span>
-336: <span class="ruby-comment cmt"># Recursively descend into all child tasks.</span>
-337: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">children</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span><span class="ruby-operator">|</span>
-338: <span class="ruby-identifier">task</span>.<span class="ruby-identifier">finishScheduling</span>(<span class="ruby-ivar">@scenarioIdx</span>)
-339: <span class="ruby-keyword kw">end</span>
-340:
-341: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">parent</span> = <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parent</span>)
-342: <span class="ruby-comment cmt"># Add the assigned resources to the parent task list.</span>
-343: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'assignedresources'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resource</span><span class="ruby-operator">|</span>
-344: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">parent</span>[<span class="ruby-value str">'assignedresources'</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">resource</span>)
-345: <span class="ruby-identifier">parent</span>[<span class="ruby-value str">'assignedresources'</span>, <span class="ruby-ivar">@scenarioIdx</span>] <span class="ruby-operator"><<</span> <span class="ruby-identifier">resource</span>
-346: <span class="ruby-keyword kw">end</span>
-347: <span class="ruby-keyword kw">end</span>
-348: <span class="ruby-keyword kw">end</span>
-349:
-350: <span class="ruby-comment cmt"># This list is no longer needed, so let's save some memory. Set it to</span>
-351: <span class="ruby-comment cmt"># nil so we can detect accidental use.</span>
-352: <span class="ruby-ivar">@candidates</span> = <span class="ruby-keyword kw">nil</span>
-353: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 364</span>
+364: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">finishScheduling</span>
+365: <span class="ruby-comment cmt"># Recursively descend into all child tasks.</span>
+366: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">children</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span><span class="ruby-operator">|</span>
+367: <span class="ruby-identifier">task</span>.<span class="ruby-identifier">finishScheduling</span>(<span class="ruby-ivar">@scenarioIdx</span>)
+368: <span class="ruby-keyword kw">end</span>
+369:
+370: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">parent</span> = <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parent</span>)
+371: <span class="ruby-comment cmt"># Add the assigned resources to the parent task list.</span>
+372: <span class="ruby-ivar">@assignedresources</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resource</span><span class="ruby-operator">|</span>
+373: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">parent</span>[<span class="ruby-value str">'assignedresources'</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">resource</span>)
+374: <span class="ruby-identifier">parent</span>[<span class="ruby-value str">'assignedresources'</span>, <span class="ruby-ivar">@scenarioIdx</span>] <span class="ruby-operator"><<</span> <span class="ruby-identifier">resource</span>
+375: <span class="ruby-keyword kw">end</span>
+376: <span class="ruby-keyword kw">end</span>
+377: <span class="ruby-keyword kw">end</span>
+378:
+379: <span class="ruby-comment cmt"># This list is no longer needed, so let's save some memory. Set it to</span>
+380: <span class="ruby-comment cmt"># nil so we can detect accidental use.</span>
+381: <span class="ruby-ivar">@candidates</span> = <span class="ruby-keyword kw">nil</span>
+382: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -1639,38 +1670,38 @@
<div class="method-source-code"
id="get-llocated-ime-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1376</span>
-1376: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">getAllocatedTime</span>(<span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">endIdx</span>, <span class="ruby-identifier">resource</span> = <span class="ruby-keyword kw">nil</span>)
-1377: <span class="ruby-keyword kw">return</span> <span class="ruby-value">0.0</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'milestone'</span>) <span class="ruby-operator">||</span> <span class="ruby-identifier">startIdx</span> <span class="ruby-operator">>=</span> <span class="ruby-identifier">endIdx</span> <span class="ruby-operator">||</span>
-1378: (<span class="ruby-identifier">resource</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'assignedresources'</span>).<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">resource</span>))
-1379:
-1380: <span class="ruby-identifier">key</span> = [ <span class="ruby-keyword kw">self</span>, <span class="ruby-value">:TaskScenarioAllocatedTime</span>, <span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">endIdx</span>, <span class="ruby-identifier">resource</span> ].<span class="ruby-identifier">hash</span>
-1381: <span class="ruby-ivar">@dCache</span>.<span class="ruby-identifier">cached</span>(<span class="ruby-identifier">key</span>) <span class="ruby-keyword kw">do</span>
-1382: <span class="ruby-identifier">allocatedTime</span> = <span class="ruby-value">0.0</span>
-1383: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">container?</span>
-1384: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">kids</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span><span class="ruby-operator">|</span>
-1385: <span class="ruby-identifier">allocatedTime</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">task</span>.<span class="ruby-identifier">getAllocatedTime</span>(<span class="ruby-ivar">@scenarioIdx</span>,
-1386: <span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">endIdx</span>, <span class="ruby-identifier">resource</span>)
-1387: <span class="ruby-keyword kw">end</span>
-1388: <span class="ruby-keyword kw">else</span>
-1389: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">resource</span>
-1390: <span class="ruby-identifier">allocatedTime</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">resource</span>.<span class="ruby-identifier">getAllocatedTime</span>(<span class="ruby-ivar">@scenarioIdx</span>,
-1391: <span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">endIdx</span>,
-1392: <span class="ruby-ivar">@property</span>)
-1393: <span class="ruby-keyword kw">else</span>
-1394: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'assignedresources'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span>
-1395: <span class="ruby-identifier">allocatedTime</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">r</span>.<span class="ruby-identifier">getAllocatedTime</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">endIdx</span>,
-1396: <span class="ruby-ivar">@property</span>)
-1397: <span class="ruby-keyword kw">end</span>
-1398: <span class="ruby-keyword kw">end</span>
-1399: <span class="ruby-keyword kw">end</span>
-1400: <span class="ruby-identifier">allocatedTime</span>
-1401: <span class="ruby-keyword kw">end</span>
-1402: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1427</span>
+1427: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">getAllocatedTime</span>(<span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">endIdx</span>, <span class="ruby-identifier">resource</span> = <span class="ruby-keyword kw">nil</span>)
+1428: <span class="ruby-keyword kw">return</span> <span class="ruby-value">0.0</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@milestone</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">startIdx</span> <span class="ruby-operator">>=</span> <span class="ruby-identifier">endIdx</span> <span class="ruby-operator">||</span>
+1429: (<span class="ruby-identifier">resource</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@assignedresources</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">resource</span>))
+1430:
+1431: <span class="ruby-identifier">key</span> = [ <span class="ruby-keyword kw">self</span>, <span class="ruby-value">:TaskScenarioAllocatedTime</span>, <span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">endIdx</span>, <span class="ruby-identifier">resource</span> ].<span class="ruby-identifier">hash</span>
+1432: <span class="ruby-ivar">@dCache</span>.<span class="ruby-identifier">cached</span>(<span class="ruby-identifier">key</span>) <span class="ruby-keyword kw">do</span>
+1433: <span class="ruby-identifier">allocatedTime</span> = <span class="ruby-value">0.0</span>
+1434: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">container?</span>
+1435: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">kids</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span><span class="ruby-operator">|</span>
+1436: <span class="ruby-identifier">allocatedTime</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">task</span>.<span class="ruby-identifier">getAllocatedTime</span>(<span class="ruby-ivar">@scenarioIdx</span>,
+1437: <span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">endIdx</span>, <span class="ruby-identifier">resource</span>)
+1438: <span class="ruby-keyword kw">end</span>
+1439: <span class="ruby-keyword kw">else</span>
+1440: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">resource</span>
+1441: <span class="ruby-identifier">allocatedTime</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">resource</span>.<span class="ruby-identifier">getAllocatedTime</span>(<span class="ruby-ivar">@scenarioIdx</span>,
+1442: <span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">endIdx</span>,
+1443: <span class="ruby-ivar">@property</span>)
+1444: <span class="ruby-keyword kw">else</span>
+1445: <span class="ruby-ivar">@assignedresources</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span>
+1446: <span class="ruby-identifier">allocatedTime</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">r</span>.<span class="ruby-identifier">getAllocatedTime</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">endIdx</span>,
+1447: <span class="ruby-ivar">@property</span>)
+1448: <span class="ruby-keyword kw">end</span>
+1449: <span class="ruby-keyword kw">end</span>
+1450: <span class="ruby-keyword kw">end</span>
+1451: <span class="ruby-identifier">allocatedTime</span>
+1452: <span class="ruby-keyword kw">end</span>
+1453: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -1702,37 +1733,37 @@
<div class="method-source-code"
id="get-ffective-ork-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1407</span>
-1407: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">getEffectiveWork</span>(<span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">endIdx</span>, <span class="ruby-identifier">resource</span> = <span class="ruby-keyword kw">nil</span>)
-1408: <span class="ruby-keyword kw">return</span> <span class="ruby-value">0.0</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'milestone'</span>) <span class="ruby-operator">||</span> <span class="ruby-identifier">startIdx</span> <span class="ruby-operator">>=</span> <span class="ruby-identifier">endIdx</span> <span class="ruby-operator">||</span>
-1409: (<span class="ruby-identifier">resource</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'assignedresources'</span>).<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">resource</span>))
-1410:
-1411: <span class="ruby-identifier">key</span> = [ <span class="ruby-keyword kw">self</span>, <span class="ruby-value">:TaskScenarioEffectiveWork</span>, <span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">endIdx</span>, <span class="ruby-identifier">resource</span> ].<span class="ruby-identifier">hash</span>
-1412: <span class="ruby-ivar">@dCache</span>.<span class="ruby-identifier">cached</span>(<span class="ruby-identifier">key</span>) <span class="ruby-keyword kw">do</span>
-1413: <span class="ruby-identifier">workLoad</span> = <span class="ruby-value">0.0</span>
-1414: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">container?</span>
-1415: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">kids</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span><span class="ruby-operator">|</span>
-1416: <span class="ruby-identifier">workLoad</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">task</span>.<span class="ruby-identifier">getEffectiveWork</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">endIdx</span>,
-1417: <span class="ruby-identifier">resource</span>)
-1418: <span class="ruby-keyword kw">end</span>
-1419: <span class="ruby-keyword kw">else</span>
-1420: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">resource</span>
-1421: <span class="ruby-identifier">workLoad</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">resource</span>.<span class="ruby-identifier">getEffectiveWork</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">endIdx</span>,
-1422: <span class="ruby-ivar">@property</span>)
-1423: <span class="ruby-keyword kw">else</span>
-1424: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'assignedresources'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span>
-1425: <span class="ruby-identifier">workLoad</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">r</span>.<span class="ruby-identifier">getEffectiveWork</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">endIdx</span>,
-1426: <span class="ruby-ivar">@property</span>)
-1427: <span class="ruby-keyword kw">end</span>
-1428: <span class="ruby-keyword kw">end</span>
-1429: <span class="ruby-keyword kw">end</span>
-1430: <span class="ruby-identifier">workLoad</span>
-1431: <span class="ruby-keyword kw">end</span>
-1432: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1458</span>
+1458: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">getEffectiveWork</span>(<span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">endIdx</span>, <span class="ruby-identifier">resource</span> = <span class="ruby-keyword kw">nil</span>)
+1459: <span class="ruby-keyword kw">return</span> <span class="ruby-value">0.0</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@milestone</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">startIdx</span> <span class="ruby-operator">>=</span> <span class="ruby-identifier">endIdx</span> <span class="ruby-operator">||</span>
+1460: (<span class="ruby-identifier">resource</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@assignedresources</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">resource</span>))
+1461:
+1462: <span class="ruby-identifier">key</span> = [ <span class="ruby-keyword kw">self</span>, <span class="ruby-value">:TaskScenarioEffectiveWork</span>, <span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">endIdx</span>, <span class="ruby-identifier">resource</span> ].<span class="ruby-identifier">hash</span>
+1463: <span class="ruby-ivar">@dCache</span>.<span class="ruby-identifier">cached</span>(<span class="ruby-identifier">key</span>) <span class="ruby-keyword kw">do</span>
+1464: <span class="ruby-identifier">workLoad</span> = <span class="ruby-value">0.0</span>
+1465: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">container?</span>
+1466: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">kids</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span><span class="ruby-operator">|</span>
+1467: <span class="ruby-identifier">workLoad</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">task</span>.<span class="ruby-identifier">getEffectiveWork</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">endIdx</span>,
+1468: <span class="ruby-identifier">resource</span>)
+1469: <span class="ruby-keyword kw">end</span>
+1470: <span class="ruby-keyword kw">else</span>
+1471: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">resource</span>
+1472: <span class="ruby-identifier">workLoad</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">resource</span>.<span class="ruby-identifier">getEffectiveWork</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">endIdx</span>,
+1473: <span class="ruby-ivar">@property</span>)
+1474: <span class="ruby-keyword kw">else</span>
+1475: <span class="ruby-ivar">@assignedresources</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span>
+1476: <span class="ruby-identifier">workLoad</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">r</span>.<span class="ruby-identifier">getEffectiveWork</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">endIdx</span>,
+1477: <span class="ruby-ivar">@property</span>)
+1478: <span class="ruby-keyword kw">end</span>
+1479: <span class="ruby-keyword kw">end</span>
+1480: <span class="ruby-keyword kw">end</span>
+1481: <span class="ruby-identifier">workLoad</span>
+1482: <span class="ruby-keyword kw">end</span>
+1483: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -1763,14 +1794,14 @@
<div class="method-source-code"
id="has-ependency--source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 120</span>
-120: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">hasDependency?</span>(<span class="ruby-identifier">depType</span>, <span class="ruby-identifier">target</span>, <span class="ruby-identifier">onEnd</span>)
-121: <span class="ruby-identifier">a</span>(<span class="ruby-identifier">depType</span>).<span class="ruby-identifier">include?</span>([<span class="ruby-identifier">target</span>, <span class="ruby-identifier">onEnd</span>])
-122: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 149</span>
+149: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">hasDependency?</span>(<span class="ruby-identifier">depType</span>, <span class="ruby-identifier">target</span>, <span class="ruby-identifier">onEnd</span>)
+150: <span class="ruby-identifier">a</span>(<span class="ruby-identifier">depType</span>).<span class="ruby-identifier">include?</span>([<span class="ruby-identifier">target</span>, <span class="ruby-identifier">onEnd</span>])
+151: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -1799,14 +1830,14 @@
<div class="method-source-code"
id="has-uration-pec--source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1052</span>
-1052: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">hasDurationSpec?</span>
-1053: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'length'</span>) <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'duration'</span>) <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'effort'</span>) <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'milestone'</span>)
-1054: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1102</span>
+1102: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">hasDurationSpec?</span>
+1103: <span class="ruby-ivar">@length</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@duration</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@effort</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@milestone</span>
+1104: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -1836,24 +1867,24 @@
<div class="method-source-code"
id="has-esource-llocated--source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1519</span>
-1519: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">hasResourceAllocated?</span>(<span class="ruby-identifier">interval</span>, <span class="ruby-identifier">resource</span>)
-1520: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'assignedresources'</span>).<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">resource</span>)
-1521:
-1522: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">leaf?</span>
-1523: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">resource</span>.<span class="ruby-identifier">allocated?</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">interval</span>, <span class="ruby-ivar">@property</span>)
-1524: <span class="ruby-keyword kw">else</span>
-1525: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">kids</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">t</span><span class="ruby-operator">|</span>
-1526: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">t</span>.<span class="ruby-identifier">hasResourceAllocated?</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">interval</span>,
-1527: <span class="ruby-identifier">resource</span>)
-1528: <span class="ruby-keyword kw">end</span>
-1529: <span class="ruby-keyword kw">end</span>
-1530: <span class="ruby-keyword kw">false</span>
-1531: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1570</span>
+1570: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">hasResourceAllocated?</span>(<span class="ruby-identifier">interval</span>, <span class="ruby-identifier">resource</span>)
+1571: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@assignedresources</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">resource</span>)
+1572:
+1573: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">leaf?</span>
+1574: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">resource</span>.<span class="ruby-identifier">allocated?</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">interval</span>, <span class="ruby-ivar">@property</span>)
+1575: <span class="ruby-keyword kw">else</span>
+1576: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">kids</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">t</span><span class="ruby-operator">|</span>
+1577: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">t</span>.<span class="ruby-identifier">hasResourceAllocated?</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">interval</span>,
+1578: <span class="ruby-identifier">resource</span>)
+1579: <span class="ruby-keyword kw">end</span>
+1580: <span class="ruby-keyword kw">end</span>
+1581: <span class="ruby-keyword kw">false</span>
+1582: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -1885,41 +1916,41 @@
<div class="method-source-code"
id="is-ependency-f-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1471</span>
-1471: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">isDependencyOf</span>(<span class="ruby-identifier">task</span>, <span class="ruby-identifier">depth</span>)
-1472: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">task</span> <span class="ruby-operator">==</span> <span class="ruby-ivar">@property</span>
-1473:
-1474: <span class="ruby-comment cmt"># Check if any of the parent tasks is a dependency of _task_.</span>
-1475: <span class="ruby-identifier">t</span> = <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parent</span>
-1476: <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">t</span>
-1477: <span class="ruby-comment cmt"># If the parent is a dependency, than all childs are as well.</span>
-1478: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">t</span>.<span class="ruby-identifier">isDependencyOf</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">task</span>, <span class="ruby-identifier">depth</span>)
-1479: <span class="ruby-identifier">t</span> = <span class="ruby-identifier">t</span>.<span class="ruby-identifier">parent</span>
-1480: <span class="ruby-keyword kw">end</span>
-1481:
-1482:
-1483: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'startsuccs'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">dep</span><span class="ruby-operator">|</span>
-1484: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">dep</span>[<span class="ruby-value">1</span>]
-1485: <span class="ruby-comment cmt"># must be a start->start dependency</span>
-1486: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">dep</span>[<span class="ruby-value">0</span>].<span class="ruby-identifier">isDependencyOf</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">task</span>, <span class="ruby-identifier">depth</span>)
-1487: <span class="ruby-keyword kw">end</span>
-1488: <span class="ruby-keyword kw">end</span>
-1489:
-1490: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">depth</span> <span class="ruby-operator">==</span> <span class="ruby-value">1</span>
-1491:
-1492: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'endsuccs'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">dep</span><span class="ruby-operator">|</span>
-1493: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">dep</span>[<span class="ruby-value">1</span>]
-1494: <span class="ruby-comment cmt"># must be an end->start dependency</span>
-1495: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">dep</span>[<span class="ruby-value">0</span>].<span class="ruby-identifier">isDependencyOf</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">task</span>, <span class="ruby-identifier">depth</span> <span class="ruby-operator">-</span> <span class="ruby-value">1</span>)
-1496: <span class="ruby-keyword kw">end</span>
-1497: <span class="ruby-keyword kw">end</span>
-1498:
-1499: <span class="ruby-keyword kw">false</span>
-1500: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1522</span>
+1522: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">isDependencyOf</span>(<span class="ruby-identifier">task</span>, <span class="ruby-identifier">depth</span>)
+1523: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">task</span> <span class="ruby-operator">==</span> <span class="ruby-ivar">@property</span>
+1524:
+1525: <span class="ruby-comment cmt"># Check if any of the parent tasks is a dependency of _task_.</span>
+1526: <span class="ruby-identifier">t</span> = <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parent</span>
+1527: <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">t</span>
+1528: <span class="ruby-comment cmt"># If the parent is a dependency, than all childs are as well.</span>
+1529: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">t</span>.<span class="ruby-identifier">isDependencyOf</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">task</span>, <span class="ruby-identifier">depth</span>)
+1530: <span class="ruby-identifier">t</span> = <span class="ruby-identifier">t</span>.<span class="ruby-identifier">parent</span>
+1531: <span class="ruby-keyword kw">end</span>
+1532:
+1533:
+1534: <span class="ruby-ivar">@startsuccs</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">dep</span><span class="ruby-operator">|</span>
+1535: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">dep</span>[<span class="ruby-value">1</span>]
+1536: <span class="ruby-comment cmt"># must be a start->start dependency</span>
+1537: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">dep</span>[<span class="ruby-value">0</span>].<span class="ruby-identifier">isDependencyOf</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">task</span>, <span class="ruby-identifier">depth</span>)
+1538: <span class="ruby-keyword kw">end</span>
+1539: <span class="ruby-keyword kw">end</span>
+1540:
+1541: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">depth</span> <span class="ruby-operator">==</span> <span class="ruby-value">1</span>
+1542:
+1543: <span class="ruby-ivar">@endsuccs</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">dep</span><span class="ruby-operator">|</span>
+1544: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">dep</span>[<span class="ruby-value">1</span>]
+1545: <span class="ruby-comment cmt"># must be an end->start dependency</span>
+1546: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">dep</span>[<span class="ruby-value">0</span>].<span class="ruby-identifier">isDependencyOf</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">task</span>, <span class="ruby-identifier">depth</span> <span class="ruby-operator">-</span> <span class="ruby-value">1</span>)
+1547: <span class="ruby-keyword kw">end</span>
+1548: <span class="ruby-keyword kw">end</span>
+1549:
+1550: <span class="ruby-keyword kw">false</span>
+1551: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -1949,23 +1980,23 @@
<div class="method-source-code"
id="is-eature-f-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1504</span>
-1504: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">isFeatureOf</span>(<span class="ruby-identifier">task</span>)
-1505: <span class="ruby-identifier">sources</span> = <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">all</span>
-1506: <span class="ruby-identifier">destinations</span> = <span class="ruby-identifier">task</span>.<span class="ruby-identifier">all</span>
-1507:
-1508: <span class="ruby-identifier">sources</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">s</span><span class="ruby-operator">|</span>
-1509: <span class="ruby-identifier">destinations</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">d</span><span class="ruby-operator">|</span>
-1510: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">s</span>.<span class="ruby-identifier">isDependencyOf</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">d</span>, <span class="ruby-value">0</span>)
-1511: <span class="ruby-keyword kw">end</span>
-1512: <span class="ruby-keyword kw">end</span>
-1513:
-1514: <span class="ruby-keyword kw">false</span>
-1515: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1555</span>
+1555: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">isFeatureOf</span>(<span class="ruby-identifier">task</span>)
+1556: <span class="ruby-identifier">sources</span> = <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">all</span>
+1557: <span class="ruby-identifier">destinations</span> = <span class="ruby-identifier">task</span>.<span class="ruby-identifier">all</span>
+1558:
+1559: <span class="ruby-identifier">sources</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">s</span><span class="ruby-operator">|</span>
+1560: <span class="ruby-identifier">destinations</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">d</span><span class="ruby-operator">|</span>
+1561: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">s</span>.<span class="ruby-identifier">isDependencyOf</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">d</span>, <span class="ruby-value">0</span>)
+1562: <span class="ruby-keyword kw">end</span>
+1563: <span class="ruby-keyword kw">end</span>
+1564:
+1565: <span class="ruby-keyword kw">false</span>
+1566: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -1996,64 +2027,64 @@
<div class="method-source-code"
id="latest-nd-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1116</span>
-1116: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">latestEnd</span>
-1117: <span class="ruby-comment cmt"># This is the date that we will return.</span>
-1118: <span class="ruby-identifier">endDate</span> = <span class="ruby-keyword kw">nil</span>
-1119: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'precedes'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">dependency</span><span class="ruby-operator">|</span>
-1120: <span class="ruby-identifier">potentialEndDate</span> =
-1121: <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">task</span>[<span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">onEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'end'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
-1122: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">potentialEndDate</span>.<span class="ruby-identifier">nil?</span>
-1123:
-1124: <span class="ruby-comment cmt"># Determine the end date of a 'length' gap.</span>
-1125: <span class="ruby-identifier">dateBeforeLengthGap</span> = <span class="ruby-identifier">potentialEndDate</span>
-1126: <span class="ruby-identifier">gapLength</span> = <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">gapLength</span>
-1127: <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">gapLength</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">dateBeforeLengthGap</span> <span class="ruby-operator">></span> <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'start'</span>] <span class="ruby-keyword kw">do</span>
-1128: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">isWorkingTime</span>(<span class="ruby-identifier">dateBeforeLengthGap</span> <span class="ruby-operator">-</span>
-1129: <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'scheduleGranularity'</span>])
-1130: <span class="ruby-identifier">gapLength</span> <span class="ruby-operator">-=</span> <span class="ruby-value">1</span>
-1131: <span class="ruby-keyword kw">end</span>
-1132: <span class="ruby-identifier">dateBeforeLengthGap</span> <span class="ruby-operator">-=</span> <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'scheduleGranularity'</span>]
-1133: <span class="ruby-keyword kw">end</span>
-1134:
-1135: <span class="ruby-comment cmt"># Determine the end date of a 'duration' gap.</span>
-1136: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">dateBeforeLengthGap</span> <span class="ruby-operator"><</span> <span class="ruby-identifier">potentialEndDate</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">gapDuration</span>
-1137: <span class="ruby-identifier">potentialEndDate</span> = <span class="ruby-identifier">dateBeforeLengthGap</span>
-1138: <span class="ruby-keyword kw">else</span>
-1139: <span class="ruby-identifier">potentialEndDate</span> <span class="ruby-operator">-=</span> <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">gapDuration</span>
-1140: <span class="ruby-keyword kw">end</span>
-1141:
-1142: <span class="ruby-identifier">endDate</span> = <span class="ruby-identifier">potentialEndDate</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">endDate</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">endDate</span> <span class="ruby-operator">></span> <span class="ruby-identifier">potentialEndDate</span>
-1143: <span class="ruby-keyword kw">end</span>
-1144:
-1145: <span class="ruby-comment cmt"># If any of the parent tasks has an explicit end date, the task must end</span>
-1146: <span class="ruby-comment cmt"># at or before this date.</span>
-1147: <span class="ruby-identifier">task</span> = <span class="ruby-ivar">@property</span>
-1148: <span class="ruby-keyword kw">while</span> (<span class="ruby-identifier">task</span> = <span class="ruby-identifier">task</span>.<span class="ruby-identifier">parent</span>) <span class="ruby-keyword kw">do</span>
-1149: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">task</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-ivar">@scenarioIdx</span>] <span class="ruby-operator">&&</span>
-1150: (<span class="ruby-identifier">endDate</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">task</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-ivar">@scenarioIdx</span>] <span class="ruby-operator"><</span> <span class="ruby-identifier">endDate</span>)
-1151: <span class="ruby-identifier">endDate</span> = <span class="ruby-identifier">task</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
-1152: <span class="ruby-keyword kw">break</span>
-1153: <span class="ruby-keyword kw">end</span>
-1154: <span class="ruby-keyword kw">end</span>
-1155:
-1156: <span class="ruby-comment cmt"># When the computed end date is before the already determined start date</span>
-1157: <span class="ruby-comment cmt"># of the task, the end dependencies were too weak. This happens when</span>
-1158: <span class="ruby-comment cmt"># task A precedes B and they are specified this way:</span>
-1159: <span class="ruby-comment cmt"># task A: | --> D-</span>
-1160: <span class="ruby-comment cmt"># task B: -D <-- |</span>
-1161: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>) <span class="ruby-operator">&&</span> (<span class="ruby-identifier">endDate</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">endDate</span> <span class="ruby-operator">></span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>))
-1162: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'weak_end_dep'</span>,
-1163: <span class="ruby-node">"Task #{@property.fullId} has a too weak end dependencies "</span> <span class="ruby-operator">+</span>
-1164: <span class="ruby-value str">"to be scheduled properly."</span>)
-1165: <span class="ruby-keyword kw">end</span>
-1166:
-1167: <span class="ruby-identifier">endDate</span>
-1168: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1166</span>
+1166: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">latestEnd</span>
+1167: <span class="ruby-comment cmt"># This is the date that we will return.</span>
+1168: <span class="ruby-identifier">endDate</span> = <span class="ruby-keyword kw">nil</span>
+1169: <span class="ruby-ivar">@precedes</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">dependency</span><span class="ruby-operator">|</span>
+1170: <span class="ruby-identifier">potentialEndDate</span> =
+1171: <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">task</span>[<span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">onEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'end'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
+1172: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">potentialEndDate</span>.<span class="ruby-identifier">nil?</span>
+1173:
+1174: <span class="ruby-comment cmt"># Determine the end date of a 'length' gap.</span>
+1175: <span class="ruby-identifier">dateBeforeLengthGap</span> = <span class="ruby-identifier">potentialEndDate</span>
+1176: <span class="ruby-identifier">gapLength</span> = <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">gapLength</span>
+1177: <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">gapLength</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">dateBeforeLengthGap</span> <span class="ruby-operator">></span> <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'start'</span>] <span class="ruby-keyword kw">do</span>
+1178: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">isWorkingTime</span>(<span class="ruby-identifier">dateBeforeLengthGap</span> <span class="ruby-operator">-</span>
+1179: <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'scheduleGranularity'</span>])
+1180: <span class="ruby-identifier">gapLength</span> <span class="ruby-operator">-=</span> <span class="ruby-value">1</span>
+1181: <span class="ruby-keyword kw">end</span>
+1182: <span class="ruby-identifier">dateBeforeLengthGap</span> <span class="ruby-operator">-=</span> <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'scheduleGranularity'</span>]
+1183: <span class="ruby-keyword kw">end</span>
+1184:
+1185: <span class="ruby-comment cmt"># Determine the end date of a 'duration' gap.</span>
+1186: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">dateBeforeLengthGap</span> <span class="ruby-operator"><</span> <span class="ruby-identifier">potentialEndDate</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">gapDuration</span>
+1187: <span class="ruby-identifier">potentialEndDate</span> = <span class="ruby-identifier">dateBeforeLengthGap</span>
+1188: <span class="ruby-keyword kw">else</span>
+1189: <span class="ruby-identifier">potentialEndDate</span> <span class="ruby-operator">-=</span> <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">gapDuration</span>
+1190: <span class="ruby-keyword kw">end</span>
+1191:
+1192: <span class="ruby-identifier">endDate</span> = <span class="ruby-identifier">potentialEndDate</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">endDate</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">endDate</span> <span class="ruby-operator">></span> <span class="ruby-identifier">potentialEndDate</span>
+1193: <span class="ruby-keyword kw">end</span>
+1194:
+1195: <span class="ruby-comment cmt"># If any of the parent tasks has an explicit end date, the task must end</span>
+1196: <span class="ruby-comment cmt"># at or before this date.</span>
+1197: <span class="ruby-identifier">task</span> = <span class="ruby-ivar">@property</span>
+1198: <span class="ruby-keyword kw">while</span> (<span class="ruby-identifier">task</span> = <span class="ruby-identifier">task</span>.<span class="ruby-identifier">parent</span>) <span class="ruby-keyword kw">do</span>
+1199: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">task</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-ivar">@scenarioIdx</span>] <span class="ruby-operator">&&</span>
+1200: (<span class="ruby-identifier">endDate</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">task</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-ivar">@scenarioIdx</span>] <span class="ruby-operator"><</span> <span class="ruby-identifier">endDate</span>)
+1201: <span class="ruby-identifier">endDate</span> = <span class="ruby-identifier">task</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
+1202: <span class="ruby-keyword kw">break</span>
+1203: <span class="ruby-keyword kw">end</span>
+1204: <span class="ruby-keyword kw">end</span>
+1205:
+1206: <span class="ruby-comment cmt"># When the computed end date is before the already determined start date</span>
+1207: <span class="ruby-comment cmt"># of the task, the end dependencies were too weak. This happens when</span>
+1208: <span class="ruby-comment cmt"># task A precedes B and they are specified this way:</span>
+1209: <span class="ruby-comment cmt"># task A: | --> D-</span>
+1210: <span class="ruby-comment cmt"># task B: -D <-- |</span>
+1211: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@start</span> <span class="ruby-operator">&&</span> (<span class="ruby-identifier">endDate</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">endDate</span> <span class="ruby-operator">></span> <span class="ruby-ivar">@start</span>)
+1212: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'weak_end_dep'</span>,
+1213: <span class="ruby-node">"Task #{@property.fullId} has a too weak end dependencies "</span> <span class="ruby-operator">+</span>
+1214: <span class="ruby-value str">"to be scheduled properly."</span>)
+1215: <span class="ruby-keyword kw">end</span>
+1216:
+1217: <span class="ruby-identifier">endDate</span>
+1218: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -2084,186 +2115,199 @@
<div class="method-source-code"
id="post-chedule-heck-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 358</span>
-358: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">postScheduleCheck</span>
-359: <span class="ruby-ivar">@errors</span> = <span class="ruby-value">0</span>
-360: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">children</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span><span class="ruby-operator">|</span>
-361: <span class="ruby-ivar">@errors</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">task</span>.<span class="ruby-identifier">postScheduleCheck</span>(<span class="ruby-ivar">@scenarioIdx</span>)
-362: <span class="ruby-keyword kw">end</span>
-363:
-364: <span class="ruby-comment cmt"># There is no point to check the parent if the child(s) have errors.</span>
-365: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@errors</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
-366:
-367: <span class="ruby-comment cmt"># Same for runaway tasks. They have already been reported.</span>
-368: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@isRunAway</span>
-369: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'sched_runaway'</span>, <span class="ruby-value str">"Some tasks did not fit into the project time "</span> <span class="ruby-operator">+</span>
-370: <span class="ruby-value str">"frame."</span>)
-371: <span class="ruby-keyword kw">end</span>
-372:
-373: <span class="ruby-comment cmt"># Make sure the task is marked complete</span>
-374: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'scheduled'</span>)
-375: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'not_scheduled'</span>,
-376: <span class="ruby-node">"Task #{@property.fullId} has not been marked as scheduled."</span>)
-377: <span class="ruby-keyword kw">end</span>
-378:
-379: <span class="ruby-comment cmt"># If the task has a follower or predecessor that is a runaway this task</span>
-380: <span class="ruby-comment cmt"># is also incomplete.</span>
-381: (<span class="ruby-identifier">a</span>(<span class="ruby-value str">'startsuccs'</span>) <span class="ruby-operator">+</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'endsuccs'</span>)).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
-382: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">task</span>.<span class="ruby-identifier">isRunAway</span>(<span class="ruby-ivar">@scenarioIdx</span>)
-383: <span class="ruby-keyword kw">end</span>
-384: (<span class="ruby-identifier">a</span>(<span class="ruby-value str">'startpreds'</span>) <span class="ruby-operator">+</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'endpreds'</span>)).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
-385: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">task</span>.<span class="ruby-identifier">isRunAway</span>(<span class="ruby-ivar">@scenarioIdx</span>)
-386: <span class="ruby-keyword kw">end</span>
-387:
-388: <span class="ruby-comment cmt"># Check if the start time is ok</span>
-389: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>).<span class="ruby-identifier">nil?</span>
-390: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_start_undef'</span>,
-391: <span class="ruby-node">"Task #{@property.fullId} has undefined start time"</span>)
-392: <span class="ruby-keyword kw">end</span>
-393: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>) <span class="ruby-operator"><</span> <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'start'</span>] <span class="ruby-operator">||</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>) <span class="ruby-operator">></span> <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'end'</span>]
-394: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_start_range'</span>,
-395: <span class="ruby-node">"The start time (#{a('start')}) of task #{@property.fullId} "</span> <span class="ruby-operator">+</span>
-396: <span class="ruby-node">"is outside the project interval (#{@project['start']} - "</span> <span class="ruby-operator">+</span>
-397: <span class="ruby-node">"#{@project['end']})"</span>)
-398: <span class="ruby-keyword kw">end</span>
-399: <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'minstart'</span>).<span class="ruby-identifier">nil?</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>) <span class="ruby-operator"><</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'minstart'</span>)
-400: <span class="ruby-identifier">warning</span>(<span class="ruby-value str">'minstart'</span>,
-401: <span class="ruby-node">"The start time (#{a('start')}) of task #{@property.fullId} "</span> <span class="ruby-operator">+</span>
-402: <span class="ruby-node">"is too early. Must be after #{a('minstart')}."</span>)
-403: <span class="ruby-keyword kw">end</span>
-404: <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'maxstart'</span>).<span class="ruby-identifier">nil?</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>) <span class="ruby-operator">></span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'maxstart'</span>)
-405: <span class="ruby-identifier">warning</span>(<span class="ruby-value str">'maxstart'</span>,
-406: <span class="ruby-node">"The start time (#{a('start')}) of task #{@property.fullId} "</span> <span class="ruby-operator">+</span>
-407: <span class="ruby-node">"is too late. Must be before #{a('maxstart')}."</span>)
-408: <span class="ruby-keyword kw">end</span>
-409: <span class="ruby-comment cmt"># Check if the end time is ok</span>
-410: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_end_undef'</span>,
-411: <span class="ruby-node">"Task #{@property.fullId} has undefined end time"</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>).<span class="ruby-identifier">nil?</span>
-412: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>) <span class="ruby-operator"><</span> <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'start'</span>] <span class="ruby-operator">||</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>) <span class="ruby-operator">></span> <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'end'</span>]
-413: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_end_range'</span>,
-414: <span class="ruby-node">"The end time (#{a('end')}) of task #{@property.fullId} "</span> <span class="ruby-operator">+</span>
-415: <span class="ruby-node">"is outside the project interval (#{@project['start']} - "</span> <span class="ruby-operator">+</span>
-416: <span class="ruby-node">"#{@project['end']})"</span>)
-417: <span class="ruby-keyword kw">end</span>
-418: <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'minend'</span>).<span class="ruby-identifier">nil?</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>) <span class="ruby-operator"><</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'minend'</span>)
-419: <span class="ruby-identifier">warning</span>(<span class="ruby-value str">'minend'</span>,
-420: <span class="ruby-node">"The end time (#{a('end')}) of task #{@property.fullId} "</span> <span class="ruby-operator">+</span>
-421: <span class="ruby-node">"is too early. Must be after #{a('minend')}."</span>)
-422: <span class="ruby-keyword kw">end</span>
-423: <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'maxend'</span>).<span class="ruby-identifier">nil?</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>) <span class="ruby-operator">></span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'maxend'</span>)
-424: <span class="ruby-identifier">warning</span>(<span class="ruby-value str">'maxend'</span>,
-425: <span class="ruby-node">"The end time (#{a('end')}) of task #{@property.fullId} "</span> <span class="ruby-operator">+</span>
-426: <span class="ruby-node">"is too late. Must be before #{a('maxend')}."</span>)
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 387</span>
+387: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">postScheduleCheck</span>
+388: <span class="ruby-ivar">@errors</span> = <span class="ruby-value">0</span>
+389: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">children</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span><span class="ruby-operator">|</span>
+390: <span class="ruby-ivar">@errors</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">task</span>.<span class="ruby-identifier">postScheduleCheck</span>(<span class="ruby-ivar">@scenarioIdx</span>)
+391: <span class="ruby-keyword kw">end</span>
+392:
+393: <span class="ruby-comment cmt"># There is no point to check the parent if the child(s) have errors.</span>
+394: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@errors</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
+395:
+396: <span class="ruby-comment cmt"># Same for runaway tasks. They have already been reported.</span>
+397: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@isRunAway</span>
+398: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'sched_runaway'</span>, <span class="ruby-value str">"Some tasks did not fit into the project time "</span> <span class="ruby-operator">+</span>
+399: <span class="ruby-value str">"frame."</span>)
+400: <span class="ruby-keyword kw">end</span>
+401:
+402: <span class="ruby-comment cmt"># Make sure the task is marked complete</span>
+403: <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@scheduled</span>
+404: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'not_scheduled'</span>,
+405: <span class="ruby-node">"Task #{@property.fullId} has not been marked as scheduled."</span>)
+406: <span class="ruby-keyword kw">end</span>
+407:
+408: <span class="ruby-comment cmt"># If the task has a follower or predecessor that is a runaway this task</span>
+409: <span class="ruby-comment cmt"># is also incomplete.</span>
+410: (<span class="ruby-ivar">@startsuccs</span> <span class="ruby-operator">+</span> <span class="ruby-ivar">@endsuccs</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
+411: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">task</span>.<span class="ruby-identifier">isRunAway</span>(<span class="ruby-ivar">@scenarioIdx</span>)
+412: <span class="ruby-keyword kw">end</span>
+413: (<span class="ruby-ivar">@startpreds</span> <span class="ruby-operator">+</span> <span class="ruby-ivar">@endpreds</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
+414: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">task</span>.<span class="ruby-identifier">isRunAway</span>(<span class="ruby-ivar">@scenarioIdx</span>)
+415: <span class="ruby-keyword kw">end</span>
+416:
+417: <span class="ruby-comment cmt"># Check if the start time is ok</span>
+418: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@start</span>.<span class="ruby-identifier">nil?</span>
+419: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_start_undef'</span>,
+420: <span class="ruby-node">"Task #{@property.fullId} has undefined start time"</span>)
+421: <span class="ruby-keyword kw">end</span>
+422: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@start</span> <span class="ruby-operator"><</span> <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'start'</span>] <span class="ruby-operator">||</span> <span class="ruby-ivar">@start</span> <span class="ruby-operator">></span> <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'end'</span>]
+423: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_start_range'</span>,
+424: <span class="ruby-node">"The start time (#{@start}) of task #{@property.fullId} "</span> <span class="ruby-operator">+</span>
+425: <span class="ruby-node">"is outside the project interval (#{@project['start']} - "</span> <span class="ruby-operator">+</span>
+426: <span class="ruby-node">"#{@project['end']})"</span>)
427: <span class="ruby-keyword kw">end</span>
-428: <span class="ruby-comment cmt"># Make sure the start is before the end</span>
-429: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>) <span class="ruby-operator">></span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>)
-430: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'start_after_end'</span>,
-431: <span class="ruby-node">"The start time (#{a('start')}) of task #{@property.fullId} "</span> <span class="ruby-operator">+</span>
-432: <span class="ruby-node">"is after the end time (#{a('end')})."</span>)
-433: <span class="ruby-keyword kw">end</span>
-434:
-435:
-436: <span class="ruby-comment cmt"># Check that tasks fits into parent task.</span>
-437: <span class="ruby-keyword kw">unless</span> (<span class="ruby-identifier">parent</span> = <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parent</span>).<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span>
-438: <span class="ruby-identifier">parent</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span>
-439: <span class="ruby-identifier">parent</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">nil?</span>
-440: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>) <span class="ruby-operator"><</span> <span class="ruby-identifier">parent</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
-441: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_start_in_parent'</span>,
-442: <span class="ruby-node">"The start date (#{a('start')}) of task #{@property.fullId} "</span> <span class="ruby-operator">+</span>
-443: <span class="ruby-value str">"is before the start date of the enclosing task "</span> <span class="ruby-operator">+</span>
-444: <span class="ruby-node">"#{parent['start', @scenarioIdx]}. "</span>)
-445: <span class="ruby-keyword kw">end</span>
-446: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>) <span class="ruby-operator">></span> <span class="ruby-identifier">parent</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
-447: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_end_in_parent'</span>,
-448: <span class="ruby-node">"The end date (#{a('end')}) of task #{@property.fullId} "</span> <span class="ruby-operator">+</span>
-449: <span class="ruby-value str">"is after the end date of the enclosing task "</span> <span class="ruby-operator">+</span>
-450: <span class="ruby-node">"#{parent['end', @scenarioIdx]}. "</span>)
-451: <span class="ruby-keyword kw">end</span>
-452: <span class="ruby-keyword kw">end</span>
-453:
-454: <span class="ruby-comment cmt"># Check that all preceding tasks start/end before this task.</span>
-455: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'depends'</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">dependency</span><span class="ruby-operator">|</span>
-456: <span class="ruby-identifier">task</span> = <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">task</span>
-457: <span class="ruby-identifier">limit</span> = <span class="ruby-identifier">task</span>[<span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">onEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'end'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
-458: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">limit</span>.<span class="ruby-identifier">nil?</span>
-459: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>) <span class="ruby-operator"><</span> <span class="ruby-identifier">limit</span>
-460: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_pred_before'</span>,
-461: <span class="ruby-node">"Task #{@property.fullId} must start after "</span> <span class="ruby-operator">+</span>
-462: <span class="ruby-node">"#{dependency.onEnd ? 'end' : 'start'} of task "</span> <span class="ruby-operator">+</span>
-463: <span class="ruby-node">"#{task.fullId}."</span>)
-464: <span class="ruby-keyword kw">end</span>
-465: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">gapDuration</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
-466: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">limit</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">gapDuration</span> <span class="ruby-operator">></span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>)
-467: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_pred_before_gd'</span>,
-468: <span class="ruby-node">"Task #{@property.fullId} must start "</span> <span class="ruby-operator">+</span>
-469: <span class="ruby-node">"#{dependency.gapDuration / (60 * 60 * 24)} days after "</span> <span class="ruby-operator">+</span>
-470: <span class="ruby-node">"#{dependency.onEnd ? 'end' : 'start'} of task "</span> <span class="ruby-operator">+</span>
-471: <span class="ruby-node">"#{task.fullId}. TaskJuggler cannot enforce this condition "</span> <span class="ruby-operator">+</span>
-472: <span class="ruby-value str">"because the task is scheduled ALAP (finish-to-start) or "</span> <span class="ruby-operator">+</span>
-473: <span class="ruby-node">"has a fixed #{dependency.onEnd ? 'end' : 'start'} date."</span>)
-474: <span class="ruby-keyword kw">end</span>
-475: <span class="ruby-keyword kw">end</span>
-476: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">gapLength</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
-477: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">calcLength</span>(<span class="ruby-identifier">limit</span>, <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>)) <span class="ruby-operator"><</span> <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">gapLength</span>
-478: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_pred_before_gl'</span>,
-479: <span class="ruby-node">"Task #{@property.fullId} must start "</span> <span class="ruby-operator">+</span>
-480: <span class="ruby-node">"#{@project.slotsToDays(dependency.gapLength)} "</span> <span class="ruby-operator">+</span>
-481: <span class="ruby-value str">"working days after "</span> <span class="ruby-operator">+</span>
-482: <span class="ruby-node">"#{dependency.onEnd ? 'end' : 'start'} of task "</span> <span class="ruby-operator">+</span>
-483: <span class="ruby-node">"#{task.fullId}. TaskJuggler cannot enforce this condition "</span> <span class="ruby-operator">+</span>
-484: <span class="ruby-value str">"because the task is scheduled ALAP (finish-to-start) or "</span> <span class="ruby-operator">+</span>
-485: <span class="ruby-node">"has a fixed #{dependency.onEnd ? 'end' : 'start'} date."</span>)
-486: <span class="ruby-keyword kw">end</span>
-487: <span class="ruby-keyword kw">end</span>
-488: <span class="ruby-keyword kw">end</span>
-489:
-490: <span class="ruby-comment cmt"># Check that all following tasks end before this task</span>
-491: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'precedes'</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">dependency</span><span class="ruby-operator">|</span>
-492: <span class="ruby-identifier">task</span> = <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">task</span>
-493: <span class="ruby-identifier">limit</span> = <span class="ruby-identifier">task</span>[<span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">onEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'end'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
-494: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">limit</span>.<span class="ruby-identifier">nil?</span>
-495: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">limit</span> <span class="ruby-operator"><</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>)
-496: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_succ_after'</span>,
-497: <span class="ruby-node">"Task #{@property.fullId} must end before "</span> <span class="ruby-operator">+</span>
-498: <span class="ruby-node">"#{dependency.onEnd ? 'end' : 'start'} of task #{task.fullId}."</span>)
-499: <span class="ruby-keyword kw">end</span>
-500: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">gapDuration</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
-501: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">limit</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">gapDuration</span> <span class="ruby-operator"><</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>)
-502: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_succ_after_gd'</span>,
-503: <span class="ruby-node">"Task #{@property.fullId} must end "</span> <span class="ruby-operator">+</span>
-504: <span class="ruby-node">"#{dependency.gapDuration / (60 * 60 * 24)} days before "</span> <span class="ruby-operator">+</span>
-505: <span class="ruby-node">"#{dependency.onEnd ? 'end' : 'start'} of task "</span> <span class="ruby-operator">+</span>
-506: <span class="ruby-node">"#{task.fullId}. TaskJuggler cannot enforce this condition "</span> <span class="ruby-operator">+</span>
-507: <span class="ruby-value str">"because the task is scheduled ASAP (start-to-finish) or "</span> <span class="ruby-operator">+</span>
-508: <span class="ruby-node">"has a fixed #{dependency.onEnd ? 'end' : 'start'} date."</span>)
-509: <span class="ruby-keyword kw">end</span>
-510: <span class="ruby-keyword kw">end</span>
-511: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">gapLength</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
-512: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">calcLength</span>(<span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>), <span class="ruby-identifier">limit</span>) <span class="ruby-operator"><</span> <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">gapLength</span>
-513: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_succ_after_gl'</span>,
-514: <span class="ruby-node">"Task #{@property.fullId} must end "</span> <span class="ruby-operator">+</span>
-515: <span class="ruby-node">"#{@project.slotsToDays(dependency.gapLength)} "</span> <span class="ruby-operator">+</span>
-516: <span class="ruby-value str">"working days before "</span> <span class="ruby-operator">+</span>
-517: <span class="ruby-node">"#{dependency.onEnd ? 'end' : 'start'} of task "</span> <span class="ruby-operator">+</span>
-518: <span class="ruby-node">"#{task.fullId}. TaskJuggler cannot enforce this condition "</span> <span class="ruby-operator">+</span>
-519: <span class="ruby-value str">"because the task is scheduled ASAP (start-to-finish) or "</span> <span class="ruby-operator">+</span>
-520: <span class="ruby-node">"has a fixed #{dependency.onEnd ? 'end' : 'start'} date."</span>)
-521: <span class="ruby-keyword kw">end</span>
-522: <span class="ruby-keyword kw">end</span>
-523: <span class="ruby-keyword kw">end</span>
-524:
-525: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'milestone'</span>) <span class="ruby-operator">&&</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>) <span class="ruby-operator">!=</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>)
-526: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'milestone_times_equal'</span>,
-527: <span class="ruby-node">"Milestone #{@property.fullId} must have identical start and "</span> <span class="ruby-operator">+</span>
-528: <span class="ruby-value str">"end date."</span>)
-529: <span class="ruby-keyword kw">end</span>
-530:
-531: <span class="ruby-ivar">@errors</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
-532: <span class="ruby-keyword kw">end</span></pre>
+428: <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@minstart</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@start</span> <span class="ruby-operator"><</span> <span class="ruby-ivar">@minstart</span>
+429: <span class="ruby-identifier">warning</span>(<span class="ruby-value str">'minstart'</span>,
+430: <span class="ruby-node">"The start time (#{@start}) of task #{@property.fullId} "</span> <span class="ruby-operator">+</span>
+431: <span class="ruby-node">"is too early. Must be after #{@minstart}."</span>)
+432: <span class="ruby-keyword kw">end</span>
+433: <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@maxstart</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@start</span> <span class="ruby-operator">></span> <span class="ruby-ivar">@maxstart</span>
+434: <span class="ruby-identifier">warning</span>(<span class="ruby-value str">'maxstart'</span>,
+435: <span class="ruby-node">"The start time (#{@start}) of task #{@property.fullId} "</span> <span class="ruby-operator">+</span>
+436: <span class="ruby-node">"is too late. Must be before #{@maxstart}."</span>)
+437: <span class="ruby-keyword kw">end</span>
+438: <span class="ruby-comment cmt"># Check if the end time is ok</span>
+439: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_end_undef'</span>,
+440: <span class="ruby-node">"Task #{@property.fullId} has undefined end time"</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@end</span>.<span class="ruby-identifier">nil?</span>
+441: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@end</span> <span class="ruby-operator"><</span> <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'start'</span>] <span class="ruby-operator">||</span> <span class="ruby-ivar">@end</span> <span class="ruby-operator">></span> <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'end'</span>]
+442: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_end_range'</span>,
+443: <span class="ruby-node">"The end time (#{@end}) of task #{@property.fullId} "</span> <span class="ruby-operator">+</span>
+444: <span class="ruby-node">"is outside the project interval (#{@project['start']} - "</span> <span class="ruby-operator">+</span>
+445: <span class="ruby-node">"#{@project['end']})"</span>)
+446: <span class="ruby-keyword kw">end</span>
+447: <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@minend</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@end</span> <span class="ruby-operator"><</span> <span class="ruby-ivar">@minend</span>
+448: <span class="ruby-identifier">warning</span>(<span class="ruby-value str">'minend'</span>,
+449: <span class="ruby-node">"The end time (#{@end}) of task #{@property.fullId} "</span> <span class="ruby-operator">+</span>
+450: <span class="ruby-node">"is too early. Must be after #{@minend}."</span>)
+451: <span class="ruby-keyword kw">end</span>
+452: <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@maxend</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@end</span> <span class="ruby-operator">></span> <span class="ruby-ivar">@maxend</span>
+453: <span class="ruby-identifier">warning</span>(<span class="ruby-value str">'maxend'</span>,
+454: <span class="ruby-node">"The end time (#{@end}) of task #{@property.fullId} "</span> <span class="ruby-operator">+</span>
+455: <span class="ruby-node">"is too late. Must be before #{@maxend}."</span>)
+456: <span class="ruby-keyword kw">end</span>
+457: <span class="ruby-comment cmt"># Make sure the start is before the end</span>
+458: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@start</span> <span class="ruby-operator">></span> <span class="ruby-ivar">@end</span>
+459: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'start_after_end'</span>,
+460: <span class="ruby-node">"The start time (#{@start}) of task #{@property.fullId} "</span> <span class="ruby-operator">+</span>
+461: <span class="ruby-node">"is after the end time (#{@end})."</span>)
+462: <span class="ruby-keyword kw">end</span>
+463:
+464:
+465: <span class="ruby-comment cmt"># Check that tasks fits into parent task.</span>
+466: <span class="ruby-keyword kw">unless</span> (<span class="ruby-identifier">parent</span> = <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parent</span>).<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span>
+467: <span class="ruby-identifier">parent</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span>
+468: <span class="ruby-identifier">parent</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">nil?</span>
+469: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@start</span> <span class="ruby-operator"><</span> <span class="ruby-identifier">parent</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
+470: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_start_in_parent'</span>,
+471: <span class="ruby-node">"The start date (#{@start}) of task #{@property.fullId} "</span> <span class="ruby-operator">+</span>
+472: <span class="ruby-node">"is before the start date (#{parent['start', @scenarioIdx]}) "</span> <span class="ruby-operator">+</span>
+473: <span class="ruby-value str">"of the enclosing task."</span>)
+474: <span class="ruby-keyword kw">end</span>
+475: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@end</span> <span class="ruby-operator">></span> <span class="ruby-identifier">parent</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
+476: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_end_in_parent'</span>,
+477: <span class="ruby-node">"The end date (#{@end}) of task #{@property.fullId} "</span> <span class="ruby-operator">+</span>
+478: <span class="ruby-node">"is after the end date (#{parent['end', @scenarioIdx]}) "</span> <span class="ruby-operator">+</span>
+479: <span class="ruby-value str">"of the enclosing task."</span>)
+480: <span class="ruby-keyword kw">end</span>
+481: <span class="ruby-keyword kw">end</span>
+482:
+483: <span class="ruby-comment cmt"># Check that all preceding tasks start/end before this task.</span>
+484: <span class="ruby-ivar">@depends</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">dependency</span><span class="ruby-operator">|</span>
+485: <span class="ruby-identifier">task</span> = <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">task</span>
+486: <span class="ruby-identifier">limit</span> = <span class="ruby-identifier">task</span>[<span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">onEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'end'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
+487: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">limit</span>.<span class="ruby-identifier">nil?</span>
+488: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@start</span> <span class="ruby-operator"><</span> <span class="ruby-identifier">limit</span>
+489: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_pred_before'</span>,
+490: <span class="ruby-node">"Task #{@property.fullId} (#{@start}) must start after "</span> <span class="ruby-operator">+</span>
+491: <span class="ruby-node">"#{dependency.onEnd ? 'end' : 'start'} (#{limit}) of task "</span> <span class="ruby-operator">+</span>
+492: <span class="ruby-node">"#{task.fullId}."</span>)
+493: <span class="ruby-keyword kw">end</span>
+494: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">gapDuration</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
+495: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">limit</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">gapDuration</span> <span class="ruby-operator">></span> <span class="ruby-ivar">@start</span>
+496: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_pred_before_gd'</span>,
+497: <span class="ruby-node">"Task #{@property.fullId} must start "</span> <span class="ruby-operator">+</span>
+498: <span class="ruby-node">"#{dependency.gapDuration / (60 * 60 * 24)} days after "</span> <span class="ruby-operator">+</span>
+499: <span class="ruby-node">"#{dependency.onEnd ? 'end' : 'start'} of task "</span> <span class="ruby-operator">+</span>
+500: <span class="ruby-node">"#{task.fullId}. TaskJuggler cannot enforce this condition "</span> <span class="ruby-operator">+</span>
+501: <span class="ruby-value str">"because the task is scheduled ALAP (finish-to-start) or "</span> <span class="ruby-operator">+</span>
+502: <span class="ruby-node">"has a fixed #{dependency.onEnd ? 'end' : 'start'} date."</span>)
+503: <span class="ruby-keyword kw">end</span>
+504: <span class="ruby-keyword kw">end</span>
+505: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">gapLength</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
+506: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">calcLength</span>(<span class="ruby-identifier">limit</span>, <span class="ruby-ivar">@start</span>) <span class="ruby-operator"><</span> <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">gapLength</span>
+507: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_pred_before_gl'</span>,
+508: <span class="ruby-node">"Task #{@property.fullId} must start "</span> <span class="ruby-operator">+</span>
+509: <span class="ruby-node">"#{@project.slotsToDays(dependency.gapLength)} "</span> <span class="ruby-operator">+</span>
+510: <span class="ruby-value str">"working days after "</span> <span class="ruby-operator">+</span>
+511: <span class="ruby-node">"#{dependency.onEnd ? 'end' : 'start'} of task "</span> <span class="ruby-operator">+</span>
+512: <span class="ruby-node">"#{task.fullId}. TaskJuggler cannot enforce this condition "</span> <span class="ruby-operator">+</span>
+513: <span class="ruby-value str">"because the task is scheduled ALAP (finish-to-start) or "</span> <span class="ruby-operator">+</span>
+514: <span class="ruby-node">"has a fixed #{dependency.onEnd ? 'end' : 'start'} date."</span>)
+515: <span class="ruby-keyword kw">end</span>
+516: <span class="ruby-keyword kw">end</span>
+517: <span class="ruby-keyword kw">end</span>
+518:
+519: <span class="ruby-comment cmt"># Check that all following tasks end before this task</span>
+520: <span class="ruby-ivar">@precedes</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">dependency</span><span class="ruby-operator">|</span>
+521: <span class="ruby-identifier">task</span> = <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">task</span>
+522: <span class="ruby-identifier">limit</span> = <span class="ruby-identifier">task</span>[<span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">onEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'end'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
+523: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">limit</span>.<span class="ruby-identifier">nil?</span>
+524: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">limit</span> <span class="ruby-operator"><</span> <span class="ruby-ivar">@end</span>
+525: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_succ_after'</span>,
+526: <span class="ruby-node">"Task #{@property.fullId} (#{@end}) must end before "</span> <span class="ruby-operator">+</span>
+527: <span class="ruby-node">"#{dependency.onEnd ? 'end' : 'start'} (#{limit}) of task "</span> <span class="ruby-operator">+</span>
+528: <span class="ruby-node">"#{task.fullId}."</span>)
+529: <span class="ruby-keyword kw">end</span>
+530: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">gapDuration</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
+531: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">limit</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">gapDuration</span> <span class="ruby-operator"><</span> <span class="ruby-ivar">@end</span>
+532: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_succ_after_gd'</span>,
+533: <span class="ruby-node">"Task #{@property.fullId} must end "</span> <span class="ruby-operator">+</span>
+534: <span class="ruby-node">"#{dependency.gapDuration / (60 * 60 * 24)} days before "</span> <span class="ruby-operator">+</span>
+535: <span class="ruby-node">"#{dependency.onEnd ? 'end' : 'start'} of task "</span> <span class="ruby-operator">+</span>
+536: <span class="ruby-node">"#{task.fullId}. TaskJuggler cannot enforce this condition "</span> <span class="ruby-operator">+</span>
+537: <span class="ruby-value str">"because the task is scheduled ASAP (start-to-finish) or "</span> <span class="ruby-operator">+</span>
+538: <span class="ruby-node">"has a fixed #{dependency.onEnd ? 'end' : 'start'} date."</span>)
+539: <span class="ruby-keyword kw">end</span>
+540: <span class="ruby-keyword kw">end</span>
+541: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">gapLength</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
+542: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">calcLength</span>(<span class="ruby-ivar">@end</span>, <span class="ruby-identifier">limit</span>) <span class="ruby-operator"><</span> <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">gapLength</span>
+543: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_succ_after_gl'</span>,
+544: <span class="ruby-node">"Task #{@property.fullId} must end "</span> <span class="ruby-operator">+</span>
+545: <span class="ruby-node">"#{@project.slotsToDays(dependency.gapLength)} "</span> <span class="ruby-operator">+</span>
+546: <span class="ruby-value str">"working days before "</span> <span class="ruby-operator">+</span>
+547: <span class="ruby-node">"#{dependency.onEnd ? 'end' : 'start'} of task "</span> <span class="ruby-operator">+</span>
+548: <span class="ruby-node">"#{task.fullId}. TaskJuggler cannot enforce this condition "</span> <span class="ruby-operator">+</span>
+549: <span class="ruby-value str">"because the task is scheduled ASAP (start-to-finish) or "</span> <span class="ruby-operator">+</span>
+550: <span class="ruby-node">"has a fixed #{dependency.onEnd ? 'end' : 'start'} date."</span>)
+551: <span class="ruby-keyword kw">end</span>
+552: <span class="ruby-keyword kw">end</span>
+553: <span class="ruby-keyword kw">end</span>
+554:
+555: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@milestone</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@start</span> <span class="ruby-operator">!=</span> <span class="ruby-ivar">@end</span>
+556: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'milestone_times_equal'</span>,
+557: <span class="ruby-node">"Milestone #{@property.fullId} must have identical start and "</span> <span class="ruby-operator">+</span>
+558: <span class="ruby-value str">"end date."</span>)
+559: <span class="ruby-keyword kw">end</span>
+560:
+561: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@effort</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@milestone</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@allocate</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-operator">&&</span>
+562: <span class="ruby-ivar">@assignedresources</span>.<span class="ruby-identifier">empty?</span>
+563: <span class="ruby-comment cmt"># The user used an 'allocate' for the task, but did not specify any</span>
+564: <span class="ruby-comment cmt"># 'effort'. Actual allocations will only happen when resources are</span>
+565: <span class="ruby-comment cmt"># available by chance. If there are no assigned resources, we generate</span>
+566: <span class="ruby-comment cmt"># a warning as this is probably not what the user intended.</span>
+567: <span class="ruby-identifier">warning</span>(<span class="ruby-value str">'allocate_no_assigned'</span>,
+568: <span class="ruby-node">"Task #{@property.id} has resource allocation requested, but "</span> <span class="ruby-operator">+</span>
+569: <span class="ruby-value str">"did not get any resources assigned. Either use 'effort' "</span> <span class="ruby-operator">+</span>
+570: <span class="ruby-value str">"to ensure allocations or use a higher 'priority'."</span>)
+571: <span class="ruby-keyword kw">end</span>
+572:
+573: <span class="ruby-ivar">@errors</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
+574: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -2293,196 +2337,196 @@
<div class="method-source-code"
id="pre-chedule-heck-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 146</span>
-146: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">preScheduleCheck</span>
-147: <span class="ruby-comment cmt"># Accounts can have sub accounts added after being used in a chargetset.</span>
-148: <span class="ruby-comment cmt"># So we need to re-test here.</span>
-149: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'chargeset'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">chargeset</span><span class="ruby-operator">|</span>
-150: <span class="ruby-identifier">chargeset</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">account</span>, <span class="ruby-identifier">share</span><span class="ruby-operator">|</span>
-151: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">account</span>.<span class="ruby-identifier">leaf?</span>
-152: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'account_no_leaf'</span>,
-153: <span class="ruby-node">"Chargesets may not include group account #{account.fullId}."</span>)
-154: <span class="ruby-keyword kw">end</span>
-155: <span class="ruby-keyword kw">end</span>
-156: <span class="ruby-keyword kw">end</span>
-157:
-158: <span class="ruby-comment cmt"># Leaf tasks can be turned into containers after bookings have been added.</span>
-159: <span class="ruby-comment cmt"># We need to check for this.</span>
-160: <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">leaf?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'booking'</span>).<span class="ruby-identifier">empty?</span>
-161: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'container_booking'</span>,
-162: <span class="ruby-node">"Container task #{@property.fullId} may not have bookings."</span>)
-163: <span class="ruby-keyword kw">end</span>
-164:
-165: <span class="ruby-comment cmt"># Milestones may not have bookings.</span>
-166: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'milestone'</span>) <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'booking'</span>).<span class="ruby-identifier">empty?</span>
-167: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'milestone_booking'</span>,
-168: <span class="ruby-node">"Milestone #{@property.fullId} may not have bookings."</span>)
-169: <span class="ruby-keyword kw">end</span>
-170:
-171: <span class="ruby-comment cmt"># All 'scheduled' tasks must have a fixed start and end date.</span>
-172: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'scheduled'</span>) <span class="ruby-operator">&&</span> (<span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>).<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>).<span class="ruby-identifier">nil?</span>)
-173: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'not_scheduled'</span>,
-174: <span class="ruby-node">"Task #{@property.fullId} is marked as scheduled but does not "</span> <span class="ruby-operator">+</span>
-175: <span class="ruby-value str">'have a fixed start and end date.'</span>)
-176: <span class="ruby-keyword kw">end</span>
-177:
-178: <span class="ruby-comment cmt"># If an effort has been specified resources must be allocated as well.</span>
-179: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'effort'</span>) <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'allocate'</span>).<span class="ruby-identifier">empty?</span>
-180: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'effort_no_allocations'</span>,
-181: <span class="ruby-node">"Task #{@property.fullId} has an effort but no resource "</span> <span class="ruby-operator">+</span>
-182: <span class="ruby-value str">"allocations."</span>)
-183: <span class="ruby-keyword kw">end</span>
-184:
-185: <span class="ruby-identifier">durationSpecs</span> = <span class="ruby-value">0</span>
-186: <span class="ruby-identifier">durationSpecs</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'effort'</span>) <span class="ruby-operator">></span> <span class="ruby-value">0</span>
-187: <span class="ruby-identifier">durationSpecs</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'length'</span>) <span class="ruby-operator">></span> <span class="ruby-value">0</span>
-188: <span class="ruby-identifier">durationSpecs</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'duration'</span>) <span class="ruby-operator">></span> <span class="ruby-value">0</span>
-189: <span class="ruby-identifier">durationSpecs</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'milestone'</span>)
-190:
-191: <span class="ruby-comment cmt"># The rest of this function performs a number of plausibility tests with</span>
-192: <span class="ruby-comment cmt"># regards to task start and end critiria. To explain the various cases,</span>
-193: <span class="ruby-comment cmt"># the following symbols are used:</span>
-194: <span class="ruby-comment cmt">#</span>
-195: <span class="ruby-comment cmt"># |: fixed start or end date</span>
-196: <span class="ruby-comment cmt"># -: no fixed start or end date</span>
-197: <span class="ruby-comment cmt"># M: Milestone</span>
-198: <span class="ruby-comment cmt"># D: start or end dependency</span>
-199: <span class="ruby-comment cmt"># x->: ASAP task with duration criteria</span>
-200: <span class="ruby-comment cmt"># <-x: ALAP task with duration criteria</span>
-201: <span class="ruby-comment cmt"># -->: ASAP task without duration criteria</span>
-202: <span class="ruby-comment cmt"># <--: ALAP task without duration criteria</span>
-203:
-204: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">container?</span>
-205: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">durationSpecs</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
-206: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'container_duration'</span>,
-207: <span class="ruby-node">"Container task #{@property.fullId} may not have a duration "</span> <span class="ruby-operator">+</span>
-208: <span class="ruby-value str">"or be marked as milestones."</span>)
-209: <span class="ruby-keyword kw">end</span>
-210: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'milestone'</span>)
-211: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">durationSpecs</span> <span class="ruby-operator">></span> <span class="ruby-value">1</span>
-212: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'milestone_duration'</span>,
-213: <span class="ruby-node">"Milestone task #{@property.fullId} may not have a duration."</span>)
-214: <span class="ruby-keyword kw">end</span>
-215: <span class="ruby-comment cmt"># Milestones can have the following cases:</span>
-216: <span class="ruby-comment cmt">#</span>
-217: <span class="ruby-comment cmt"># | M - ok |D M - ok - M - err1 -D M - ok</span>
-218: <span class="ruby-comment cmt"># | M | err2 |D M | err2 - M | ok -D M | ok</span>
-219: <span class="ruby-comment cmt"># | M -D ok |D M -D ok - M -D ok -D M -D ok</span>
-220: <span class="ruby-comment cmt"># | M |D err2 |D M |D err2 - M |D ok -D M |D ok</span>
-221:
-222: <span class="ruby-comment cmt"># err1: no start and end</span>
-223: <span class="ruby-comment cmt"># already handled by 'start_undetermed' or 'end_undetermed'</span>
-224:
-225: <span class="ruby-comment cmt"># err2: differnt start and end dates</span>
-226: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>) <span class="ruby-operator">&&</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>) <span class="ruby-operator">&&</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>) <span class="ruby-operator">!=</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>)
-227: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'milestone_start_end'</span>,
-228: <span class="ruby-node">"Start (#{a('start')}) and end (#{a('end')}) dates of "</span> <span class="ruby-operator">+</span>
-229: <span class="ruby-node">"milestone task #{@property.fullId} must be identical."</span>)
-230: <span class="ruby-keyword kw">end</span>
-231: <span class="ruby-keyword kw">else</span>
-232: <span class="ruby-comment cmt"># Error table for non-container, non-milestone tasks:</span>
-233: <span class="ruby-comment cmt"># AMP: Automatic milestone promotion for underspecified tasks when</span>
-234: <span class="ruby-comment cmt"># no bookings or allocations are present.</span>
-235: <span class="ruby-comment cmt"># AMPi: Automatic milestone promotion when no bookings or</span>
-236: <span class="ruby-comment cmt"># allocations are present. When no bookings but allocations are</span>
-237: <span class="ruby-comment cmt"># present the task inherits start and end date.</span>
-238: <span class="ruby-comment cmt"># Ref. implicitXref()|</span>
-239: <span class="ruby-comment cmt"># inhS: Inherit start date from parent task or project</span>
-240: <span class="ruby-comment cmt"># inhE: Inherit end date from parent task or project</span>
-241: <span class="ruby-comment cmt">#</span>
-242: <span class="ruby-comment cmt"># | x-> - ok |D x-> - ok - x-> - inhS -D x-> - ok</span>
-243: <span class="ruby-comment cmt"># | x-> | err1 |D x-> | err1 - x-> | inhS -D x-> | err1</span>
-244: <span class="ruby-comment cmt"># | x-> -D ok |D x-> -D ok - x-> -D inhS -D x-> -D ok</span>
-245: <span class="ruby-comment cmt"># | x-> |D err1 |D x-> |D err1 - x-> |D inhS -D x-> |D err1</span>
-246: <span class="ruby-comment cmt"># | --> - AMP |D --> - AMP - --> - AMPi -D --> - AMP</span>
-247: <span class="ruby-comment cmt"># | --> | ok |D --> | ok - --> | inhS -D --> | ok</span>
-248: <span class="ruby-comment cmt"># | --> -D ok |D --> -D ok - --> -D inhS -D --> -D ok</span>
-249: <span class="ruby-comment cmt"># | --> |D ok |D --> |D ok - --> |D inhS -D --> |D ok</span>
-250: <span class="ruby-comment cmt"># | <-x - inhE |D <-x - inhE - <-x - inhE -D <-x - inhE</span>
-251: <span class="ruby-comment cmt"># | <-x | err1 |D <-x | err1 - <-x | ok -D <-x | ok</span>
-252: <span class="ruby-comment cmt"># | <-x -D err1 |D <-x -D err1 - <-x -D ok -D <-x -D ok</span>
-253: <span class="ruby-comment cmt"># | <-x |D err1 |D <-x |D err1 - <-x |D ok -D <-x |D ok</span>
-254: <span class="ruby-comment cmt"># | <-- - inhE |D <-- - inhE - <-- - AMP -D <-- - inhE</span>
-255: <span class="ruby-comment cmt"># | <-- | ok |D <-- | ok - <-- | AMP -D <-- | ok</span>
-256: <span class="ruby-comment cmt"># | <-- -D ok |D <-- -D ok - <-- -D AMP -D <-- -D ok</span>
-257: <span class="ruby-comment cmt"># | <-- |D ok |D <-- |D ok - <-- |D AMP -D <-- |D ok</span>
-258:
-259: <span class="ruby-comment cmt"># These cases are normally autopromoted to milestones or inherit their</span>
-260: <span class="ruby-comment cmt"># start or end dates. But this only works for tasks that have no</span>
-261: <span class="ruby-comment cmt"># allocations or bookings.</span>
-262: <span class="ruby-comment cmt"># - --> -</span>
-263: <span class="ruby-comment cmt"># | --> -</span>
-264: <span class="ruby-comment cmt"># |D --> -</span>
-265: <span class="ruby-comment cmt"># -D --> -</span>
-266: <span class="ruby-comment cmt"># - <-- -</span>
-267: <span class="ruby-comment cmt"># - <-- |</span>
-268: <span class="ruby-comment cmt"># - <-- -D</span>
-269: <span class="ruby-comment cmt"># - <-- |D</span>
-270: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">durationSpecs</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span>
-271: ((<span class="ruby-identifier">a</span>(<span class="ruby-value str">'forward'</span>) <span class="ruby-operator">&&</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>).<span class="ruby-identifier">nil?</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">hasDependencies</span>(<span class="ruby-keyword kw">true</span>)) <span class="ruby-operator">||</span>
-272: (<span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'forward'</span>) <span class="ruby-operator">&&</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>).<span class="ruby-identifier">nil?</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">hasDependencies</span>(<span class="ruby-keyword kw">false</span>)))
-273: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_underspecified'</span>,
-274: <span class="ruby-node">"Task #{@property.fullId} has too few specifations to be "</span> <span class="ruby-operator">+</span>
-275: <span class="ruby-value str">"scheduled."</span>)
-276: <span class="ruby-keyword kw">end</span>
-277:
-278: <span class="ruby-comment cmt"># err1: Overspecified (12 cases)</span>
-279: <span class="ruby-comment cmt"># | x-> |</span>
-280: <span class="ruby-comment cmt"># | <-x |</span>
-281: <span class="ruby-comment cmt"># | x-> |D</span>
-282: <span class="ruby-comment cmt"># | <-x |D</span>
-283: <span class="ruby-comment cmt"># |D x-> |</span>
-284: <span class="ruby-comment cmt"># |D <-x |</span>
-285: <span class="ruby-comment cmt"># |D <-x |D</span>
-286: <span class="ruby-comment cmt"># |D x-> |D</span>
-287: <span class="ruby-comment cmt"># -D x-> |</span>
-288: <span class="ruby-comment cmt"># -D x-> |D</span>
-289: <span class="ruby-comment cmt"># |D <-x -D</span>
-290: <span class="ruby-comment cmt"># | <-x -D</span>
-291: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">durationSpecs</span> <span class="ruby-operator">></span> <span class="ruby-value">1</span>
-292: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'multiple_durations'</span>,
-293: <span class="ruby-value str">"Tasks may only have either a duration, length or effort or "</span> <span class="ruby-operator">+</span>
-294: <span class="ruby-value str">"be a milestone."</span>)
-295: <span class="ruby-keyword kw">end</span>
-296: <span class="ruby-identifier">startSpeced</span> = <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">provided</span>(<span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>)
-297: <span class="ruby-identifier">endSpeced</span> = <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">provided</span>(<span class="ruby-value str">'end'</span>, <span class="ruby-ivar">@scenarioIdx</span>)
-298: <span class="ruby-keyword kw">if</span> ((<span class="ruby-identifier">startSpeced</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">endSpeced</span>) <span class="ruby-operator">||</span>
-299: (<span class="ruby-identifier">hasDependencies</span>(<span class="ruby-keyword kw">false</span>) <span class="ruby-operator">&&</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'forward'</span>) <span class="ruby-operator">&&</span> <span class="ruby-identifier">endSpeced</span>) <span class="ruby-operator">||</span>
-300: (<span class="ruby-identifier">hasDependencies</span>(<span class="ruby-keyword kw">true</span>) <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'forward'</span>) <span class="ruby-operator">&&</span> <span class="ruby-identifier">startSpeced</span>)) <span class="ruby-operator">&&</span>
-301: <span class="ruby-identifier">durationSpecs</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@property</span>.<span class="ruby-identifier">provided</span>(<span class="ruby-value str">'scheduled'</span>, <span class="ruby-ivar">@scenarioIdx</span>)
-302: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_overspecified'</span>,
-303: <span class="ruby-node">"Task #{@property.fullId} has a start, an end and a "</span> <span class="ruby-operator">+</span>
-304: <span class="ruby-value str">'duration specification.'</span>)
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 175</span>
+175: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">preScheduleCheck</span>
+176: <span class="ruby-comment cmt"># Accounts can have sub accounts added after being used in a chargetset.</span>
+177: <span class="ruby-comment cmt"># So we need to re-test here.</span>
+178: <span class="ruby-ivar">@chargeset</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">chargeset</span><span class="ruby-operator">|</span>
+179: <span class="ruby-identifier">chargeset</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">account</span>, <span class="ruby-identifier">share</span><span class="ruby-operator">|</span>
+180: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">account</span>.<span class="ruby-identifier">leaf?</span>
+181: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'account_no_leaf'</span>,
+182: <span class="ruby-node">"Chargesets may not include group account #{account.fullId}."</span>)
+183: <span class="ruby-keyword kw">end</span>
+184: <span class="ruby-keyword kw">end</span>
+185: <span class="ruby-keyword kw">end</span>
+186:
+187: <span class="ruby-comment cmt"># Leaf tasks can be turned into containers after bookings have been added.</span>
+188: <span class="ruby-comment cmt"># We need to check for this.</span>
+189: <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">leaf?</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@booking</span>.<span class="ruby-identifier">empty?</span>
+190: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'container_booking'</span>,
+191: <span class="ruby-node">"Container task #{@property.fullId} may not have bookings."</span>)
+192: <span class="ruby-keyword kw">end</span>
+193:
+194: <span class="ruby-comment cmt"># Milestones may not have bookings.</span>
+195: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@milestone</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@booking</span>.<span class="ruby-identifier">empty?</span>
+196: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'milestone_booking'</span>,
+197: <span class="ruby-node">"Milestone #{@property.fullId} may not have bookings."</span>)
+198: <span class="ruby-keyword kw">end</span>
+199:
+200: <span class="ruby-comment cmt"># All 'scheduled' tasks must have a fixed start and end date.</span>
+201: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@scheduled</span> <span class="ruby-operator">&&</span> (<span class="ruby-ivar">@start</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@end</span>.<span class="ruby-identifier">nil?</span>)
+202: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'not_scheduled'</span>,
+203: <span class="ruby-node">"Task #{@property.fullId} is marked as scheduled but does not "</span> <span class="ruby-operator">+</span>
+204: <span class="ruby-value str">'have a fixed start and end date.'</span>)
+205: <span class="ruby-keyword kw">end</span>
+206:
+207: <span class="ruby-comment cmt"># If an effort has been specified resources must be allocated as well.</span>
+208: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@effort</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@allocate</span>.<span class="ruby-identifier">empty?</span>
+209: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'effort_no_allocations'</span>,
+210: <span class="ruby-node">"Task #{@property.fullId} has an effort but no resource "</span> <span class="ruby-operator">+</span>
+211: <span class="ruby-value str">"allocations."</span>)
+212: <span class="ruby-keyword kw">end</span>
+213:
+214: <span class="ruby-identifier">durationSpecs</span> = <span class="ruby-value">0</span>
+215: <span class="ruby-identifier">durationSpecs</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@effort</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
+216: <span class="ruby-identifier">durationSpecs</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@length</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
+217: <span class="ruby-identifier">durationSpecs</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@duration</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
+218: <span class="ruby-identifier">durationSpecs</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@milestone</span>
+219:
+220: <span class="ruby-comment cmt"># The rest of this function performs a number of plausibility tests with</span>
+221: <span class="ruby-comment cmt"># regards to task start and end critiria. To explain the various cases,</span>
+222: <span class="ruby-comment cmt"># the following symbols are used:</span>
+223: <span class="ruby-comment cmt">#</span>
+224: <span class="ruby-comment cmt"># |: fixed start or end date</span>
+225: <span class="ruby-comment cmt"># -: no fixed start or end date</span>
+226: <span class="ruby-comment cmt"># M: Milestone</span>
+227: <span class="ruby-comment cmt"># D: start or end dependency</span>
+228: <span class="ruby-comment cmt"># x->: ASAP task with duration criteria</span>
+229: <span class="ruby-comment cmt"># <-x: ALAP task with duration criteria</span>
+230: <span class="ruby-comment cmt"># -->: ASAP task without duration criteria</span>
+231: <span class="ruby-comment cmt"># <--: ALAP task without duration criteria</span>
+232:
+233: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">container?</span>
+234: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">durationSpecs</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
+235: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'container_duration'</span>,
+236: <span class="ruby-node">"Container task #{@property.fullId} may not have a duration "</span> <span class="ruby-operator">+</span>
+237: <span class="ruby-value str">"or be marked as milestones."</span>)
+238: <span class="ruby-keyword kw">end</span>
+239: <span class="ruby-keyword kw">elsif</span> <span class="ruby-ivar">@milestone</span>
+240: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">durationSpecs</span> <span class="ruby-operator">></span> <span class="ruby-value">1</span>
+241: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'milestone_duration'</span>,
+242: <span class="ruby-node">"Milestone task #{@property.fullId} may not have a duration."</span>)
+243: <span class="ruby-keyword kw">end</span>
+244: <span class="ruby-comment cmt"># Milestones can have the following cases:</span>
+245: <span class="ruby-comment cmt">#</span>
+246: <span class="ruby-comment cmt"># | M - ok |D M - ok - M - err1 -D M - ok</span>
+247: <span class="ruby-comment cmt"># | M | err2 |D M | err2 - M | ok -D M | ok</span>
+248: <span class="ruby-comment cmt"># | M -D ok |D M -D ok - M -D ok -D M -D ok</span>
+249: <span class="ruby-comment cmt"># | M |D err2 |D M |D err2 - M |D ok -D M |D ok</span>
+250:
+251: <span class="ruby-comment cmt"># err1: no start and end</span>
+252: <span class="ruby-comment cmt"># already handled by 'start_undetermed' or 'end_undetermed'</span>
+253:
+254: <span class="ruby-comment cmt"># err2: differnt start and end dates</span>
+255: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@start</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@end</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@start</span> <span class="ruby-operator">!=</span> <span class="ruby-ivar">@end</span>
+256: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'milestone_start_end'</span>,
+257: <span class="ruby-node">"Start (#{@start}) and end (#{@end}) dates of "</span> <span class="ruby-operator">+</span>
+258: <span class="ruby-node">"milestone task #{@property.fullId} must be identical."</span>)
+259: <span class="ruby-keyword kw">end</span>
+260: <span class="ruby-keyword kw">else</span>
+261: <span class="ruby-comment cmt"># Error table for non-container, non-milestone tasks:</span>
+262: <span class="ruby-comment cmt"># AMP: Automatic milestone promotion for underspecified tasks when</span>
+263: <span class="ruby-comment cmt"># no bookings or allocations are present.</span>
+264: <span class="ruby-comment cmt"># AMPi: Automatic milestone promotion when no bookings or</span>
+265: <span class="ruby-comment cmt"># allocations are present. When no bookings but allocations are</span>
+266: <span class="ruby-comment cmt"># present the task inherits start and end date.</span>
+267: <span class="ruby-comment cmt"># Ref. implicitXref()|</span>
+268: <span class="ruby-comment cmt"># inhS: Inherit start date from parent task or project</span>
+269: <span class="ruby-comment cmt"># inhE: Inherit end date from parent task or project</span>
+270: <span class="ruby-comment cmt">#</span>
+271: <span class="ruby-comment cmt"># | x-> - ok |D x-> - ok - x-> - inhS -D x-> - ok</span>
+272: <span class="ruby-comment cmt"># | x-> | err1 |D x-> | err1 - x-> | inhS -D x-> | err1</span>
+273: <span class="ruby-comment cmt"># | x-> -D ok |D x-> -D ok - x-> -D inhS -D x-> -D ok</span>
+274: <span class="ruby-comment cmt"># | x-> |D err1 |D x-> |D err1 - x-> |D inhS -D x-> |D err1</span>
+275: <span class="ruby-comment cmt"># | --> - AMP |D --> - AMP - --> - AMPi -D --> - AMP</span>
+276: <span class="ruby-comment cmt"># | --> | ok |D --> | ok - --> | inhS -D --> | ok</span>
+277: <span class="ruby-comment cmt"># | --> -D ok |D --> -D ok - --> -D inhS -D --> -D ok</span>
+278: <span class="ruby-comment cmt"># | --> |D ok |D --> |D ok - --> |D inhS -D --> |D ok</span>
+279: <span class="ruby-comment cmt"># | <-x - inhE |D <-x - inhE - <-x - inhE -D <-x - inhE</span>
+280: <span class="ruby-comment cmt"># | <-x | err1 |D <-x | err1 - <-x | ok -D <-x | ok</span>
+281: <span class="ruby-comment cmt"># | <-x -D err1 |D <-x -D err1 - <-x -D ok -D <-x -D ok</span>
+282: <span class="ruby-comment cmt"># | <-x |D err1 |D <-x |D err1 - <-x |D ok -D <-x |D ok</span>
+283: <span class="ruby-comment cmt"># | <-- - inhE |D <-- - inhE - <-- - AMP -D <-- - inhE</span>
+284: <span class="ruby-comment cmt"># | <-- | ok |D <-- | ok - <-- | AMP -D <-- | ok</span>
+285: <span class="ruby-comment cmt"># | <-- -D ok |D <-- -D ok - <-- -D AMP -D <-- -D ok</span>
+286: <span class="ruby-comment cmt"># | <-- |D ok |D <-- |D ok - <-- |D AMP -D <-- |D ok</span>
+287:
+288: <span class="ruby-comment cmt"># These cases are normally autopromoted to milestones or inherit their</span>
+289: <span class="ruby-comment cmt"># start or end dates. But this only works for tasks that have no</span>
+290: <span class="ruby-comment cmt"># allocations or bookings.</span>
+291: <span class="ruby-comment cmt"># - --> -</span>
+292: <span class="ruby-comment cmt"># | --> -</span>
+293: <span class="ruby-comment cmt"># |D --> -</span>
+294: <span class="ruby-comment cmt"># -D --> -</span>
+295: <span class="ruby-comment cmt"># - <-- -</span>
+296: <span class="ruby-comment cmt"># - <-- |</span>
+297: <span class="ruby-comment cmt"># - <-- -D</span>
+298: <span class="ruby-comment cmt"># - <-- |D</span>
+299: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">durationSpecs</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span>
+300: ((<span class="ruby-ivar">@forward</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@end</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">hasDependencies</span>(<span class="ruby-keyword kw">true</span>)) <span class="ruby-operator">||</span>
+301: (<span class="ruby-operator">!</span><span class="ruby-ivar">@forward</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@start</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">hasDependencies</span>(<span class="ruby-keyword kw">false</span>)))
+302: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_underspecified'</span>,
+303: <span class="ruby-node">"Task #{@property.fullId} has too few specifations to be "</span> <span class="ruby-operator">+</span>
+304: <span class="ruby-value str">"scheduled."</span>)
305: <span class="ruby-keyword kw">end</span>
-306: <span class="ruby-keyword kw">end</span>
-307:
-308: <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'booking'</span>).<span class="ruby-identifier">empty?</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'forward'</span>) <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'scheduled'</span>)
-309: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'alap_booking'</span>,
-310: <span class="ruby-value str">'A task scheduled in ALAP mode may only have bookings if it '</span> <span class="ruby-operator">+</span>
-311: <span class="ruby-value str">'has been marked as fully scheduled. Keep in mind that '</span> <span class="ruby-operator">+</span>
-312: <span class="ruby-value str">'certain attributes like \end\ or \precedes\ automatically '</span> <span class="ruby-operator">+</span>
-313: <span class="ruby-value str">'switch the task to ALAP mode.'</span>)
-314: <span class="ruby-keyword kw">end</span>
-315:
-316: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'startsuccs'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
-317: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">task</span>[<span class="ruby-value str">'forward'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
-318: <span class="ruby-identifier">task</span>.<span class="ruby-identifier">data</span>[<span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">error</span>(
-319: <span class="ruby-value str">'onstart_wrong_direction'</span>,
-320: <span class="ruby-value str">'Tasks with on-start dependencies must be ASAP scheduled'</span>)
-321: <span class="ruby-keyword kw">end</span>
-322: <span class="ruby-keyword kw">end</span>
-323: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'endpreds'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
-324: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">task</span>[<span class="ruby-value str">'forward'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
-325: <span class="ruby-identifier">task</span>.<span class="ruby-identifier">data</span>[<span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">error</span>(
-326: <span class="ruby-value str">'onend_wrong_direction'</span>,
-327: <span class="ruby-value str">'Tasks with on-end dependencies must be ALAP scheduled'</span>)
-328: <span class="ruby-keyword kw">end</span>
-329: <span class="ruby-keyword kw">end</span>
-330: <span class="ruby-keyword kw">end</span></pre>
+306:
+307: <span class="ruby-comment cmt"># err1: Overspecified (12 cases)</span>
+308: <span class="ruby-comment cmt"># | x-> |</span>
+309: <span class="ruby-comment cmt"># | <-x |</span>
+310: <span class="ruby-comment cmt"># | x-> |D</span>
+311: <span class="ruby-comment cmt"># | <-x |D</span>
+312: <span class="ruby-comment cmt"># |D x-> |</span>
+313: <span class="ruby-comment cmt"># |D <-x |</span>
+314: <span class="ruby-comment cmt"># |D <-x |D</span>
+315: <span class="ruby-comment cmt"># |D x-> |D</span>
+316: <span class="ruby-comment cmt"># -D x-> |</span>
+317: <span class="ruby-comment cmt"># -D x-> |D</span>
+318: <span class="ruby-comment cmt"># |D <-x -D</span>
+319: <span class="ruby-comment cmt"># | <-x -D</span>
+320: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">durationSpecs</span> <span class="ruby-operator">></span> <span class="ruby-value">1</span>
+321: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'multiple_durations'</span>,
+322: <span class="ruby-value str">"Tasks may only have either a duration, length or effort or "</span> <span class="ruby-operator">+</span>
+323: <span class="ruby-value str">"be a milestone."</span>)
+324: <span class="ruby-keyword kw">end</span>
+325: <span class="ruby-identifier">startSpeced</span> = <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">provided</span>(<span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>)
+326: <span class="ruby-identifier">endSpeced</span> = <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">provided</span>(<span class="ruby-value str">'end'</span>, <span class="ruby-ivar">@scenarioIdx</span>)
+327: <span class="ruby-keyword kw">if</span> ((<span class="ruby-identifier">startSpeced</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">endSpeced</span>) <span class="ruby-operator">||</span>
+328: (<span class="ruby-identifier">hasDependencies</span>(<span class="ruby-keyword kw">false</span>) <span class="ruby-operator">&&</span> <span class="ruby-ivar">@forward</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">endSpeced</span>) <span class="ruby-operator">||</span>
+329: (<span class="ruby-identifier">hasDependencies</span>(<span class="ruby-keyword kw">true</span>) <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@forward</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">startSpeced</span>)) <span class="ruby-operator">&&</span>
+330: <span class="ruby-identifier">durationSpecs</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@property</span>.<span class="ruby-identifier">provided</span>(<span class="ruby-value str">'scheduled'</span>, <span class="ruby-ivar">@scenarioIdx</span>)
+331: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_overspecified'</span>,
+332: <span class="ruby-node">"Task #{@property.fullId} has a start, an end and a "</span> <span class="ruby-operator">+</span>
+333: <span class="ruby-value str">'duration specification.'</span>)
+334: <span class="ruby-keyword kw">end</span>
+335: <span class="ruby-keyword kw">end</span>
+336:
+337: <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@booking</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@forward</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@scheduled</span>
+338: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'alap_booking'</span>,
+339: <span class="ruby-value str">'A task scheduled in ALAP mode may only have bookings if it '</span> <span class="ruby-operator">+</span>
+340: <span class="ruby-value str">'has been marked as fully scheduled. Keep in mind that '</span> <span class="ruby-operator">+</span>
+341: <span class="ruby-value str">'certain attributes like \end\ or \precedes\ automatically '</span> <span class="ruby-operator">+</span>
+342: <span class="ruby-value str">'switch the task to ALAP mode.'</span>)
+343: <span class="ruby-keyword kw">end</span>
+344:
+345: <span class="ruby-ivar">@startsuccs</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
+346: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">task</span>[<span class="ruby-value str">'forward'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
+347: <span class="ruby-identifier">task</span>.<span class="ruby-identifier">data</span>[<span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">error</span>(
+348: <span class="ruby-value str">'onstart_wrong_direction'</span>,
+349: <span class="ruby-value str">'Tasks with on-start dependencies must be ASAP scheduled'</span>)
+350: <span class="ruby-keyword kw">end</span>
+351: <span class="ruby-keyword kw">end</span>
+352: <span class="ruby-ivar">@endpreds</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
+353: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">task</span>[<span class="ruby-value str">'forward'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
+354: <span class="ruby-identifier">task</span>.<span class="ruby-identifier">data</span>[<span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">error</span>(
+355: <span class="ruby-value str">'onend_wrong_direction'</span>,
+356: <span class="ruby-value str">'Tasks with on-end dependencies must be ALAP scheduled'</span>)
+357: <span class="ruby-keyword kw">end</span>
+358: <span class="ruby-keyword kw">end</span>
+359: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -2512,67 +2556,87 @@
<div class="method-source-code"
id="prepare-cheduling-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 34</span>
-34: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">prepareScheduling</span>
-35: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'startpreds'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = []
-36: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'startsuccs'</span>, <span class="ruby-ivar">@scenarioIdx</span>] =[]
-37: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'endpreds'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = []
-38: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'endsuccs'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = []
-39:
-40: <span class="ruby-ivar">@isRunAway</span> = <span class="ruby-keyword kw">false</span>
-41:
-42: <span class="ruby-comment cmt"># The following variables are only used during scheduling</span>
-43: <span class="ruby-ivar">@lastSlot</span> = <span class="ruby-keyword kw">nil</span>
-44: <span class="ruby-comment cmt"># The 'done' variables count scheduled values in number of time slots.</span>
-45: <span class="ruby-ivar">@doneDuration</span> = <span class="ruby-value">0</span>
-46: <span class="ruby-ivar">@doneLength</span> = <span class="ruby-value">0</span>
-47: <span class="ruby-comment cmt"># Due to the 'efficiency' factor the effort slots must be a float.</span>
-48: <span class="ruby-ivar">@doneEffort</span> = <span class="ruby-value">0.0</span>
-49:
-50: <span class="ruby-ivar">@startIsDetermed</span> = <span class="ruby-keyword kw">nil</span>
-51: <span class="ruby-ivar">@endIsDetermed</span> = <span class="ruby-keyword kw">nil</span>
-52: <span class="ruby-ivar">@tentativeStart</span> = <span class="ruby-ivar">@tentativeEnd</span> = <span class="ruby-keyword kw">nil</span>
-53:
-54: <span class="ruby-comment cmt"># To avoid multiple calls to propagateDate() we use these flags to know</span>
-55: <span class="ruby-comment cmt"># when we've done it already.</span>
-56: <span class="ruby-ivar">@startPropagated</span> = <span class="ruby-keyword kw">false</span>
-57: <span class="ruby-ivar">@endPropagated</span> = <span class="ruby-keyword kw">false</span>
-58:
-59: <span class="ruby-comment cmt"># Milestones may only have start or end date even when the 'scheduled'</span>
-60: <span class="ruby-comment cmt"># attribute is set. For further processing, we need to add the missing</span>
-61: <span class="ruby-comment cmt"># date.</span>
-62: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'milestone'</span>) <span class="ruby-operator">&&</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'scheduled'</span>)
-63: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>) <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>)
-64: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>) <span class="ruby-operator">&&</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>)
-65: <span class="ruby-constant">Log</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"Milestone #{@property.fullId}: #{a('start')} -> #{a('end')}"</span>
-66: <span class="ruby-keyword kw">end</span>
-67:
-68: <span class="ruby-comment cmt"># Collect the limits of this task and all parent tasks into a single</span>
-69: <span class="ruby-comment cmt"># Array.</span>
-70: <span class="ruby-ivar">@limits</span> = []
-71: <span class="ruby-identifier">task</span> = <span class="ruby-ivar">@property</span>
-72: <span class="ruby-comment cmt"># Reset the counters of all limits of this task.</span>
-73: <span class="ruby-identifier">task</span>[<span class="ruby-value str">'limits'</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">reset</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">task</span>[<span class="ruby-value str">'limits'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
-74: <span class="ruby-keyword kw">until</span> <span class="ruby-identifier">task</span>.<span class="ruby-identifier">nil?</span>
-75: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">task</span>[<span class="ruby-value str">'limits'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
-76: <span class="ruby-ivar">@limits</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">task</span>[<span class="ruby-value str">'limits'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
-77: <span class="ruby-keyword kw">end</span>
-78: <span class="ruby-identifier">task</span> = <span class="ruby-identifier">task</span>.<span class="ruby-identifier">parent</span>
-79: <span class="ruby-keyword kw">end</span>
-80:
-81: <span class="ruby-comment cmt"># Collect the mandatory allocations.</span>
-82: <span class="ruby-ivar">@mandatories</span> = []
-83: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'allocate'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">allocation</span><span class="ruby-operator">|</span>
-84: <span class="ruby-ivar">@mandatories</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">allocation</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">allocation</span>.<span class="ruby-identifier">mandatory</span>
-85: <span class="ruby-keyword kw">end</span>
-86:
-87: <span class="ruby-identifier">bookBookings</span>
-88: <span class="ruby-identifier">markMilestone</span>
-89: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 43</span>
+ 43: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">prepareScheduling</span>
+ 44: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'startpreds'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = []
+ 45: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'startsuccs'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = []
+ 46: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'endpreds'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = []
+ 47: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'endsuccs'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = []
+ 48:
+ 49: <span class="ruby-ivar">@isRunAway</span> = <span class="ruby-keyword kw">false</span>
+ 50:
+ 51: <span class="ruby-comment cmt"># And as global scoreboard index</span>
+ 52: <span class="ruby-ivar">@currentSlotIdx</span> = <span class="ruby-keyword kw">nil</span>
+ 53: <span class="ruby-comment cmt"># The 'done' variables count scheduled values in number of time slots.</span>
+ 54: <span class="ruby-ivar">@doneDuration</span> = <span class="ruby-value">0</span>
+ 55: <span class="ruby-ivar">@doneLength</span> = <span class="ruby-value">0</span>
+ 56: <span class="ruby-comment cmt"># Due to the 'efficiency' factor the effort slots must be a float.</span>
+ 57: <span class="ruby-ivar">@doneEffort</span> = <span class="ruby-value">0.0</span>
+ 58:
+ 59: <span class="ruby-ivar">@projectionMode</span> = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">scenario</span>(<span class="ruby-ivar">@scenarioIdx</span>).<span class="ruby-identifier">get</span>(<span class="ruby-value str">'projection'</span>)
+ 60:
+ 61: <span class="ruby-ivar">@startIsDetermed</span> = <span class="ruby-keyword kw">nil</span>
+ 62: <span class="ruby-ivar">@endIsDetermed</span> = <span class="ruby-keyword kw">nil</span>
+ 63:
+ 64: <span class="ruby-comment cmt"># To avoid multiple calls to propagateDate() we use these flags to know</span>
+ 65: <span class="ruby-comment cmt"># when we've done it already.</span>
+ 66: <span class="ruby-ivar">@startPropagated</span> = <span class="ruby-keyword kw">false</span>
+ 67: <span class="ruby-ivar">@endPropagated</span> = <span class="ruby-keyword kw">false</span>
+ 68:
+ 69: <span class="ruby-identifier">markMilestone</span>
+ 70: <span class="ruby-comment cmt"># Milestones may only have start or end date even when the 'scheduled'</span>
+ 71: <span class="ruby-comment cmt"># attribute is set. For further processing, we need to add the missing</span>
+ 72: <span class="ruby-comment cmt"># date.</span>
+ 73: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@milestone</span>
+ 74: <span class="ruby-ivar">@end</span> = <span class="ruby-ivar">@start</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@start</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@end</span>
+ 75: <span class="ruby-ivar">@start</span> = <span class="ruby-ivar">@end</span> <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@start</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@end</span>
+ 76: <span class="ruby-keyword kw">end</span>
+ 77:
+ 78: <span class="ruby-comment cmt"># For start-end-tasks without allocation, we don't have to do</span>
+ 79: <span class="ruby-comment cmt"># anything but to set the 'scheduled' flag.</span>
+ 80: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@start</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@end</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@effort</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@length</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@duration</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span>
+ 81: <span class="ruby-ivar">@allocate</span>.<span class="ruby-identifier">empty?</span>
+ 82: <span class="ruby-ivar">@scheduled</span> = <span class="ruby-keyword kw">true</span>
+ 83: <span class="ruby-constant">Log</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"Task #{@property.fullId}: #{@start} -> #{@end}"</span>
+ 84: <span class="ruby-keyword kw">end</span>
+ 85:
+ 86: <span class="ruby-comment cmt"># Collect the limits of this task and all parent tasks into a single</span>
+ 87: <span class="ruby-comment cmt"># Array.</span>
+ 88: <span class="ruby-ivar">@allLimits</span> = []
+ 89: <span class="ruby-identifier">task</span> = <span class="ruby-ivar">@property</span>
+ 90: <span class="ruby-comment cmt"># Reset the counters of all limits of this task.</span>
+ 91: <span class="ruby-identifier">task</span>[<span class="ruby-value str">'limits'</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">reset</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">task</span>[<span class="ruby-value str">'limits'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
+ 92: <span class="ruby-keyword kw">until</span> <span class="ruby-identifier">task</span>.<span class="ruby-identifier">nil?</span>
+ 93: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">task</span>[<span class="ruby-value str">'limits'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
+ 94: <span class="ruby-ivar">@allLimits</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">task</span>[<span class="ruby-value str">'limits'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
+ 95: <span class="ruby-keyword kw">end</span>
+ 96: <span class="ruby-identifier">task</span> = <span class="ruby-identifier">task</span>.<span class="ruby-identifier">parent</span>
+ 97: <span class="ruby-keyword kw">end</span>
+ 98:
+ 99: <span class="ruby-comment cmt"># Collect the mandatory allocations.</span>
+100: <span class="ruby-ivar">@mandatories</span> = []
+101: <span class="ruby-ivar">@allocate</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">allocation</span><span class="ruby-operator">|</span>
+102: <span class="ruby-ivar">@mandatories</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">allocation</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">allocation</span>.<span class="ruby-identifier">mandatory</span>
+103: <span class="ruby-identifier">allocation</span>.<span class="ruby-identifier">lockedResource</span> = <span class="ruby-keyword kw">nil</span>
+104: <span class="ruby-keyword kw">end</span>
+105:
+106: <span class="ruby-identifier">bookBookings</span>
+107:
+108: <span class="ruby-ivar">@durationType</span> =
+109: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@effort</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
+110: <span class="ruby-value">:effortTask</span>
+111: <span class="ruby-keyword kw">elsif</span> <span class="ruby-ivar">@length</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
+112: <span class="ruby-value">:lengthTask</span>
+113: <span class="ruby-keyword kw">elsif</span> <span class="ruby-ivar">@duration</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
+114: <span class="ruby-value">:durationTask</span>
+115: <span class="ruby-keyword kw">else</span>
+116: <span class="ruby-value">:startEndTask</span>
+117: <span class="ruby-keyword kw">end</span>
+118: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -2602,86 +2666,86 @@
<div class="method-source-code"
id="propagate-ate-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 882</span>
-882: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">propagateDate</span>(<span class="ruby-identifier">date</span>, <span class="ruby-identifier">atEnd</span>, <span class="ruby-identifier">ignoreEffort</span> = <span class="ruby-keyword kw">false</span>)
-883: <span class="ruby-identifier">thisEnd</span> = <span class="ruby-identifier">atEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'end'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'start'</span>
-884: <span class="ruby-identifier">otherEnd</span> = <span class="ruby-identifier">atEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'start'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'end'</span>
-885: <span class="ruby-comment cmt">#puts "Propagating #{thisEnd} date #{date} of #{@property.fullId} " +</span>
-886: <span class="ruby-comment cmt"># "#{ignoreEffort ? "ignoring effort" : "" }"</span>
-887:
-888: <span class="ruby-comment cmt"># These flags are just used to avoid duplicate calls of this function</span>
-889: <span class="ruby-comment cmt"># during propagateInitialValues().</span>
-890: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">atEnd</span>
-891: <span class="ruby-ivar">@endPropagated</span> = <span class="ruby-keyword kw">true</span>
-892: <span class="ruby-keyword kw">else</span>
-893: <span class="ruby-ivar">@startPropagated</span> = <span class="ruby-keyword kw">true</span>
-894: <span class="ruby-keyword kw">end</span>
-895:
-896: <span class="ruby-comment cmt"># For leaf tasks, propagate start may set the date. Container task dates</span>
-897: <span class="ruby-comment cmt"># are only set in scheduleContainer().</span>
-898: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">leaf?</span>
-899: <span class="ruby-ivar">@property</span>[<span class="ruby-identifier">thisEnd</span>, <span class="ruby-ivar">@scenarioIdx</span>] = <span class="ruby-identifier">date</span>
-900: <span class="ruby-constant">Log</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"Task #{@property.fullId}: #{a('start')} -> #{a('end')}"</span>
-901: <span class="ruby-keyword kw">end</span>
-902:
-903: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'milestone'</span>)
-904: <span class="ruby-comment cmt"># Start and end date of a milestone are identical.</span>
-905: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'scheduled'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = <span class="ruby-keyword kw">true</span>
-906: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-identifier">otherEnd</span>).<span class="ruby-identifier">nil?</span>
-907: <span class="ruby-identifier">propagateDate</span>(<span class="ruby-identifier">a</span>(<span class="ruby-identifier">thisEnd</span>), <span class="ruby-operator">!</span><span class="ruby-identifier">atEnd</span>)
-908: <span class="ruby-keyword kw">end</span>
-909: <span class="ruby-constant">Log</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"Milestone #{@property.fullId}: #{a('start')} -> #{a('end')}"</span>
-910: <span class="ruby-keyword kw">elsif</span> <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'scheduled'</span>) <span class="ruby-operator">&&</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>) <span class="ruby-operator">&&</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>) <span class="ruby-operator">&&</span>
-911: <span class="ruby-operator">!</span>(<span class="ruby-identifier">a</span>(<span class="ruby-value str">'length'</span>) <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'duration'</span>) <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'effort'</span>) <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span>
-912: <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'allocate'</span>).<span class="ruby-identifier">empty?</span>)
-913: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'scheduled'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = <span class="ruby-keyword kw">true</span>
-914: <span class="ruby-constant">Log</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"Task #{@property.fullId} has been scheduled"</span>
-915: <span class="ruby-keyword kw">end</span>
-916:
-917: <span class="ruby-comment cmt"># Propagate date to all dependent tasks. Don't do this for start</span>
-918: <span class="ruby-comment cmt"># successors or end predecessors if this task is effort based. In this</span>
-919: <span class="ruby-comment cmt"># case, the date might still change to align with the first/last</span>
-920: <span class="ruby-comment cmt"># allocation. In these cases, bookResource() has to propagate the final</span>
-921: <span class="ruby-comment cmt"># date.</span>
-922: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">atEnd</span>
-923: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">ignoreEffort</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'effort'</span>) <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
-924: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'endpreds'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
-925: <span class="ruby-identifier">propagateDateToDep</span>(<span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span>)
-926: <span class="ruby-keyword kw">end</span>
-927: <span class="ruby-keyword kw">end</span>
-928: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'endsuccs'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
-929: <span class="ruby-identifier">propagateDateToDep</span>(<span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span>)
-930: <span class="ruby-keyword kw">end</span>
-931: <span class="ruby-keyword kw">else</span>
-932: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">ignoreEffort</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'effort'</span>) <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
-933: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'startsuccs'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
-934: <span class="ruby-identifier">propagateDateToDep</span>(<span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span>)
-935: <span class="ruby-keyword kw">end</span>
-936: <span class="ruby-keyword kw">end</span>
-937: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'startpreds'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
-938: <span class="ruby-identifier">propagateDateToDep</span>(<span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span>)
-939: <span class="ruby-keyword kw">end</span>
-940: <span class="ruby-keyword kw">end</span>
-941:
-942: <span class="ruby-comment cmt"># Propagate date to sub tasks which have only an implicit</span>
-943: <span class="ruby-comment cmt"># dependency on the parent task and no other criteria for this end of</span>
-944: <span class="ruby-comment cmt"># the task.</span>
-945: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">children</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span><span class="ruby-operator">|</span>
-946: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">task</span>.<span class="ruby-identifier">canInheritDate?</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">atEnd</span>)
-947: <span class="ruby-identifier">task</span>.<span class="ruby-identifier">propagateDate</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">date</span>, <span class="ruby-identifier">atEnd</span>)
-948: <span class="ruby-keyword kw">end</span>
-949: <span class="ruby-keyword kw">end</span>
-950:
-951: <span class="ruby-comment cmt"># The date propagation might have completed the date set of the enclosing</span>
-952: <span class="ruby-comment cmt"># containter task. If so, we can schedule it as well.</span>
-953: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parents</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">parent</span><span class="ruby-operator">|</span>
-954: <span class="ruby-identifier">parent</span>.<span class="ruby-identifier">scheduleContainer</span>(<span class="ruby-ivar">@scenarioIdx</span>)
-955: <span class="ruby-keyword kw">end</span>
-956: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 932</span>
+ 932: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">propagateDate</span>(<span class="ruby-identifier">date</span>, <span class="ruby-identifier">atEnd</span>, <span class="ruby-identifier">ignoreEffort</span> = <span class="ruby-keyword kw">false</span>)
+ 933: <span class="ruby-identifier">thisEnd</span> = <span class="ruby-identifier">atEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'end'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'start'</span>
+ 934: <span class="ruby-identifier">otherEnd</span> = <span class="ruby-identifier">atEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'start'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'end'</span>
+ 935: <span class="ruby-comment cmt">#puts "Propagating #{thisEnd} date #{date} of #{@property.fullId} " +</span>
+ 936: <span class="ruby-comment cmt"># "#{ignoreEffort ? "ignoring effort" : "" }"</span>
+ 937:
+ 938: <span class="ruby-comment cmt"># These flags are just used to avoid duplicate calls of this function</span>
+ 939: <span class="ruby-comment cmt"># during propagateInitialValues().</span>
+ 940: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">atEnd</span>
+ 941: <span class="ruby-ivar">@endPropagated</span> = <span class="ruby-keyword kw">true</span>
+ 942: <span class="ruby-keyword kw">else</span>
+ 943: <span class="ruby-ivar">@startPropagated</span> = <span class="ruby-keyword kw">true</span>
+ 944: <span class="ruby-keyword kw">end</span>
+ 945:
+ 946: <span class="ruby-comment cmt"># For leaf tasks, propagate start may set the date. Container task dates</span>
+ 947: <span class="ruby-comment cmt"># are only set in scheduleContainer().</span>
+ 948: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">leaf?</span>
+ 949: <span class="ruby-identifier">instance_variable_set</span>((<span class="ruby-value str">'@'</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">thisEnd</span>).<span class="ruby-identifier">intern</span>, <span class="ruby-identifier">date</span>)
+ 950: <span class="ruby-constant">Log</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"Task #{@property.fullId}: #{@start} -> #{@end}"</span>
+ 951: <span class="ruby-keyword kw">end</span>
+ 952:
+ 953: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@milestone</span>
+ 954: <span class="ruby-comment cmt"># Start and end date of a milestone are identical.</span>
+ 955: <span class="ruby-ivar">@scheduled</span> = <span class="ruby-keyword kw">true</span>
+ 956: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-identifier">otherEnd</span>).<span class="ruby-identifier">nil?</span>
+ 957: <span class="ruby-identifier">propagateDate</span>(<span class="ruby-identifier">a</span>(<span class="ruby-identifier">thisEnd</span>), <span class="ruby-operator">!</span><span class="ruby-identifier">atEnd</span>)
+ 958: <span class="ruby-keyword kw">end</span>
+ 959: <span class="ruby-constant">Log</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"Milestone #{@property.fullId}: #{@start} -> #{@end}"</span>
+ 960: <span class="ruby-keyword kw">elsif</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@scheduled</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@start</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@end</span> <span class="ruby-operator">&&</span>
+ 961: <span class="ruby-operator">!</span>(<span class="ruby-ivar">@length</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@duration</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@effort</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span>
+ 962: <span class="ruby-operator">!</span><span class="ruby-ivar">@allocate</span>.<span class="ruby-identifier">empty?</span>)
+ 963: <span class="ruby-ivar">@scheduled</span> = <span class="ruby-keyword kw">true</span>
+ 964: <span class="ruby-constant">Log</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"Task #{@property.fullId} has been scheduled"</span>
+ 965: <span class="ruby-keyword kw">end</span>
+ 966:
+ 967: <span class="ruby-comment cmt"># Propagate date to all dependent tasks. Don't do this for start</span>
+ 968: <span class="ruby-comment cmt"># successors or end predecessors if this task is effort based. In this</span>
+ 969: <span class="ruby-comment cmt"># case, the date might still change to align with the first/last</span>
+ 970: <span class="ruby-comment cmt"># allocation. In these cases, bookResource() has to propagate the final</span>
+ 971: <span class="ruby-comment cmt"># date.</span>
+ 972: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">atEnd</span>
+ 973: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">ignoreEffort</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@effort</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
+ 974: <span class="ruby-ivar">@endpreds</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
+ 975: <span class="ruby-identifier">propagateDateToDep</span>(<span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span>)
+ 976: <span class="ruby-keyword kw">end</span>
+ 977: <span class="ruby-keyword kw">end</span>
+ 978: <span class="ruby-ivar">@endsuccs</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
+ 979: <span class="ruby-identifier">propagateDateToDep</span>(<span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span>)
+ 980: <span class="ruby-keyword kw">end</span>
+ 981: <span class="ruby-keyword kw">else</span>
+ 982: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">ignoreEffort</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@effort</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span>
+ 983: <span class="ruby-ivar">@startsuccs</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
+ 984: <span class="ruby-identifier">propagateDateToDep</span>(<span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span>)
+ 985: <span class="ruby-keyword kw">end</span>
+ 986: <span class="ruby-keyword kw">end</span>
+ 987: <span class="ruby-ivar">@startpreds</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
+ 988: <span class="ruby-identifier">propagateDateToDep</span>(<span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span>)
+ 989: <span class="ruby-keyword kw">end</span>
+ 990: <span class="ruby-keyword kw">end</span>
+ 991:
+ 992: <span class="ruby-comment cmt"># Propagate date to sub tasks which have only an implicit</span>
+ 993: <span class="ruby-comment cmt"># dependency on the parent task and no other criteria for this end of</span>
+ 994: <span class="ruby-comment cmt"># the task.</span>
+ 995: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">children</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span><span class="ruby-operator">|</span>
+ 996: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">task</span>.<span class="ruby-identifier">canInheritDate?</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">atEnd</span>)
+ 997: <span class="ruby-identifier">task</span>.<span class="ruby-identifier">propagateDate</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">date</span>, <span class="ruby-identifier">atEnd</span>)
+ 998: <span class="ruby-keyword kw">end</span>
+ 999: <span class="ruby-keyword kw">end</span>
+1000:
+1001: <span class="ruby-comment cmt"># The date propagation might have completed the date set of the enclosing</span>
+1002: <span class="ruby-comment cmt"># containter task. If so, we can schedule it as well.</span>
+1003: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parents</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">parent</span><span class="ruby-operator">|</span>
+1004: <span class="ruby-identifier">parent</span>.<span class="ruby-identifier">scheduleContainer</span>(<span class="ruby-ivar">@scenarioIdx</span>)
+1005: <span class="ruby-keyword kw">end</span>
+1006: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -2708,30 +2772,30 @@
<div class="method-source-code"
id="propagate-nitial-alues-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 124</span>
-124: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">propagateInitialValues</span>
-125: <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@startPropagated</span>
-126: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>)
-127: <span class="ruby-identifier">propagateDate</span>(<span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>), <span class="ruby-keyword kw">false</span>)
-128: <span class="ruby-keyword kw">elsif</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parent</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">&&</span>
-129: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">canInheritDate?</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-keyword kw">false</span>)
-130: <span class="ruby-identifier">propagateDate</span>(<span class="ruby-ivar">@project</span>[<span class="ruby-value str">'start'</span>], <span class="ruby-keyword kw">false</span>)
-131: <span class="ruby-keyword kw">end</span>
-132: <span class="ruby-keyword kw">end</span>
-133:
-134: <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@endPropagated</span>
-135: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>)
-136: <span class="ruby-identifier">propagateDate</span>(<span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>), <span class="ruby-keyword kw">true</span>)
-137: <span class="ruby-keyword kw">elsif</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parent</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">&&</span>
-138: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">canInheritDate?</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-keyword kw">true</span>)
-139: <span class="ruby-identifier">propagateDate</span>(<span class="ruby-ivar">@project</span>[<span class="ruby-value str">'end'</span>], <span class="ruby-keyword kw">true</span>)
-140: <span class="ruby-keyword kw">end</span>
-141: <span class="ruby-keyword kw">end</span>
-142: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 153</span>
+153: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">propagateInitialValues</span>
+154: <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@startPropagated</span>
+155: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@start</span>
+156: <span class="ruby-identifier">propagateDate</span>(<span class="ruby-ivar">@start</span>, <span class="ruby-keyword kw">false</span>)
+157: <span class="ruby-keyword kw">elsif</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parent</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">&&</span>
+158: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">canInheritDate?</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-keyword kw">false</span>)
+159: <span class="ruby-identifier">propagateDate</span>(<span class="ruby-ivar">@project</span>[<span class="ruby-value str">'start'</span>], <span class="ruby-keyword kw">false</span>)
+160: <span class="ruby-keyword kw">end</span>
+161: <span class="ruby-keyword kw">end</span>
+162:
+163: <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@endPropagated</span>
+164: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@end</span>
+165: <span class="ruby-identifier">propagateDate</span>(<span class="ruby-ivar">@end</span>, <span class="ruby-keyword kw">true</span>)
+166: <span class="ruby-keyword kw">elsif</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parent</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">&&</span>
+167: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">canInheritDate?</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-keyword kw">true</span>)
+168: <span class="ruby-identifier">propagateDate</span>(<span class="ruby-ivar">@project</span>[<span class="ruby-value str">'end'</span>], <span class="ruby-keyword kw">true</span>)
+169: <span class="ruby-keyword kw">end</span>
+170: <span class="ruby-keyword kw">end</span>
+171: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -2758,22 +2822,22 @@
<div class="method-source-code"
id="query-complete-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1176</span>
-1176: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">query_complete</span>(<span class="ruby-identifier">query</span>)
-1177: <span class="ruby-comment cmt"># If we haven't calculated the value yet, calculate it first.</span>
-1178: <span class="ruby-keyword kw">unless</span> (<span class="ruby-identifier">complete</span> = <span class="ruby-identifier">a</span>(<span class="ruby-value str">'complete'</span>))
-1179: <span class="ruby-identifier">calcCompletion</span>
-1180: <span class="ruby-identifier">complete</span> = <span class="ruby-identifier">a</span>(<span class="ruby-value str">'complete'</span>)
-1181: <span class="ruby-keyword kw">end</span>
-1182:
-1183: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">sortable</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">numerical</span> = <span class="ruby-identifier">complete</span>
-1184: <span class="ruby-comment cmt"># For the string output, we only use integer numbers.</span>
-1185: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">string</span> = <span class="ruby-node">"#{complete.to_i}%"</span>
-1186: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1226</span>
+1226: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">query_complete</span>(<span class="ruby-identifier">query</span>)
+1227: <span class="ruby-comment cmt"># If we haven't calculated the value yet, calculate it first.</span>
+1228: <span class="ruby-keyword kw">unless</span> (<span class="ruby-identifier">complete</span> = <span class="ruby-ivar">@complete</span>)
+1229: <span class="ruby-identifier">calcCompletion</span>
+1230: <span class="ruby-identifier">complete</span> = <span class="ruby-ivar">@complete</span>
+1231: <span class="ruby-keyword kw">end</span>
+1232:
+1233: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">sortable</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">numerical</span> = <span class="ruby-identifier">complete</span>
+1234: <span class="ruby-comment cmt"># For the string output, we only use integer numbers.</span>
+1235: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">string</span> = <span class="ruby-node">"#{complete.to_i}%"</span>
+1236: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -2805,21 +2869,21 @@
<div class="method-source-code"
id="query-cost-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1191</span>
-1191: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">query_cost</span>(<span class="ruby-identifier">query</span>)
-1192: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">query</span>.<span class="ruby-identifier">costAccount</span>
-1193: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">sortable</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">numerical</span> = <span class="ruby-identifier">cost</span> =
-1194: <span class="ruby-identifier">turnover</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">endIdx</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">costAccount</span>,
-1195: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scopeProperty</span>)
-1196: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">string</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">currencyFormat</span>.<span class="ruby-identifier">format</span>(<span class="ruby-identifier">cost</span>)
-1197: <span class="ruby-keyword kw">else</span>
-1198: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">string</span> = <span class="ruby-value str">'No cost account'</span>
-1199: <span class="ruby-keyword kw">end</span>
-1200: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1241</span>
+1241: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">query_cost</span>(<span class="ruby-identifier">query</span>)
+1242: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">query</span>.<span class="ruby-identifier">costAccount</span>
+1243: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">sortable</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">numerical</span> = <span class="ruby-identifier">cost</span> =
+1244: <span class="ruby-identifier">turnover</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">endIdx</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">costAccount</span>,
+1245: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scopeProperty</span>)
+1246: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">string</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">currencyFormat</span>.<span class="ruby-identifier">format</span>(<span class="ruby-identifier">cost</span>)
+1247: <span class="ruby-keyword kw">else</span>
+1248: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">string</span> = <span class="ruby-value str">'No \balance\ defined!'</span>
+1249: <span class="ruby-keyword kw">end</span>
+1250: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -2849,16 +2913,16 @@
<div class="method-source-code"
id="query-duration-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1204</span>
-1204: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">query_duration</span>(<span class="ruby-identifier">query</span>)
-1205: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">sortable</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">numerical</span> = <span class="ruby-identifier">duration</span> =
-1206: (<span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>) <span class="ruby-operator">-</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>)) <span class="ruby-operator">/</span> (<span class="ruby-value">60</span> * <span class="ruby-value">60</span> * <span class="ruby-value">24</span>)
-1207: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">string</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scaleDuration</span>(<span class="ruby-identifier">duration</span>)
-1208: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1254</span>
+1254: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">query_duration</span>(<span class="ruby-identifier">query</span>)
+1255: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">sortable</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">numerical</span> = <span class="ruby-identifier">duration</span> =
+1256: (<span class="ruby-ivar">@end</span> <span class="ruby-operator">-</span> <span class="ruby-ivar">@start</span>) <span class="ruby-operator">/</span> (<span class="ruby-value">60</span> * <span class="ruby-value">60</span> * <span class="ruby-value">24</span>)
+1257: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">string</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scaleDuration</span>(<span class="ruby-identifier">duration</span>)
+1258: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -2889,16 +2953,16 @@
<div class="method-source-code"
id="query-effort-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1238</span>
-1238: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">query_effort</span>(<span class="ruby-identifier">query</span>)
-1239: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">sortable</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">numerical</span> = <span class="ruby-identifier">work</span> =
-1240: <span class="ruby-identifier">getEffectiveWork</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">endIdx</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scopeProperty</span>)
-1241: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">string</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scaleLoad</span>(<span class="ruby-identifier">work</span>)
-1242: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1288</span>
+1288: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">query_effort</span>(<span class="ruby-identifier">query</span>)
+1289: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">sortable</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">numerical</span> = <span class="ruby-identifier">work</span> =
+1290: <span class="ruby-identifier">getEffectiveWork</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">endIdx</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scopeProperty</span>)
+1291: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">string</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scaleLoad</span>(<span class="ruby-identifier">work</span>)
+1292: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -2930,19 +2994,19 @@
<div class="method-source-code"
id="query-effortdone-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1213</span>
-1213: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">query_effortdone</span>(<span class="ruby-identifier">query</span>)
-1214: <span class="ruby-comment cmt"># For this query, we always override the query period.</span>
-1215: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">sortable</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">numerical</span> = <span class="ruby-identifier">effort</span> =
-1216: <span class="ruby-identifier">getEffectiveWork</span>(<span class="ruby-ivar">@project</span>.<span class="ruby-identifier">dateToIdx</span>(<span class="ruby-ivar">@project</span>[<span class="ruby-value str">'start'</span>], <span class="ruby-keyword kw">false</span>),
-1217: <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">dateToIdx</span>(<span class="ruby-ivar">@project</span>[<span class="ruby-value str">'now'</span>]),
-1218: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scopeProperty</span>)
-1219: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">string</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scaleLoad</span>(<span class="ruby-identifier">effort</span>)
-1220: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1263</span>
+1263: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">query_effortdone</span>(<span class="ruby-identifier">query</span>)
+1264: <span class="ruby-comment cmt"># For this query, we always override the query period.</span>
+1265: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">sortable</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">numerical</span> = <span class="ruby-identifier">effort</span> =
+1266: <span class="ruby-identifier">getEffectiveWork</span>(<span class="ruby-ivar">@project</span>.<span class="ruby-identifier">dateToIdx</span>(<span class="ruby-ivar">@project</span>[<span class="ruby-value str">'start'</span>], <span class="ruby-keyword kw">false</span>),
+1267: <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">dateToIdx</span>(<span class="ruby-ivar">@project</span>[<span class="ruby-value str">'now'</span>]),
+1268: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scopeProperty</span>)
+1269: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">string</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scaleLoad</span>(<span class="ruby-identifier">effort</span>)
+1270: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -2974,19 +3038,19 @@
<div class="method-source-code"
id="query-effortleft-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1226</span>
-1226: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">query_effortleft</span>(<span class="ruby-identifier">query</span>)
-1227: <span class="ruby-comment cmt"># For this query, we always override the query period.</span>
-1228: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">sortable</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">numerical</span> = <span class="ruby-identifier">effort</span> =
-1229: <span class="ruby-identifier">getEffectiveWork</span>(<span class="ruby-ivar">@project</span>.<span class="ruby-identifier">dateToIdx</span>(<span class="ruby-ivar">@project</span>[<span class="ruby-value str">'now'</span>]),
-1230: <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">dateToIdx</span>(<span class="ruby-ivar">@project</span>[<span class="ruby-value str">'end'</span>], <span class="ruby-keyword kw">false</span>),
-1231: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scopeProperty</span>)
-1232: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">string</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scaleLoad</span>(<span class="ruby-identifier">effort</span>)
-1233: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1276</span>
+1276: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">query_effortleft</span>(<span class="ruby-identifier">query</span>)
+1277: <span class="ruby-comment cmt"># For this query, we always override the query period.</span>
+1278: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">sortable</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">numerical</span> = <span class="ruby-identifier">effort</span> =
+1279: <span class="ruby-identifier">getEffectiveWork</span>(<span class="ruby-ivar">@project</span>.<span class="ruby-identifier">dateToIdx</span>(<span class="ruby-ivar">@project</span>[<span class="ruby-value str">'now'</span>]),
+1280: <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">dateToIdx</span>(<span class="ruby-ivar">@project</span>[<span class="ruby-value str">'end'</span>], <span class="ruby-keyword kw">false</span>),
+1281: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scopeProperty</span>)
+1282: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">string</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scaleLoad</span>(<span class="ruby-identifier">effort</span>)
+1283: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -3013,39 +3077,39 @@
<div class="method-source-code"
id="query-followers-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1244</span>
-1244: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">query_followers</span>(<span class="ruby-identifier">query</span>)
-1245: <span class="ruby-identifier">list</span> = []
-1246:
-1247: <span class="ruby-comment cmt"># First gather the task that depend on the start of this task.</span>
-1248: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'startsuccs'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
-1249: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">onEnd</span>
-1250: <span class="ruby-identifier">date</span> = <span class="ruby-identifier">task</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scenarioIdx</span>].<span class="ruby-identifier">to_s</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">timeFormat</span>)
-1251: <span class="ruby-identifier">dep</span> = <span class="ruby-value str">"[->]"</span>
-1252: <span class="ruby-keyword kw">else</span>
-1253: <span class="ruby-identifier">date</span> = <span class="ruby-identifier">task</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scenarioIdx</span>].<span class="ruby-identifier">to_s</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">timeFormat</span>)
-1254: <span class="ruby-identifier">dep</span> = <span class="ruby-value str">"[->["</span>
-1255: <span class="ruby-keyword kw">end</span>
-1256: <span class="ruby-identifier">list</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">generateDepencyListItem</span>(<span class="ruby-identifier">query</span>, <span class="ruby-identifier">task</span>, <span class="ruby-identifier">dep</span>, <span class="ruby-identifier">date</span>)
-1257: <span class="ruby-keyword kw">end</span>
-1258: <span class="ruby-comment cmt"># Than add the tasks that depend on the end of this task.</span>
-1259: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'endsuccs'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
-1260: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">onEnd</span>
-1261: <span class="ruby-identifier">date</span> = <span class="ruby-identifier">task</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scenarioIdx</span>].<span class="ruby-identifier">to_s</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">timeFormat</span>)
-1262: <span class="ruby-identifier">dep</span> = <span class="ruby-value str">"]->]"</span>
-1263: <span class="ruby-keyword kw">else</span>
-1264: <span class="ruby-identifier">date</span> = <span class="ruby-identifier">task</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scenarioIdx</span>].<span class="ruby-identifier">to_s</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">timeFormat</span>)
-1265: <span class="ruby-identifier">dep</span> = <span class="ruby-value str">"]->["</span>
-1266: <span class="ruby-keyword kw">end</span>
-1267: <span class="ruby-identifier">list</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">generateDepencyListItem</span>(<span class="ruby-identifier">query</span>, <span class="ruby-identifier">task</span>, <span class="ruby-identifier">dep</span>, <span class="ruby-identifier">date</span>)
-1268: <span class="ruby-keyword kw">end</span>
-1269:
-1270: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">assignList</span>(<span class="ruby-identifier">list</span>)
-1271: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1294</span>
+1294: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">query_followers</span>(<span class="ruby-identifier">query</span>)
+1295: <span class="ruby-identifier">list</span> = []
+1296:
+1297: <span class="ruby-comment cmt"># First gather the task that depend on the start of this task.</span>
+1298: <span class="ruby-ivar">@startsuccs</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
+1299: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">onEnd</span>
+1300: <span class="ruby-identifier">date</span> = <span class="ruby-identifier">task</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scenarioIdx</span>].<span class="ruby-identifier">to_s</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">timeFormat</span>)
+1301: <span class="ruby-identifier">dep</span> = <span class="ruby-value str">"[->]"</span>
+1302: <span class="ruby-keyword kw">else</span>
+1303: <span class="ruby-identifier">date</span> = <span class="ruby-identifier">task</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scenarioIdx</span>].<span class="ruby-identifier">to_s</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">timeFormat</span>)
+1304: <span class="ruby-identifier">dep</span> = <span class="ruby-value str">"[->["</span>
+1305: <span class="ruby-keyword kw">end</span>
+1306: <span class="ruby-identifier">list</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">generateDepencyListItem</span>(<span class="ruby-identifier">query</span>, <span class="ruby-identifier">task</span>, <span class="ruby-identifier">dep</span>, <span class="ruby-identifier">date</span>)
+1307: <span class="ruby-keyword kw">end</span>
+1308: <span class="ruby-comment cmt"># Than add the tasks that depend on the end of this task.</span>
+1309: <span class="ruby-ivar">@endsuccs</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
+1310: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">onEnd</span>
+1311: <span class="ruby-identifier">date</span> = <span class="ruby-identifier">task</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scenarioIdx</span>].<span class="ruby-identifier">to_s</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">timeFormat</span>)
+1312: <span class="ruby-identifier">dep</span> = <span class="ruby-value str">"]->]"</span>
+1313: <span class="ruby-keyword kw">else</span>
+1314: <span class="ruby-identifier">date</span> = <span class="ruby-identifier">task</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scenarioIdx</span>].<span class="ruby-identifier">to_s</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">timeFormat</span>)
+1315: <span class="ruby-identifier">dep</span> = <span class="ruby-value str">"]->["</span>
+1316: <span class="ruby-keyword kw">end</span>
+1317: <span class="ruby-identifier">list</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">generateDepencyListItem</span>(<span class="ruby-identifier">query</span>, <span class="ruby-identifier">task</span>, <span class="ruby-identifier">dep</span>, <span class="ruby-identifier">date</span>)
+1318: <span class="ruby-keyword kw">end</span>
+1319:
+1320: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">assignList</span>(<span class="ruby-identifier">list</span>)
+1321: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -3072,21 +3136,21 @@
<div class="method-source-code"
id="query-inputs-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1351</span>
-1351: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">query_inputs</span>(<span class="ruby-identifier">query</span>)
-1352: <span class="ruby-identifier">inputList</span> = <span class="ruby-constant">PropertyList</span>.<span class="ruby-identifier">new</span>(<span class="ruby-ivar">@project</span>.<span class="ruby-identifier">tasks</span>, <span class="ruby-keyword kw">false</span>)
-1353: <span class="ruby-identifier">inputs</span>(<span class="ruby-identifier">inputList</span>, <span class="ruby-keyword kw">true</span>)
-1354: <span class="ruby-identifier">inputList</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-ivar">@property</span>)
-1355: <span class="ruby-identifier">inputList</span>.<span class="ruby-identifier">setSorting</span>([[<span class="ruby-value str">'start'</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-ivar">@scenarioIdx</span>],
-1356: [<span class="ruby-value str">'seqno'</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-value">1</span> ]])
-1357: <span class="ruby-identifier">inputList</span>.<span class="ruby-identifier">sort!</span>
-1358:
-1359: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">assignList</span>(<span class="ruby-identifier">generateTaskList</span>(<span class="ruby-identifier">inputList</span>, <span class="ruby-identifier">query</span>))
-1360: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1402</span>
+1402: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">query_inputs</span>(<span class="ruby-identifier">query</span>)
+1403: <span class="ruby-identifier">inputList</span> = <span class="ruby-constant">PropertyList</span>.<span class="ruby-identifier">new</span>(<span class="ruby-ivar">@project</span>.<span class="ruby-identifier">tasks</span>, <span class="ruby-keyword kw">false</span>)
+1404: <span class="ruby-identifier">inputs</span>(<span class="ruby-identifier">inputList</span>, <span class="ruby-keyword kw">true</span>)
+1405: <span class="ruby-identifier">inputList</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-ivar">@property</span>)
+1406: <span class="ruby-identifier">inputList</span>.<span class="ruby-identifier">setSorting</span>([[<span class="ruby-value str">'start'</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-ivar">@scenarioIdx</span>],
+1407: [<span class="ruby-value str">'seqno'</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-value">1</span> ]])
+1408: <span class="ruby-identifier">inputList</span>.<span class="ruby-identifier">sort!</span>
+1409:
+1410: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">assignList</span>(<span class="ruby-identifier">generateTaskList</span>(<span class="ruby-identifier">inputList</span>, <span class="ruby-identifier">query</span>))
+1411: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -3113,39 +3177,39 @@
<div class="method-source-code"
id="query-precursors-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1273</span>
-1273: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">query_precursors</span>(<span class="ruby-identifier">query</span>)
-1274: <span class="ruby-identifier">list</span> = []
-1275:
-1276: <span class="ruby-comment cmt"># First gather the task that depend on the start of this task.</span>
-1277: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'startpreds'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
-1278: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">onEnd</span>
-1279: <span class="ruby-identifier">date</span> = <span class="ruby-identifier">task</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scenarioIdx</span>].<span class="ruby-identifier">to_s</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">timeFormat</span>)
-1280: <span class="ruby-identifier">dep</span> = <span class="ruby-value str">"]->["</span>
-1281: <span class="ruby-keyword kw">else</span>
-1282: <span class="ruby-identifier">date</span> = <span class="ruby-identifier">task</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scenarioIdx</span>].<span class="ruby-identifier">to_s</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">timeFormat</span>)
-1283: <span class="ruby-identifier">dep</span> = <span class="ruby-value str">"[->["</span>
-1284: <span class="ruby-keyword kw">end</span>
-1285: <span class="ruby-identifier">list</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">generateDepencyListItem</span>(<span class="ruby-identifier">query</span>, <span class="ruby-identifier">task</span>, <span class="ruby-identifier">dep</span>, <span class="ruby-identifier">date</span>)
-1286: <span class="ruby-keyword kw">end</span>
-1287: <span class="ruby-comment cmt"># Than add the tasks that depend on the end of this task.</span>
-1288: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'endpreds'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
-1289: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">onEnd</span>
-1290: <span class="ruby-identifier">date</span> = <span class="ruby-identifier">task</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scenarioIdx</span>].<span class="ruby-identifier">to_s</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">timeFormat</span>)
-1291: <span class="ruby-identifier">dep</span> = <span class="ruby-value str">"]->]"</span>
-1292: <span class="ruby-keyword kw">else</span>
-1293: <span class="ruby-identifier">date</span> = <span class="ruby-identifier">task</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scenarioIdx</span>].<span class="ruby-identifier">to_s</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">timeFormat</span>)
-1294: <span class="ruby-identifier">dep</span> = <span class="ruby-value str">"[->]"</span>
-1295: <span class="ruby-keyword kw">end</span>
-1296: <span class="ruby-identifier">list</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">generateDepencyListItem</span>(<span class="ruby-identifier">query</span>, <span class="ruby-identifier">task</span>, <span class="ruby-identifier">dep</span>, <span class="ruby-identifier">date</span>)
-1297: <span class="ruby-keyword kw">end</span>
-1298:
-1299: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">assignList</span>(<span class="ruby-identifier">list</span>)
-1300: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1323</span>
+1323: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">query_precursors</span>(<span class="ruby-identifier">query</span>)
+1324: <span class="ruby-identifier">list</span> = []
+1325:
+1326: <span class="ruby-comment cmt"># First gather the task that depend on the start of this task.</span>
+1327: <span class="ruby-ivar">@startpreds</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
+1328: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">onEnd</span>
+1329: <span class="ruby-identifier">date</span> = <span class="ruby-identifier">task</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scenarioIdx</span>].<span class="ruby-identifier">to_s</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">timeFormat</span>)
+1330: <span class="ruby-identifier">dep</span> = <span class="ruby-value str">"]->["</span>
+1331: <span class="ruby-keyword kw">else</span>
+1332: <span class="ruby-identifier">date</span> = <span class="ruby-identifier">task</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scenarioIdx</span>].<span class="ruby-identifier">to_s</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">timeFormat</span>)
+1333: <span class="ruby-identifier">dep</span> = <span class="ruby-value str">"[->["</span>
+1334: <span class="ruby-keyword kw">end</span>
+1335: <span class="ruby-identifier">list</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">generateDepencyListItem</span>(<span class="ruby-identifier">query</span>, <span class="ruby-identifier">task</span>, <span class="ruby-identifier">dep</span>, <span class="ruby-identifier">date</span>)
+1336: <span class="ruby-keyword kw">end</span>
+1337: <span class="ruby-comment cmt"># Than add the tasks that depend on the end of this task.</span>
+1338: <span class="ruby-ivar">@endpreds</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
+1339: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">onEnd</span>
+1340: <span class="ruby-identifier">date</span> = <span class="ruby-identifier">task</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scenarioIdx</span>].<span class="ruby-identifier">to_s</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">timeFormat</span>)
+1341: <span class="ruby-identifier">dep</span> = <span class="ruby-value str">"]->]"</span>
+1342: <span class="ruby-keyword kw">else</span>
+1343: <span class="ruby-identifier">date</span> = <span class="ruby-identifier">task</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scenarioIdx</span>].<span class="ruby-identifier">to_s</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">timeFormat</span>)
+1344: <span class="ruby-identifier">dep</span> = <span class="ruby-value str">"[->]"</span>
+1345: <span class="ruby-keyword kw">end</span>
+1346: <span class="ruby-identifier">list</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">generateDepencyListItem</span>(<span class="ruby-identifier">query</span>, <span class="ruby-identifier">task</span>, <span class="ruby-identifier">dep</span>, <span class="ruby-identifier">date</span>)
+1347: <span class="ruby-keyword kw">end</span>
+1348:
+1349: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">assignList</span>(<span class="ruby-identifier">list</span>)
+1350: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -3175,33 +3239,34 @@
<div class="method-source-code"
id="query-resources-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1304</span>
-1304: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">query_resources</span>(<span class="ruby-identifier">query</span>)
-1305: <span class="ruby-keyword kw">return</span> <span class="ruby-value str">''</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">leaf?</span>
-1306:
-1307: <span class="ruby-identifier">list</span> = []
-1308: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'assignedresources'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resource</span><span class="ruby-operator">|</span>
-1309: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">resource</span>.<span class="ruby-identifier">allocated?</span>(<span class="ruby-ivar">@scenarioIdx</span>,
-1310: <span class="ruby-constant">Interval</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">start</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">end</span>), <span class="ruby-ivar">@property</span>)
-1311: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">query</span>.<span class="ruby-identifier">listItem</span>
-1312: <span class="ruby-identifier">rti</span> = <span class="ruby-constant">RichText</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">listItem</span>, <span class="ruby-constant">RTFHandlers</span>.<span class="ruby-identifier">create</span>(<span class="ruby-ivar">@project</span>),
-1313: <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">messageHandler</span>).
-1314: <span class="ruby-identifier">generateIntermediateFormat</span>
-1315: <span class="ruby-identifier">q</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">dup</span>
-1316: <span class="ruby-identifier">q</span>.<span class="ruby-identifier">property</span> = <span class="ruby-identifier">resource</span>
-1317: <span class="ruby-identifier">rti</span>.<span class="ruby-identifier">setQuery</span>(<span class="ruby-identifier">q</span>)
-1318: <span class="ruby-identifier">list</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"<nowiki>#{rti.to_s}</nowiki>"</span>
-1319: <span class="ruby-keyword kw">else</span>
-1320: <span class="ruby-identifier">list</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"<nowiki>#{resource.name} (#{resource.fullId})</nowiki>"</span>
-1321: <span class="ruby-keyword kw">end</span>
-1322: <span class="ruby-keyword kw">end</span>
-1323: <span class="ruby-keyword kw">end</span>
-1324: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">assignList</span>(<span class="ruby-identifier">list</span>)
-1325: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1354</span>
+1354: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">query_resources</span>(<span class="ruby-identifier">query</span>)
+1355: <span class="ruby-keyword kw">return</span> <span class="ruby-value str">''</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">leaf?</span>
+1356:
+1357: <span class="ruby-identifier">list</span> = []
+1358: <span class="ruby-ivar">@assignedresources</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resource</span><span class="ruby-operator">|</span>
+1359: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">resource</span>.<span class="ruby-identifier">allocated?</span>(<span class="ruby-ivar">@scenarioIdx</span>,
+1360: <span class="ruby-constant">TimeInterval</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">start</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">end</span>),
+1361: <span class="ruby-ivar">@property</span>)
+1362: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">query</span>.<span class="ruby-identifier">listItem</span>
+1363: <span class="ruby-identifier">rti</span> = <span class="ruby-constant">RichText</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">listItem</span>, <span class="ruby-constant">RTFHandlers</span>.<span class="ruby-identifier">create</span>(<span class="ruby-ivar">@project</span>),
+1364: <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">messageHandler</span>).
+1365: <span class="ruby-identifier">generateIntermediateFormat</span>
+1366: <span class="ruby-identifier">q</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">dup</span>
+1367: <span class="ruby-identifier">q</span>.<span class="ruby-identifier">property</span> = <span class="ruby-identifier">resource</span>
+1368: <span class="ruby-identifier">rti</span>.<span class="ruby-identifier">setQuery</span>(<span class="ruby-identifier">q</span>)
+1369: <span class="ruby-identifier">list</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"<nowiki>#{rti.to_s}</nowiki>"</span>
+1370: <span class="ruby-keyword kw">else</span>
+1371: <span class="ruby-identifier">list</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"<nowiki>#{resource.name} (#{resource.fullId})</nowiki>"</span>
+1372: <span class="ruby-keyword kw">end</span>
+1373: <span class="ruby-keyword kw">end</span>
+1374: <span class="ruby-keyword kw">end</span>
+1375: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">assignList</span>(<span class="ruby-identifier">list</span>)
+1376: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -3233,21 +3298,21 @@
<div class="method-source-code"
id="query-revenue-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1330</span>
-1330: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">query_revenue</span>(<span class="ruby-identifier">query</span>)
-1331: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">query</span>.<span class="ruby-identifier">revenueAccount</span>
-1332: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">sortable</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">numerical</span> = <span class="ruby-identifier">revenue</span> =
-1333: <span class="ruby-identifier">turnover</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">endIdx</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">revenueAccount</span>,
-1334: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scopeProperty</span>)
-1335: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">string</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">currencyFormat</span>.<span class="ruby-identifier">format</span>(<span class="ruby-identifier">revenue</span>)
-1336: <span class="ruby-keyword kw">else</span>
-1337: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">string</span> = <span class="ruby-value str">'No revenue account'</span>
-1338: <span class="ruby-keyword kw">end</span>
-1339: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1381</span>
+1381: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">query_revenue</span>(<span class="ruby-identifier">query</span>)
+1382: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">query</span>.<span class="ruby-identifier">revenueAccount</span>
+1383: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">sortable</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">numerical</span> = <span class="ruby-identifier">revenue</span> =
+1384: <span class="ruby-identifier">turnover</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">endIdx</span>, <span class="ruby-identifier">query</span>.<span class="ruby-identifier">revenueAccount</span>,
+1385: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scopeProperty</span>)
+1386: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">string</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">currencyFormat</span>.<span class="ruby-identifier">format</span>(<span class="ruby-identifier">revenue</span>)
+1387: <span class="ruby-keyword kw">else</span>
+1388: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">string</span> = <span class="ruby-value str">'No \balance\ defined!'</span>
+1389: <span class="ruby-keyword kw">end</span>
+1390: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -3274,20 +3339,20 @@
<div class="method-source-code"
id="query-status-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1341</span>
-1341: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">query_status</span>(<span class="ruby-identifier">query</span>)
-1342: <span class="ruby-comment cmt"># If we haven't calculated the completion yet, calculate it first.</span>
-1343: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">status</span> = <span class="ruby-identifier">a</span>(<span class="ruby-value str">'status'</span>)).<span class="ruby-identifier">empty?</span>
-1344: <span class="ruby-identifier">calcCompletion</span>
-1345: <span class="ruby-identifier">status</span> = <span class="ruby-identifier">a</span>(<span class="ruby-value str">'status'</span>)
-1346: <span class="ruby-keyword kw">end</span>
-1347:
-1348: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">string</span> = <span class="ruby-identifier">status</span>
-1349: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1392</span>
+1392: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">query_status</span>(<span class="ruby-identifier">query</span>)
+1393: <span class="ruby-comment cmt"># If we haven't calculated the completion yet, calculate it first.</span>
+1394: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">status</span> = <span class="ruby-ivar">@status</span>).<span class="ruby-identifier">empty?</span>
+1395: <span class="ruby-identifier">calcCompletion</span>
+1396: <span class="ruby-identifier">status</span> = <span class="ruby-ivar">@status</span>
+1397: <span class="ruby-keyword kw">end</span>
+1398:
+1399: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">string</span> = <span class="ruby-identifier">status</span>
+1400: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -3314,21 +3379,21 @@
<div class="method-source-code"
id="query-targets-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1362</span>
-1362: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">query_targets</span>(<span class="ruby-identifier">query</span>)
-1363: <span class="ruby-identifier">targetList</span> = <span class="ruby-constant">PropertyList</span>.<span class="ruby-identifier">new</span>(<span class="ruby-ivar">@project</span>.<span class="ruby-identifier">tasks</span>, <span class="ruby-keyword kw">false</span>)
-1364: <span class="ruby-identifier">targets</span>(<span class="ruby-identifier">targetList</span>, <span class="ruby-keyword kw">true</span>)
-1365: <span class="ruby-identifier">targetList</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-ivar">@property</span>)
-1366: <span class="ruby-identifier">targetList</span>.<span class="ruby-identifier">setSorting</span>([[<span class="ruby-value str">'start'</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-ivar">@scenarioIdx</span>],
-1367: [<span class="ruby-value str">'seqno'</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-value">1</span> ]])
-1368: <span class="ruby-identifier">targetList</span>.<span class="ruby-identifier">sort!</span>
-1369:
-1370: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">assignList</span>(<span class="ruby-identifier">generateTaskList</span>(<span class="ruby-identifier">targetList</span>, <span class="ruby-identifier">query</span>))
-1371: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1413</span>
+1413: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">query_targets</span>(<span class="ruby-identifier">query</span>)
+1414: <span class="ruby-identifier">targetList</span> = <span class="ruby-constant">PropertyList</span>.<span class="ruby-identifier">new</span>(<span class="ruby-ivar">@project</span>.<span class="ruby-identifier">tasks</span>, <span class="ruby-keyword kw">false</span>)
+1415: <span class="ruby-identifier">targets</span>(<span class="ruby-identifier">targetList</span>, <span class="ruby-keyword kw">true</span>)
+1416: <span class="ruby-identifier">targetList</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-ivar">@property</span>)
+1417: <span class="ruby-identifier">targetList</span>.<span class="ruby-identifier">setSorting</span>([[<span class="ruby-value str">'start'</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-ivar">@scenarioIdx</span>],
+1418: [<span class="ruby-value str">'seqno'</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-value">1</span> ]])
+1419: <span class="ruby-identifier">targetList</span>.<span class="ruby-identifier">sort!</span>
+1420:
+1421: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">assignList</span>(<span class="ruby-identifier">generateTaskList</span>(<span class="ruby-identifier">targetList</span>, <span class="ruby-identifier">query</span>))
+1422: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -3358,22 +3423,22 @@
<div class="method-source-code"
id="ready-or-cheduling--source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 832</span>
-832: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">readyForScheduling?</span>
-833: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'scheduled'</span>) <span class="ruby-operator">||</span> <span class="ruby-ivar">@isRunAway</span>
-834:
-835: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'forward'</span>)
-836: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>) <span class="ruby-operator">&&</span> (<span class="ruby-identifier">hasDurationSpec?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>))
-837: <span class="ruby-keyword kw">else</span>
-838: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>) <span class="ruby-operator">&&</span> (<span class="ruby-identifier">hasDurationSpec?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>))
-839: <span class="ruby-keyword kw">end</span>
-840:
-841: <span class="ruby-keyword kw">false</span>
-842: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 874</span>
+874: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">readyForScheduling?</span>
+875: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@scheduled</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@isRunAway</span>
+876:
+877: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@forward</span>
+878: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@start</span> <span class="ruby-operator">&&</span> (<span class="ruby-identifier">hasDurationSpec?</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@end</span>)
+879: <span class="ruby-keyword kw">else</span>
+880: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@end</span> <span class="ruby-operator">&&</span> (<span class="ruby-identifier">hasDurationSpec?</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@start</span>)
+881: <span class="ruby-keyword kw">end</span>
+882:
+883: <span class="ruby-keyword kw">false</span>
+884: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -3400,14 +3465,14 @@
<div class="method-source-code"
id="reset-oop-lags-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 534</span>
-534: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">resetLoopFlags</span>
-535: <span class="ruby-ivar">@deadEndFlags</span> = <span class="ruby-constant">Array</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value">4</span>, <span class="ruby-keyword kw">false</span>)
-536: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 576</span>
+576: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">resetLoopFlags</span>
+577: <span class="ruby-ivar">@deadEndFlags</span> = <span class="ruby-constant">Array</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value">4</span>, <span class="ruby-keyword kw">false</span>)
+578: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -3439,42 +3504,50 @@
<div class="method-source-code"
id="schedule-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 848</span>
-848: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">schedule</span>
-849: <span class="ruby-comment cmt"># Is the task scheduled from start to end or vice versa?</span>
-850: <span class="ruby-identifier">forward</span> = <span class="ruby-identifier">a</span>(<span class="ruby-value str">'forward'</span>)
-851: <span class="ruby-comment cmt"># The task may not excede the project interval.</span>
-852: <span class="ruby-identifier">limit</span> = <span class="ruby-ivar">@project</span>[<span class="ruby-identifier">forward</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'end'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'start'</span>]
-853: <span class="ruby-comment cmt"># Number of seconds per time slot.</span>
-854: <span class="ruby-identifier">slotDuration</span> = <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'scheduleGranularity'</span>]
-855: <span class="ruby-identifier">slot</span> = <span class="ruby-identifier">nextSlot</span>(<span class="ruby-identifier">slotDuration</span>)
-856:
-857: <span class="ruby-comment cmt"># Schedule all time slots from slot in the scheduling direction until</span>
-858: <span class="ruby-comment cmt"># the task is completed or a problem has been found.</span>
-859: <span class="ruby-keyword kw">while</span> <span class="ruby-operator">!</span><span class="ruby-identifier">scheduleSlot</span>(<span class="ruby-identifier">slot</span>, <span class="ruby-identifier">slotDuration</span>)
-860: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">forward</span>
-861: <span class="ruby-comment cmt"># The task is scheduled from start to end.</span>
-862: <span class="ruby-identifier">slot</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">slotDuration</span>
-863: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">slot</span> <span class="ruby-operator">></span> <span class="ruby-identifier">limit</span>
-864: <span class="ruby-identifier">markAsRunaway</span>
-865: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
-866: <span class="ruby-keyword kw">end</span>
-867: <span class="ruby-keyword kw">else</span>
-868: <span class="ruby-comment cmt"># The task is scheduled from end to start.</span>
-869: <span class="ruby-identifier">slot</span> <span class="ruby-operator">-=</span> <span class="ruby-identifier">slotDuration</span>
-870: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">slot</span> <span class="ruby-operator"><</span> <span class="ruby-identifier">limit</span>
-871: <span class="ruby-identifier">markAsRunaway</span>
-872: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
-873: <span class="ruby-keyword kw">end</span>
-874: <span class="ruby-keyword kw">end</span>
-875: <span class="ruby-keyword kw">end</span>
-876:
-877: <span class="ruby-keyword kw">true</span>
-878: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 890</span>
+890: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">schedule</span>
+891: <span class="ruby-comment cmt"># Compute the date of the next slot this task wants to have scheduled.</span>
+892: <span class="ruby-comment cmt"># This must either be the first slot ever or it must be directly</span>
+893: <span class="ruby-comment cmt"># adjecent to the previous slot. If this task has not yet been scheduled</span>
+894: <span class="ruby-comment cmt"># at all, @currentSlotIdx is still nil. Otherwise it contains the index</span>
+895: <span class="ruby-comment cmt"># of the last scheduled slot.</span>
+896: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@forward</span>
+897: <span class="ruby-comment cmt"># On first call, the @currentSlotIdx is not set yet. We set it to the</span>
+898: <span class="ruby-comment cmt"># start slot index or the 'now' slot if we are in projection mode and</span>
+899: <span class="ruby-comment cmt"># the tasks has allocations.</span>
+900: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@currentSlotIdx</span>.<span class="ruby-identifier">nil?</span>
+901: <span class="ruby-ivar">@currentSlotIdx</span> = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">dateToIdx</span>(
+902: <span class="ruby-ivar">@projectionMode</span> <span class="ruby-operator">&&</span> (<span class="ruby-ivar">@project</span>[<span class="ruby-value str">'now'</span>] <span class="ruby-operator">></span> <span class="ruby-ivar">@start</span>) <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@allocate</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-operator">?</span>
+903: <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'now'</span>] <span class="ruby-operator">:</span> <span class="ruby-ivar">@start</span>)
+904: <span class="ruby-keyword kw">end</span>
+905: <span class="ruby-keyword kw">else</span>
+906: <span class="ruby-comment cmt"># On first call, the @currentSlotIdx is not set yet. We set it to the</span>
+907: <span class="ruby-comment cmt"># slot index of the slot before the end slot.</span>
+908: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@currentSlotIdx</span>.<span class="ruby-identifier">nil?</span>
+909: <span class="ruby-ivar">@currentSlotIdx</span> = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">dateToIdx</span>(<span class="ruby-ivar">@end</span>) <span class="ruby-operator">-</span> <span class="ruby-value">1</span>
+910: <span class="ruby-keyword kw">end</span>
+911: <span class="ruby-keyword kw">end</span>
+912:
+913: <span class="ruby-comment cmt"># Schedule all time slots from slot in the scheduling direction until</span>
+914: <span class="ruby-comment cmt"># the task is completed or a problem has been found.</span>
+915: <span class="ruby-comment cmt"># The task may not excede the project interval.</span>
+916: <span class="ruby-identifier">lowerLimit</span> = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">dateToIdx</span>(<span class="ruby-ivar">@project</span>[<span class="ruby-value str">'start'</span>])
+917: <span class="ruby-identifier">upperLimit</span> = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">dateToIdx</span>(<span class="ruby-ivar">@project</span>[<span class="ruby-value str">'end'</span>])
+918: <span class="ruby-identifier">delta</span> = <span class="ruby-ivar">@forward</span> <span class="ruby-operator">?</span> <span class="ruby-value">1</span> <span class="ruby-operator">:</span> <span class="ruby-value">1</span>
+919: <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">scheduleSlot</span>
+920: <span class="ruby-ivar">@currentSlotIdx</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">delta</span>
+921: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@currentSlotIdx</span> <span class="ruby-operator"><</span> <span class="ruby-identifier">lowerLimit</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">upperLimit</span> <span class="ruby-operator"><</span> <span class="ruby-ivar">@currentSlotIdx</span>
+922: <span class="ruby-identifier">markAsRunaway</span>
+923: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
+924: <span class="ruby-keyword kw">end</span>
+925: <span class="ruby-keyword kw">end</span>
+926:
+927: <span class="ruby-keyword kw">true</span>
+928: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -3504,54 +3577,54 @@
<div class="method-source-code"
id="schedule-ontainer-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1007</span>
-1007: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">scheduleContainer</span>
-1008: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'scheduled'</span>) <span class="ruby-operator">||</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@property</span>.<span class="ruby-identifier">container?</span>
-1009:
-1010: <span class="ruby-identifier">nStart</span> = <span class="ruby-keyword kw">nil</span>
-1011: <span class="ruby-identifier">nEnd</span> = <span class="ruby-keyword kw">nil</span>
-1012:
-1013: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">kids</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span><span class="ruby-operator">|</span>
-1014: <span class="ruby-comment cmt"># Abort if a child has not yet been scheduled. Since we haven't done</span>
-1015: <span class="ruby-comment cmt"># the consistency check yet, we can't rely on start and end being set</span>
-1016: <span class="ruby-comment cmt"># if 'scheduled' is set.</span>
-1017: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> (<span class="ruby-operator">!</span><span class="ruby-identifier">task</span>[<span class="ruby-value str">'scheduled'</span>, <span class="ruby-ivar">@scenarioIdx</span>] <span class="ruby-operator">||</span>
-1018: <span class="ruby-identifier">task</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span>
-1019: <span class="ruby-identifier">task</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">nil?</span>)
-1020:
-1021: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">nStart</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">task</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>] <span class="ruby-operator"><</span> <span class="ruby-identifier">nStart</span>
-1022: <span class="ruby-identifier">nStart</span> = <span class="ruby-identifier">task</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
-1023: <span class="ruby-keyword kw">end</span>
-1024: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">nEnd</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">task</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-ivar">@scenarioIdx</span>] <span class="ruby-operator">></span> <span class="ruby-identifier">nEnd</span>
-1025: <span class="ruby-identifier">nEnd</span> = <span class="ruby-identifier">task</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
-1026: <span class="ruby-keyword kw">end</span>
-1027: <span class="ruby-keyword kw">end</span>
-1028:
-1029: <span class="ruby-identifier">startSet</span> = <span class="ruby-identifier">endSet</span> = <span class="ruby-keyword kw">false</span>
-1030: <span class="ruby-comment cmt"># Propagate the dates to other dependent tasks.</span>
-1031: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>).<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>) <span class="ruby-operator">></span> <span class="ruby-identifier">nStart</span>
-1032: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = <span class="ruby-identifier">nStart</span>
-1033: <span class="ruby-identifier">startSet</span> = <span class="ruby-keyword kw">true</span>
-1034: <span class="ruby-keyword kw">end</span>
-1035: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>).<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>) <span class="ruby-operator"><</span> <span class="ruby-identifier">nEnd</span>
-1036: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = <span class="ruby-identifier">nEnd</span>
-1037: <span class="ruby-identifier">endSet</span> = <span class="ruby-keyword kw">true</span>
-1038: <span class="ruby-keyword kw">end</span>
-1039: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>) <span class="ruby-operator">&&</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>)
-1040: <span class="ruby-identifier">raise</span> <span class="ruby-node">"Start (#{a('start')}) and end (#{a('end')}) must be set"</span>
-1041: <span class="ruby-keyword kw">end</span>
-1042: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'scheduled'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = <span class="ruby-keyword kw">true</span>
-1043: <span class="ruby-constant">Log</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"Container task #{@property.fullId} completed: #{a('start')} -> #{a('end')}"</span>
-1044:
-1045: <span class="ruby-comment cmt"># If we have modified the start or end date, we need to communicate this</span>
-1046: <span class="ruby-comment cmt"># new date to surrounding tasks.</span>
-1047: <span class="ruby-identifier">propagateDate</span>(<span class="ruby-identifier">nStart</span>, <span class="ruby-keyword kw">false</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">startSet</span>
-1048: <span class="ruby-identifier">propagateDate</span>(<span class="ruby-identifier">nEnd</span>, <span class="ruby-keyword kw">true</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">endSet</span>
-1049: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1057</span>
+1057: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">scheduleContainer</span>
+1058: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@scheduled</span> <span class="ruby-operator">||</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@property</span>.<span class="ruby-identifier">container?</span>
+1059:
+1060: <span class="ruby-identifier">nStart</span> = <span class="ruby-keyword kw">nil</span>
+1061: <span class="ruby-identifier">nEnd</span> = <span class="ruby-keyword kw">nil</span>
+1062:
+1063: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">kids</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span><span class="ruby-operator">|</span>
+1064: <span class="ruby-comment cmt"># Abort if a child has not yet been scheduled. Since we haven't done</span>
+1065: <span class="ruby-comment cmt"># the consistency check yet, we can't rely on start and end being set</span>
+1066: <span class="ruby-comment cmt"># if 'scheduled' is set.</span>
+1067: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> (<span class="ruby-operator">!</span><span class="ruby-identifier">task</span>[<span class="ruby-value str">'scheduled'</span>, <span class="ruby-ivar">@scenarioIdx</span>] <span class="ruby-operator">||</span>
+1068: <span class="ruby-identifier">task</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span>
+1069: <span class="ruby-identifier">task</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">nil?</span>)
+1070:
+1071: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">nStart</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">task</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>] <span class="ruby-operator"><</span> <span class="ruby-identifier">nStart</span>
+1072: <span class="ruby-identifier">nStart</span> = <span class="ruby-identifier">task</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
+1073: <span class="ruby-keyword kw">end</span>
+1074: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">nEnd</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">task</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-ivar">@scenarioIdx</span>] <span class="ruby-operator">></span> <span class="ruby-identifier">nEnd</span>
+1075: <span class="ruby-identifier">nEnd</span> = <span class="ruby-identifier">task</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
+1076: <span class="ruby-keyword kw">end</span>
+1077: <span class="ruby-keyword kw">end</span>
+1078:
+1079: <span class="ruby-identifier">startSet</span> = <span class="ruby-identifier">endSet</span> = <span class="ruby-keyword kw">false</span>
+1080: <span class="ruby-comment cmt"># Propagate the dates to other dependent tasks.</span>
+1081: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@start</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@start</span> <span class="ruby-operator">></span> <span class="ruby-identifier">nStart</span>
+1082: <span class="ruby-ivar">@start</span> = <span class="ruby-identifier">nStart</span>
+1083: <span class="ruby-identifier">startSet</span> = <span class="ruby-keyword kw">true</span>
+1084: <span class="ruby-keyword kw">end</span>
+1085: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@end</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@end</span> <span class="ruby-operator"><</span> <span class="ruby-identifier">nEnd</span>
+1086: <span class="ruby-ivar">@end</span> = <span class="ruby-identifier">nEnd</span>
+1087: <span class="ruby-identifier">endSet</span> = <span class="ruby-keyword kw">true</span>
+1088: <span class="ruby-keyword kw">end</span>
+1089: <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@start</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@end</span>
+1090: <span class="ruby-identifier">raise</span> <span class="ruby-node">"Start (#{@start}) and end (#{@end}) must be set"</span>
+1091: <span class="ruby-keyword kw">end</span>
+1092: <span class="ruby-ivar">@scheduled</span> = <span class="ruby-keyword kw">true</span>
+1093: <span class="ruby-constant">Log</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"Container task #{@property.fullId} completed: #{@start} -> #{@end}"</span>
+1094:
+1095: <span class="ruby-comment cmt"># If we have modified the start or end date, we need to communicate this</span>
+1096: <span class="ruby-comment cmt"># new date to surrounding tasks.</span>
+1097: <span class="ruby-identifier">propagateDate</span>(<span class="ruby-identifier">nStart</span>, <span class="ruby-keyword kw">false</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">startSet</span>
+1098: <span class="ruby-identifier">propagateDate</span>(<span class="ruby-identifier">nEnd</span>, <span class="ruby-keyword kw">true</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">endSet</span>
+1099: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -3582,80 +3655,150 @@
<p>
Register the user provided bookings with the <a
href="Resource.html">Resource</a> scoreboards. A booking describes the
assignment of a <a href="Resource.html">Resource</a> to a certain <a
href="Task.html">Task</a> for a specified <a
-href="Interval.html">Interval</a>.
+href="TimeInterval.html">TimeInterval</a>.
</p>
<div class="method-source-code"
id="book-ookings-source">
<pre>
<span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1801</span>
1801: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">bookBookings</span>
-1802: <span class="ruby-identifier">scheduled</span> = <span class="ruby-identifier">a</span>(<span class="ruby-value str">'scheduled'</span>)
-1803: <span class="ruby-identifier">slotDuration</span> = <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'scheduleGranularity'</span>]
+1802: <span class="ruby-identifier">firstSlotIdx</span> = <span class="ruby-keyword kw">nil</span>
+1803: <span class="ruby-identifier">lastSlotIdx</span> = <span class="ruby-keyword kw">nil</span>
1804: <span class="ruby-identifier">findBookings</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">booking</span><span class="ruby-operator">|</span>
1805: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">booking</span>.<span class="ruby-identifier">resource</span>.<span class="ruby-identifier">leaf?</span>
1806: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'booking_resource_not_leaf'</span>,
1807: <span class="ruby-value str">"Booked resources may not be group resources"</span>,
1808: <span class="ruby-identifier">booking</span>.<span class="ruby-identifier">sourceFileInfo</span>)
1809: <span class="ruby-keyword kw">end</span>
-1810: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'forward'</span>) <span class="ruby-operator">||</span> <span class="ruby-identifier">scheduled</span>
+1810: <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@forward</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@scheduled</span>
1811: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'booking_forward_only'</span>,
1812: <span class="ruby-value str">"Only forward scheduled tasks may have booking statements."</span>)
1813: <span class="ruby-keyword kw">end</span>
1814: <span class="ruby-identifier">booking</span>.<span class="ruby-identifier">intervals</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">interval</span><span class="ruby-operator">|</span>
1815: <span class="ruby-identifier">startIdx</span> = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">dateToIdx</span>(<span class="ruby-identifier">interval</span>.<span class="ruby-identifier">start</span>, <span class="ruby-keyword kw">false</span>)
-1816: <span class="ruby-identifier">date</span> = <span class="ruby-identifier">interval</span>.<span class="ruby-identifier">start</span>
-1817: <span class="ruby-identifier">endIdx</span> = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">dateToIdx</span>(<span class="ruby-identifier">interval</span>.<span class="ruby-identifier">end</span>, <span class="ruby-keyword kw">false</span>)
-1818: <span class="ruby-identifier">tEnd</span> = <span class="ruby-keyword kw">nil</span>
-1819: <span class="ruby-identifier">startIdx</span>.<span class="ruby-identifier">upto</span>(<span class="ruby-identifier">endIdx</span> <span class="ruby-operator">-</span> <span class="ruby-value">1</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">idx</span><span class="ruby-operator">|</span>
-1820: <span class="ruby-identifier">tEnd</span> = <span class="ruby-identifier">date</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">slotDuration</span>
-1821: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">booking</span>.<span class="ruby-identifier">resource</span>.<span class="ruby-identifier">bookBooking</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">idx</span>, <span class="ruby-identifier">booking</span>)
-1822: <span class="ruby-comment cmt"># Booking was successful for this time slot.</span>
-1823: <span class="ruby-ivar">@doneEffort</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">booking</span>.<span class="ruby-identifier">resource</span>[<span class="ruby-value str">'efficiency'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
-1824:
-1825: <span class="ruby-comment cmt"># Set start and lastSlot if appropriate. The task start will be</span>
-1826: <span class="ruby-comment cmt"># set to the begining of the first booked slot. The lastSlot</span>
-1827: <span class="ruby-comment cmt"># will be set to the last booked slot</span>
-1828: <span class="ruby-ivar">@lastSlot</span> = <span class="ruby-identifier">date</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@lastSlot</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">date</span> <span class="ruby-operator">></span> <span class="ruby-ivar">@lastSlot</span>
-1829: <span class="ruby-ivar">@tentativeEnd</span> = <span class="ruby-identifier">tEnd</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@tentativeEnd</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@tentativeEnd</span> <span class="ruby-operator"><</span> <span class="ruby-identifier">tEnd</span>
-1830: <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">scheduled</span> <span class="ruby-operator">&&</span> (<span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>).<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">date</span> <span class="ruby-operator"><</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>))
-1831: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = <span class="ruby-identifier">date</span>
-1832: <span class="ruby-constant">Log</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"Task #{@property.fullId} first booking: "</span> <span class="ruby-operator">+</span>
-1833: <span class="ruby-node">"#{a('start')} -> #{a('end')}"</span>
-1834: <span class="ruby-keyword kw">end</span>
-1835:
-1836: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'assignedresources'</span>).<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">booking</span>.<span class="ruby-identifier">resource</span>)
-1837: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'assignedresources'</span>, <span class="ruby-ivar">@scenarioIdx</span>] <span class="ruby-operator"><<</span> <span class="ruby-identifier">booking</span>.<span class="ruby-identifier">resource</span>
-1838: <span class="ruby-keyword kw">end</span>
-1839: <span class="ruby-keyword kw">end</span>
-1840: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'length'</span>) <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">isWorkingTime</span>(<span class="ruby-identifier">date</span>)
-1841: <span class="ruby-comment cmt"># For tasks with a 'length' we track the covered work time and</span>
-1842: <span class="ruby-comment cmt"># set the task to 'scheduled' when we have enough length.</span>
-1843: <span class="ruby-ivar">@doneLength</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
-1844: <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">scheduled</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@doneLength</span> <span class="ruby-operator">>=</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'length'</span>)
-1845: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = <span class="ruby-identifier">tEnd</span>
-1846: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'scheduled'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = <span class="ruby-keyword kw">true</span>
-1847: <span class="ruby-keyword kw">end</span>
-1848: <span class="ruby-keyword kw">end</span>
-1849: <span class="ruby-identifier">date</span> = <span class="ruby-identifier">tEnd</span>
-1850: <span class="ruby-keyword kw">end</span>
-1851: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'duration'</span>) <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@tentativeEnd</span>
-1852: <span class="ruby-ivar">@doneDuration</span> = ((<span class="ruby-ivar">@tentativeEnd</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>)) <span class="ruby-operator">/</span>
-1853: <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'scheduleGranularity'</span>]).<span class="ruby-identifier">to_i</span>
-1854: <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">scheduled</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@doneDuration</span> <span class="ruby-operator">>=</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'duration'</span>)
-1855: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = <span class="ruby-ivar">@tentativeEnd</span>
-1856: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'scheduled'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = <span class="ruby-keyword kw">true</span>
-1857: <span class="ruby-keyword kw">end</span>
-1858: <span class="ruby-keyword kw">end</span>
-1859: <span class="ruby-keyword kw">end</span>
-1860: <span class="ruby-keyword kw">end</span>
-1861: <span class="ruby-keyword kw">end</span></pre>
+1816: <span class="ruby-identifier">endIdx</span> = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">dateToIdx</span>(<span class="ruby-identifier">interval</span>.<span class="ruby-identifier">end</span>, <span class="ruby-keyword kw">false</span>)
+1817: <span class="ruby-identifier">startIdx</span>.<span class="ruby-identifier">upto</span>(<span class="ruby-identifier">endIdx</span> <span class="ruby-operator">-</span> <span class="ruby-value">1</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">idx</span><span class="ruby-operator">|</span>
+1818: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">booking</span>.<span class="ruby-identifier">resource</span>.<span class="ruby-identifier">bookBooking</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">idx</span>, <span class="ruby-identifier">booking</span>)
+1819: <span class="ruby-comment cmt"># Booking was successful for this time slot.</span>
+1820: <span class="ruby-ivar">@doneEffort</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">booking</span>.<span class="ruby-identifier">resource</span>[<span class="ruby-value str">'efficiency'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
+1821:
+1822: <span class="ruby-comment cmt"># Store the indexes of the first slot and the slot after the</span>
+1823: <span class="ruby-comment cmt"># last slot.</span>
+1824: <span class="ruby-identifier">firstSlotIdx</span> = <span class="ruby-identifier">idx</span> <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">firstSlotIdx</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">firstSlotIdx</span> <span class="ruby-operator">></span> <span class="ruby-identifier">idx</span>
+1825: <span class="ruby-identifier">lastSlotIdx</span> = <span class="ruby-identifier">idx</span> <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">lastSlotIdx</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">lastSlotIdx</span> <span class="ruby-operator"><</span> <span class="ruby-identifier">idx</span>
+1826:
+1827: <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@assignedresources</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">booking</span>.<span class="ruby-identifier">resource</span>)
+1828: <span class="ruby-ivar">@assignedresources</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">booking</span>.<span class="ruby-identifier">resource</span>
+1829: <span class="ruby-keyword kw">end</span>
+1830: <span class="ruby-keyword kw">end</span>
+1831: <span class="ruby-keyword kw">end</span>
+1832: <span class="ruby-keyword kw">end</span>
+1833: <span class="ruby-keyword kw">end</span>
+1834:
+1835: <span class="ruby-comment cmt"># For effort based tasks, or tasks without a start date, with bookings</span>
+1836: <span class="ruby-comment cmt"># that have not yet been marked as scheduled we set the start date to</span>
+1837: <span class="ruby-comment cmt"># the date of the first booked slot.</span>
+1838: <span class="ruby-keyword kw">if</span> (<span class="ruby-ivar">@start</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> (<span class="ruby-ivar">@doneEffort</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@effort</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>)) <span class="ruby-operator">&&</span>
+1839: <span class="ruby-operator">!</span><span class="ruby-ivar">@scheduled</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">firstSlotIdx</span>
+1840: <span class="ruby-identifier">firstSlotDate</span> = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">idxToDate</span>(<span class="ruby-identifier">firstSlotIdx</span>)
+1841: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@start</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">firstSlotDate</span> <span class="ruby-operator">></span> <span class="ruby-ivar">@start</span>
+1842: <span class="ruby-ivar">@start</span> = <span class="ruby-identifier">firstSlotDate</span>
+1843: <span class="ruby-constant">Log</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"Task #{@property.fullId} first booking: "</span> <span class="ruby-operator">+</span>
+1844: <span class="ruby-node">"#{@start} -> #{@end}"</span>
+1845: <span class="ruby-keyword kw">end</span>
+1846: <span class="ruby-keyword kw">end</span>
+1847:
+1848: <span class="ruby-comment cmt"># Check if the the duration criteria has already been reached by the</span>
+1849: <span class="ruby-comment cmt"># supplied bookings and set the task end to the last booked slot.</span>
+1850: <span class="ruby-comment cmt"># Also the task is marked as scheduled.</span>
+1851: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">lastSlotIdx</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@scheduled</span>
+1852: <span class="ruby-identifier">tentativeEnd</span> = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">idxToDate</span>(<span class="ruby-identifier">lastSlotIdx</span> <span class="ruby-operator">+</span> <span class="ruby-value">1</span>)
+1853: <span class="ruby-identifier">slotDuration</span> = <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'scheduleGranularity'</span>]
+1854:
+1855: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@effort</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
+1856: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@doneEffort</span> <span class="ruby-operator">>=</span> <span class="ruby-ivar">@effort</span>
+1857: <span class="ruby-ivar">@end</span> = <span class="ruby-identifier">tentativeEnd</span>
+1858: <span class="ruby-ivar">@scheduled</span> = <span class="ruby-keyword kw">true</span>
+1859: <span class="ruby-keyword kw">end</span>
+1860: <span class="ruby-keyword kw">elsif</span> <span class="ruby-ivar">@length</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
+1861: <span class="ruby-ivar">@doneLength</span> = <span class="ruby-value">0</span>
+1862: <span class="ruby-identifier">startIdx</span> = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">dateToIdx</span>(<span class="ruby-identifier">date</span> = <span class="ruby-ivar">@start</span>)
+1863: <span class="ruby-identifier">endIdx</span> = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">dateToIdx</span>(<span class="ruby-ivar">@project</span>[<span class="ruby-value str">'now'</span>])
+1864: <span class="ruby-identifier">startIdx</span>.<span class="ruby-identifier">upto</span>(<span class="ruby-identifier">endIdx</span>) <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">idx</span><span class="ruby-operator">|</span>
+1865: <span class="ruby-ivar">@doneLength</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">isWorkingTime</span>(<span class="ruby-identifier">idx</span>)
+1866: <span class="ruby-identifier">date</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">slotDuration</span>
+1867: <span class="ruby-comment cmt"># Continue not only until the @length has been reached, but also</span>
+1868: <span class="ruby-comment cmt"># the tentativeEnd date. This allows us to detect overbookings.</span>
+1869: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@doneLength</span> <span class="ruby-operator">>=</span> <span class="ruby-ivar">@length</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">date</span> <span class="ruby-operator">>=</span> <span class="ruby-identifier">tentativeEnd</span>
+1870: <span class="ruby-identifier">endDate</span> = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">idxToDate</span>(<span class="ruby-identifier">idx</span> <span class="ruby-operator">+</span> <span class="ruby-value">1</span>)
+1871: <span class="ruby-ivar">@end</span> = [ <span class="ruby-identifier">endDate</span>, <span class="ruby-identifier">tentativeEnd</span> ].<span class="ruby-identifier">max</span>
+1872: <span class="ruby-ivar">@scheduled</span> = <span class="ruby-keyword kw">true</span>
+1873: <span class="ruby-keyword kw">break</span>
+1874: <span class="ruby-keyword kw">end</span>
+1875: <span class="ruby-keyword kw">end</span>
+1876: <span class="ruby-keyword kw">elsif</span> <span class="ruby-ivar">@duration</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
+1877: <span class="ruby-ivar">@doneDuration</span> = ((<span class="ruby-identifier">tentativeEnd</span> <span class="ruby-operator">-</span> <span class="ruby-ivar">@start</span>) <span class="ruby-operator">/</span> <span class="ruby-identifier">slotDuration</span>).<span class="ruby-identifier">to_i</span>
+1878: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@doneDuration</span> <span class="ruby-operator">>=</span> <span class="ruby-ivar">@duration</span>
+1879: <span class="ruby-ivar">@end</span> = <span class="ruby-identifier">tentativeEnd</span>
+1880: <span class="ruby-ivar">@scheduled</span> = <span class="ruby-keyword kw">true</span>
+1881: <span class="ruby-keyword kw">elsif</span> <span class="ruby-ivar">@duration</span> * <span class="ruby-identifier">slotDuration</span> <span class="ruby-operator"><</span> (<span class="ruby-ivar">@project</span>[<span class="ruby-value str">'now'</span>] <span class="ruby-operator">-</span> <span class="ruby-ivar">@start</span>)
+1882: <span class="ruby-comment cmt"># This handles the case where the bookings don't provide enough</span>
+1883: <span class="ruby-comment cmt"># @doneDuration to reach @duration, but the now date would be</span>
+1884: <span class="ruby-comment cmt"># after the @start + @duration date.</span>
+1885: <span class="ruby-ivar">@end</span> = <span class="ruby-ivar">@start</span> <span class="ruby-operator">+</span> <span class="ruby-ivar">@duration</span> * <span class="ruby-identifier">slotDuration</span>
+1886: <span class="ruby-ivar">@scheduled</span> = <span class="ruby-keyword kw">true</span>
+1887: <span class="ruby-keyword kw">end</span>
+1888: <span class="ruby-keyword kw">end</span>
+1889: <span class="ruby-keyword kw">end</span>
+1890:
+1891: <span class="ruby-comment cmt"># If the task has bookings, we assume that the bookings describe all</span>
+1892: <span class="ruby-comment cmt"># work up to the 'now' date.</span>
+1893: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@doneEffort</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
+1894: <span class="ruby-ivar">@currentSlotIdx</span> = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">dateToIdx</span>(<span class="ruby-ivar">@project</span>[<span class="ruby-value str">'now'</span>])
+1895: <span class="ruby-keyword kw">end</span>
+1896:
+1897: <span class="ruby-comment cmt"># Finally, we check if the bookings caused more effort, length or</span>
+1898: <span class="ruby-comment cmt"># duration than was requested by the user. This is only flagged as a</span>
+1899: <span class="ruby-comment cmt"># warning.</span>
+1900: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@effort</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
+1901: <span class="ruby-identifier">effort</span> = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">slotsToDays</span>(<span class="ruby-ivar">@doneEffort</span>)
+1902: <span class="ruby-identifier">effortHours</span> = <span class="ruby-identifier">effort</span> * <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'dailyworkinghours'</span>]
+1903: <span class="ruby-identifier">requestedEffort</span> = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">slotsToDays</span>(<span class="ruby-ivar">@effort</span>)
+1904: <span class="ruby-identifier">requestedEffortHours</span> = <span class="ruby-identifier">requestedEffort</span> * <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'dailyworkinghours'</span>]
+1905: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">effort</span> <span class="ruby-operator">></span> <span class="ruby-identifier">requestedEffort</span>
+1906: <span class="ruby-identifier">warning</span>(<span class="ruby-value str">'overbooked_effort'</span>,
+1907: <span class="ruby-node">"The total effort (#{effort}d or #{effortHours}h) of the "</span> <span class="ruby-operator">+</span>
+1908: <span class="ruby-node">"provided bookings for task #{@property.fullId} exceeds "</span> <span class="ruby-operator">+</span>
+1909: <span class="ruby-node">"the specified effort of #{requestedEffort}d or "</span> <span class="ruby-operator">+</span>
+1910: <span class="ruby-node">"#{requestedEffortHours}h."</span>)
+1911: <span class="ruby-keyword kw">end</span>
+1912: <span class="ruby-keyword kw">end</span>
+1913: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@length</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@doneLength</span> <span class="ruby-operator">></span> <span class="ruby-ivar">@length</span>
+1914: <span class="ruby-identifier">length</span> = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">slotsToDays</span>(<span class="ruby-ivar">@doneLength</span>)
+1915: <span class="ruby-identifier">requestedLength</span> = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">slotsToDays</span>(<span class="ruby-ivar">@length</span>)
+1916: <span class="ruby-identifier">warning</span>(<span class="ruby-value str">'overbooked_length'</span>,
+1917: <span class="ruby-node">"The total length (#{length}d) of the provided bookings "</span> <span class="ruby-operator">+</span>
+1918: <span class="ruby-node">"for task #{@property.fullId} exceeds the specified length of "</span> <span class="ruby-operator">+</span>
+1919: <span class="ruby-node">"#{requestedLength}d."</span>)
+1920: <span class="ruby-keyword kw">end</span>
+1921: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@duration</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@doneDuration</span> <span class="ruby-operator">></span> <span class="ruby-ivar">@duration</span>
+1922: <span class="ruby-identifier">duration</span> = <span class="ruby-ivar">@doneDuration</span> * <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'scheduleGranularity'</span>] <span class="ruby-operator">/</span>
+1923: (<span class="ruby-value">60.0</span> * <span class="ruby-value">60</span> * <span class="ruby-value">24</span>)
+1924: <span class="ruby-identifier">requestedDuration</span> = <span class="ruby-ivar">@duration</span> * <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'scheduleGranularity'</span>] <span class="ruby-operator">/</span>
+1925: (<span class="ruby-value">60.0</span> * <span class="ruby-value">60</span> * <span class="ruby-value">24</span>)
+1926: <span class="ruby-identifier">warning</span>(<span class="ruby-value str">'overbooked_duration'</span>,
+1927: <span class="ruby-node">"The total duration (#{duration}d) of the provided bookings "</span> <span class="ruby-operator">+</span>
+1928: <span class="ruby-node">"for task #{@property.fullId} exceeds the specified duration "</span> <span class="ruby-operator">+</span>
+1929: <span class="ruby-node">"of #{requestedDuration}d."</span>)
+1930: <span class="ruby-keyword kw">end</span>
+1931: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -3668,11 +3811,11 @@
<a name="method-i-bookResource"></a>
<div class="method-heading">
<span class="method-name">bookResource</span><span
- class="method-args">(resource, sbIdx, date)</span>
+ class="method-args">(resource)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
@@ -3682,54 +3825,51 @@
<div class="method-source-code"
id="book-esource-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1725</span>
-1725: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">bookResource</span>(<span class="ruby-identifier">resource</span>, <span class="ruby-identifier">sbIdx</span>, <span class="ruby-identifier">date</span>)
-1726: <span class="ruby-identifier">booked</span> = <span class="ruby-keyword kw">false</span>
-1727: <span class="ruby-identifier">resource</span>.<span class="ruby-identifier">allLeaves</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span>
-1728: <span class="ruby-comment cmt"># Prevent overbooking when multiple resources are allocated and</span>
-1729: <span class="ruby-comment cmt"># available. If the task has allocation limits we need to make sure</span>
-1730: <span class="ruby-comment cmt"># that none of them is already exceeded.</span>
-1731: <span class="ruby-keyword kw">break</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'effort'</span>) <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@doneEffort</span> <span class="ruby-operator">>=</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'effort'</span>) <span class="ruby-operator">||</span>
-1732: <span class="ruby-operator">!</span><span class="ruby-identifier">limitsOk?</span>(<span class="ruby-identifier">date</span>, <span class="ruby-identifier">resource</span>)
-1733:
-1734: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">r</span>.<span class="ruby-identifier">book</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">sbIdx</span>, <span class="ruby-ivar">@property</span>)
-1735: <span class="ruby-comment cmt"># For effort based task we adjust the the start end (as defined by</span>
-1736: <span class="ruby-comment cmt"># the scheduling direction) to align with the first booked time</span>
-1737: <span class="ruby-comment cmt"># slot.</span>
-1738: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'effort'</span>) <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'assignedresources'</span>).<span class="ruby-identifier">empty?</span>
-1739: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'forward'</span>)
-1740: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">idxToDate</span>(<span class="ruby-identifier">sbIdx</span>)
-1741: <span class="ruby-constant">Log</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"Task #{@property.fullId} first assignment: "</span> <span class="ruby-operator">+</span>
-1742: <span class="ruby-node">"#{a('start')} -> #{a('end')}"</span>
-1743: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'startsuccs'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
-1744: <span class="ruby-identifier">task</span>.<span class="ruby-identifier">propagateDate</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>), <span class="ruby-keyword kw">false</span>, <span class="ruby-keyword kw">true</span>)
-1745: <span class="ruby-keyword kw">end</span>
-1746: <span class="ruby-keyword kw">else</span>
-1747: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">idxToDate</span>(<span class="ruby-identifier">sbIdx</span> <span class="ruby-operator">+</span> <span class="ruby-value">1</span>)
-1748: <span class="ruby-constant">Log</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"Task #{@property.fullId} last assignment: "</span> <span class="ruby-operator">+</span>
-1749: <span class="ruby-node">"#{a('start')} -> #{a('end')}"</span>
-1750: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'endpreds'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
-1751: <span class="ruby-identifier">task</span>.<span class="ruby-identifier">propagateDate</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>), <span class="ruby-keyword kw">true</span>, <span class="ruby-keyword kw">true</span>)
-1752: <span class="ruby-keyword kw">end</span>
-1753: <span class="ruby-keyword kw">end</span>
-1754: <span class="ruby-keyword kw">end</span>
-1755:
-1756: <span class="ruby-ivar">@tentativeStart</span> = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">idxToDate</span>(<span class="ruby-identifier">sbIdx</span>)
-1757: <span class="ruby-ivar">@tentativeEnd</span> = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">idxToDate</span>(<span class="ruby-identifier">sbIdx</span> <span class="ruby-operator">+</span> <span class="ruby-value">1</span>)
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1728</span>
+1728: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">bookResource</span>(<span class="ruby-identifier">resource</span>)
+1729: <span class="ruby-identifier">booked</span> = <span class="ruby-keyword kw">false</span>
+1730: <span class="ruby-identifier">resource</span>.<span class="ruby-identifier">allLeaves</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span>
+1731: <span class="ruby-comment cmt"># Prevent overbooking when multiple resources are allocated and</span>
+1732: <span class="ruby-comment cmt"># available. If the task has allocation limits we need to make sure</span>
+1733: <span class="ruby-comment cmt"># that none of them is already exceeded.</span>
+1734: <span class="ruby-keyword kw">break</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@effort</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@doneEffort</span> <span class="ruby-operator">>=</span> <span class="ruby-ivar">@effort</span> <span class="ruby-operator">||</span>
+1735: <span class="ruby-operator">!</span><span class="ruby-identifier">limitsOk?</span>(<span class="ruby-ivar">@currentSlotIdx</span>, <span class="ruby-identifier">resource</span>)
+1736:
+1737: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">r</span>.<span class="ruby-identifier">book</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-ivar">@currentSlotIdx</span>, <span class="ruby-ivar">@property</span>)
+1738: <span class="ruby-comment cmt"># For effort based task we adjust the the start end (as defined by</span>
+1739: <span class="ruby-comment cmt"># the scheduling direction) to align with the first booked time</span>
+1740: <span class="ruby-comment cmt"># slot.</span>
+1741: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@effort</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@assignedresources</span>.<span class="ruby-identifier">empty?</span>
+1742: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@forward</span>
+1743: <span class="ruby-ivar">@start</span> = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">idxToDate</span>(<span class="ruby-ivar">@currentSlotIdx</span>)
+1744: <span class="ruby-constant">Log</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"Task #{@property.fullId} first assignment: "</span> <span class="ruby-operator">+</span>
+1745: <span class="ruby-node">"#{@start} -> #{@end}"</span>
+1746: <span class="ruby-ivar">@startsuccs</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
+1747: <span class="ruby-identifier">task</span>.<span class="ruby-identifier">propagateDate</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-ivar">@start</span>, <span class="ruby-keyword kw">false</span>, <span class="ruby-keyword kw">true</span>)
+1748: <span class="ruby-keyword kw">end</span>
+1749: <span class="ruby-keyword kw">else</span>
+1750: <span class="ruby-ivar">@end</span> = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">idxToDate</span>(<span class="ruby-ivar">@currentSlotIdx</span> <span class="ruby-operator">+</span> <span class="ruby-value">1</span>)
+1751: <span class="ruby-constant">Log</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"Task #{@property.fullId} last assignment: "</span> <span class="ruby-operator">+</span>
+1752: <span class="ruby-node">"#{@start} -> #{@end}"</span>
+1753: <span class="ruby-ivar">@endpreds</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
+1754: <span class="ruby-identifier">task</span>.<span class="ruby-identifier">propagateDate</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-ivar">@end</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-keyword kw">true</span>)
+1755: <span class="ruby-keyword kw">end</span>
+1756: <span class="ruby-keyword kw">end</span>
+1757: <span class="ruby-keyword kw">end</span>
1758:
1759: <span class="ruby-ivar">@doneEffort</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">r</span>[<span class="ruby-value str">'efficiency'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
1760: <span class="ruby-comment cmt"># Limits do not take efficiency into account. Limits are usage limits,</span>
1761: <span class="ruby-comment cmt"># not effort limits.</span>
-1762: <span class="ruby-ivar">@limits</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">limit</span><span class="ruby-operator">|</span>
-1763: <span class="ruby-identifier">limit</span>.<span class="ruby-identifier">inc</span>(<span class="ruby-identifier">date</span>, <span class="ruby-identifier">resource</span>)
+1762: <span class="ruby-ivar">@allLimits</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">limit</span><span class="ruby-operator">|</span>
+1763: <span class="ruby-identifier">limit</span>.<span class="ruby-identifier">inc</span>(<span class="ruby-ivar">@currentSlotIdx</span>, <span class="ruby-identifier">resource</span>)
1764: <span class="ruby-keyword kw">end</span>
1765:
-1766: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'assignedresources'</span>).<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">r</span>)
-1767: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'assignedresources'</span>, <span class="ruby-ivar">@scenarioIdx</span>] <span class="ruby-operator"><<</span> <span class="ruby-identifier">r</span>
+1766: <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@assignedresources</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">r</span>)
+1767: <span class="ruby-ivar">@assignedresources</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">r</span>
1768: <span class="ruby-keyword kw">end</span>
1769: <span class="ruby-identifier">booked</span> = <span class="ruby-keyword kw">true</span>
1770: <span class="ruby-keyword kw">end</span>
1771: <span class="ruby-keyword kw">end</span>
1772:
@@ -3749,11 +3889,11 @@
<a name="method-i-bookResources"></a>
<div class="method-heading">
<span class="method-name">bookResources</span><span
- class="method-args">(date, slotDuration)</span>
+ class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
@@ -3763,90 +3903,80 @@
<div class="method-source-code"
id="book-esources-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1645</span>
-1645: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">bookResources</span>(<span class="ruby-identifier">date</span>, <span class="ruby-identifier">slotDuration</span>)
-1646: <span class="ruby-comment cmt"># If there are no allocations defined, we can't do any bookings.</span>
-1647: <span class="ruby-comment cmt"># In projection mode we do not allow allocations prior to the current</span>
-1648: <span class="ruby-comment cmt"># date. If the scenario is not scheduled in projection mode, this</span>
-1649: <span class="ruby-comment cmt"># restriction only applies to tasks with bookings.</span>
-1650: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'allocate'</span>).<span class="ruby-identifier">empty?</span> <span class="ruby-operator">||</span>
-1651: ((<span class="ruby-ivar">@project</span>.<span class="ruby-identifier">scenario</span>(<span class="ruby-ivar">@scenarioIdx</span>).<span class="ruby-identifier">get</span>(<span class="ruby-value str">'projection'</span>) <span class="ruby-operator">||</span>
-1652: <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'booking'</span>).<span class="ruby-identifier">empty?</span>) <span class="ruby-operator">&&</span>
-1653: <span class="ruby-identifier">date</span> <span class="ruby-operator"><</span> <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'now'</span>])
-1654: <span class="ruby-keyword kw">return</span>
-1655: <span class="ruby-keyword kw">end</span>
-1656:
-1657: <span class="ruby-comment cmt"># If the task has shifts to limit the allocations, we check that we are</span>
-1658: <span class="ruby-comment cmt"># within a defined shift interval. If yes, we need to be on shift to</span>
-1659: <span class="ruby-comment cmt"># continue.</span>
-1660: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">shifts</span> = <span class="ruby-identifier">a</span>(<span class="ruby-value str">'shifts'</span>)) <span class="ruby-operator">&&</span> <span class="ruby-identifier">shifts</span>.<span class="ruby-identifier">assigned?</span>(<span class="ruby-identifier">date</span>)
-1661: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">shifts</span>.<span class="ruby-identifier">onShift?</span>(<span class="ruby-identifier">date</span>)
-1662: <span class="ruby-keyword kw">end</span>
-1663:
-1664: <span class="ruby-comment cmt"># If the task has resource independent allocation limits we need to make</span>
-1665: <span class="ruby-comment cmt"># sure that none of them is already exceeded.</span>
-1666: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">limitsOk?</span>(<span class="ruby-identifier">date</span>)
-1667:
-1668: <span class="ruby-identifier">sbIdx</span> = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">dateToIdx</span>(<span class="ruby-identifier">date</span>, <span class="ruby-keyword kw">false</span>)
-1669:
-1670: <span class="ruby-comment cmt"># We first have to make sure that if there are mandatory resources</span>
-1671: <span class="ruby-comment cmt"># that these are all available for the time slot.</span>
-1672: <span class="ruby-identifier">takenMandatories</span> = []
-1673: <span class="ruby-ivar">@mandatories</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">allocation</span><span class="ruby-operator">|</span>
-1674: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">allocation</span>.<span class="ruby-identifier">onShift?</span>(<span class="ruby-identifier">date</span>)
-1675:
-1676: <span class="ruby-comment cmt"># For mandatory allocations with alternatives at least one of the</span>
-1677: <span class="ruby-comment cmt"># alternatives must be available.</span>
-1678: <span class="ruby-identifier">found</span> = <span class="ruby-keyword kw">false</span>
-1679: <span class="ruby-identifier">allocation</span>.<span class="ruby-identifier">candidates</span>(<span class="ruby-ivar">@scenarioIdx</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">candidate</span><span class="ruby-operator">|</span>
-1680: <span class="ruby-comment cmt"># When a resource group is marked mandatory, all members of the</span>
-1681: <span class="ruby-comment cmt"># group must be available.</span>
-1682: <span class="ruby-identifier">allAvailable</span> = <span class="ruby-keyword kw">true</span>
-1683: <span class="ruby-identifier">candidate</span>.<span class="ruby-identifier">allLeaves</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resource</span><span class="ruby-operator">|</span>
-1684: <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">limitsOk?</span>(<span class="ruby-identifier">date</span>, <span class="ruby-identifier">resource</span>) <span class="ruby-operator">||</span>
-1685: <span class="ruby-operator">!</span><span class="ruby-identifier">resource</span>.<span class="ruby-identifier">available?</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">sbIdx</span>) <span class="ruby-operator">||</span>
-1686: <span class="ruby-identifier">takenMandatories</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">resource</span>)
-1687: <span class="ruby-comment cmt"># We've found a mandatory resource that is not available for</span>
-1688: <span class="ruby-comment cmt"># the slot.</span>
-1689: <span class="ruby-identifier">allAvailable</span> = <span class="ruby-keyword kw">false</span>
-1690: <span class="ruby-keyword kw">break</span>
-1691: <span class="ruby-keyword kw">else</span>
-1692: <span class="ruby-identifier">takenMandatories</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">resource</span>
-1693: <span class="ruby-keyword kw">end</span>
-1694: <span class="ruby-keyword kw">end</span>
-1695: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">allAvailable</span>
-1696: <span class="ruby-identifier">found</span> = <span class="ruby-keyword kw">true</span>
-1697: <span class="ruby-keyword kw">break</span>
-1698: <span class="ruby-keyword kw">end</span>
-1699: <span class="ruby-keyword kw">end</span>
-1700:
-1701: <span class="ruby-comment cmt"># At least one mandatory resource is not available. We cannot continue.</span>
-1702: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">found</span>
-1703: <span class="ruby-keyword kw">end</span>
-1704:
-1705: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'allocate'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">allocation</span><span class="ruby-operator">|</span>
-1706: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">allocation</span>.<span class="ruby-identifier">onShift?</span>(<span class="ruby-identifier">date</span>)
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1658</span>
+1658: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">bookResources</span>
+1659: <span class="ruby-comment cmt"># First check if there is any resource at all for this slot.</span>
+1660: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">anyResourceAvailable?</span>(<span class="ruby-ivar">@currentSlotIdx</span>)
+1661:
+1662: <span class="ruby-comment cmt"># If the task has resource independent allocation limits we need to make</span>
+1663: <span class="ruby-comment cmt"># sure that none of them is already exceeded.</span>
+1664: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">limitsOk?</span>(<span class="ruby-ivar">@currentSlotIdx</span>)
+1665:
+1666: <span class="ruby-comment cmt"># If the task has shifts to limit the allocations, we check that we are</span>
+1667: <span class="ruby-comment cmt"># within a defined shift interval. If yes, we need to be on shift to</span>
+1668: <span class="ruby-comment cmt"># continue.</span>
+1669: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@shifts</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@shifts</span>.<span class="ruby-identifier">assigned?</span>(<span class="ruby-ivar">@currentSlotIdx</span>)
+1670: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@shifts</span>.<span class="ruby-identifier">onShift?</span>(<span class="ruby-ivar">@currentSlotIdx</span>)
+1671: <span class="ruby-keyword kw">end</span>
+1672:
+1673: <span class="ruby-comment cmt"># We first have to make sure that if there are mandatory resources</span>
+1674: <span class="ruby-comment cmt"># that these are all available for the time slot.</span>
+1675: <span class="ruby-identifier">takenMandatories</span> = []
+1676: <span class="ruby-ivar">@mandatories</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">allocation</span><span class="ruby-operator">|</span>
+1677: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">allocation</span>.<span class="ruby-identifier">onShift?</span>(<span class="ruby-ivar">@currentSlotIdx</span>)
+1678:
+1679: <span class="ruby-comment cmt"># For mandatory allocations with alternatives at least one of the</span>
+1680: <span class="ruby-comment cmt"># alternatives must be available.</span>
+1681: <span class="ruby-identifier">found</span> = <span class="ruby-keyword kw">false</span>
+1682: <span class="ruby-identifier">allocation</span>.<span class="ruby-identifier">candidates</span>(<span class="ruby-ivar">@scenarioIdx</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">candidate</span><span class="ruby-operator">|</span>
+1683: <span class="ruby-comment cmt"># When a resource group is marked mandatory, all members of the</span>
+1684: <span class="ruby-comment cmt"># group must be available.</span>
+1685: <span class="ruby-identifier">allAvailable</span> = <span class="ruby-keyword kw">true</span>
+1686: <span class="ruby-identifier">candidate</span>.<span class="ruby-identifier">allLeaves</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resource</span><span class="ruby-operator">|</span>
+1687: <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">limitsOk?</span>(<span class="ruby-ivar">@currentSlotIdx</span>, <span class="ruby-identifier">resource</span>) <span class="ruby-operator">||</span>
+1688: <span class="ruby-operator">!</span><span class="ruby-identifier">resource</span>.<span class="ruby-identifier">available?</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-ivar">@currentSlotIdx</span>) <span class="ruby-operator">||</span>
+1689: <span class="ruby-identifier">takenMandatories</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">resource</span>)
+1690: <span class="ruby-comment cmt"># We've found a mandatory resource that is not available for</span>
+1691: <span class="ruby-comment cmt"># the slot.</span>
+1692: <span class="ruby-identifier">allAvailable</span> = <span class="ruby-keyword kw">false</span>
+1693: <span class="ruby-keyword kw">break</span>
+1694: <span class="ruby-keyword kw">else</span>
+1695: <span class="ruby-identifier">takenMandatories</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">resource</span>
+1696: <span class="ruby-keyword kw">end</span>
+1697: <span class="ruby-keyword kw">end</span>
+1698: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">allAvailable</span>
+1699: <span class="ruby-identifier">found</span> = <span class="ruby-keyword kw">true</span>
+1700: <span class="ruby-keyword kw">break</span>
+1701: <span class="ruby-keyword kw">end</span>
+1702: <span class="ruby-keyword kw">end</span>
+1703:
+1704: <span class="ruby-comment cmt"># At least one mandatory resource is not available. We cannot continue.</span>
+1705: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">found</span>
+1706: <span class="ruby-keyword kw">end</span>
1707:
-1708: <span class="ruby-comment cmt"># In case we have a persistent allocation we need to check if there is</span>
-1709: <span class="ruby-comment cmt"># already a locked resource and use it.</span>
-1710: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">allocation</span>.<span class="ruby-identifier">persistent</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">allocation</span>.<span class="ruby-identifier">lockedResource</span>.<span class="ruby-identifier">nil?</span>
-1711: <span class="ruby-identifier">bookResource</span>(<span class="ruby-identifier">allocation</span>.<span class="ruby-identifier">lockedResource</span>, <span class="ruby-identifier">sbIdx</span>, <span class="ruby-identifier">date</span>)
-1712: <span class="ruby-keyword kw">else</span>
-1713: <span class="ruby-comment cmt"># If not, we create a list of candidates in the proper order and</span>
-1714: <span class="ruby-comment cmt"># assign the first one available.</span>
-1715: <span class="ruby-identifier">allocation</span>.<span class="ruby-identifier">candidates</span>(<span class="ruby-ivar">@scenarioIdx</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">candidate</span><span class="ruby-operator">|</span>
-1716: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">bookResource</span>(<span class="ruby-identifier">candidate</span>, <span class="ruby-identifier">sbIdx</span>, <span class="ruby-identifier">date</span>)
-1717: <span class="ruby-identifier">allocation</span>.<span class="ruby-identifier">lockedResource</span> = <span class="ruby-identifier">candidate</span>
-1718: <span class="ruby-keyword kw">break</span>
-1719: <span class="ruby-keyword kw">end</span>
-1720: <span class="ruby-keyword kw">end</span>
-1721: <span class="ruby-keyword kw">end</span>
-1722: <span class="ruby-keyword kw">end</span>
-1723: <span class="ruby-keyword kw">end</span></pre>
+1708: <span class="ruby-ivar">@allocate</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">allocation</span><span class="ruby-operator">|</span>
+1709: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">allocation</span>.<span class="ruby-identifier">onShift?</span>(<span class="ruby-ivar">@currentSlotIdx</span>)
+1710:
+1711: <span class="ruby-comment cmt"># In case we have a persistent allocation we need to check if there</span>
+1712: <span class="ruby-comment cmt"># is already a locked resource and use it.</span>
+1713: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">allocation</span>.<span class="ruby-identifier">lockedResource</span>
+1714: <span class="ruby-identifier">bookResource</span>(<span class="ruby-identifier">allocation</span>.<span class="ruby-identifier">lockedResource</span>)
+1715: <span class="ruby-keyword kw">else</span>
+1716: <span class="ruby-comment cmt"># If not, we create a list of candidates in the proper order and</span>
+1717: <span class="ruby-comment cmt"># assign the first one available.</span>
+1718: <span class="ruby-identifier">allocation</span>.<span class="ruby-identifier">candidates</span>(<span class="ruby-ivar">@scenarioIdx</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">candidate</span><span class="ruby-operator">|</span>
+1719: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">bookResource</span>(<span class="ruby-identifier">candidate</span>)
+1720: <span class="ruby-identifier">allocation</span>.<span class="ruby-identifier">lockedResource</span> = <span class="ruby-identifier">candidate</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">allocation</span>.<span class="ruby-identifier">persistent</span>
+1721: <span class="ruby-keyword kw">break</span>
+1722: <span class="ruby-keyword kw">end</span>
+1723: <span class="ruby-keyword kw">end</span>
+1724: <span class="ruby-keyword kw">end</span>
+1725: <span class="ruby-keyword kw">end</span>
+1726: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -3876,69 +4006,67 @@
<div class="method-source-code"
id="calc-ompletion-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 2110</span>
-2110: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">calcCompletion</span>
-2111: <span class="ruby-comment cmt"># If the user provided a completion degree we are not touching it.</span>
-2112: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">provided</span>(<span class="ruby-value str">'complete'</span>, <span class="ruby-ivar">@scenarioIdx</span>)
-2113: <span class="ruby-identifier">calcStatus</span>
-2114: <span class="ruby-keyword kw">return</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'complete'</span>)
-2115: <span class="ruby-keyword kw">end</span>
-2116:
-2117: <span class="ruby-comment cmt"># We cannot compute a completion degree without a start or end date.</span>
-2118: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>).<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>).<span class="ruby-identifier">nil?</span>
-2119: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'complete'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = <span class="ruby-value">0.0</span>
-2120: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'status'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = <span class="ruby-value str">'unknown'</span>
-2121: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span>
-2122: <span class="ruby-keyword kw">end</span>
-2123:
-2124: <span class="ruby-identifier">completion</span> = <span class="ruby-value">0.0</span>
-2125: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'milestone'</span>)
-2126: <span class="ruby-comment cmt"># Milestones are either 0% or 100% complete.</span>
-2127: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'complete'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = <span class="ruby-identifier">completion</span> =
-2128: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-ivar">@scenarioIdx</span>] <span class="ruby-operator"><=</span> <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'now'</span>] <span class="ruby-operator">?</span> <span class="ruby-value">100.0</span> <span class="ruby-operator">:</span> <span class="ruby-value">0.0</span>
-2129: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'status'</span>, <span class="ruby-ivar">@scenarioIdx</span>] =
-2130: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>) <span class="ruby-operator"><=</span> <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'now'</span>] <span class="ruby-operator">?</span> <span class="ruby-value str">'done'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'not reached'</span>
-2131: <span class="ruby-keyword kw">else</span>
-2132: <span class="ruby-comment cmt"># The task is in progress. Calculate the current completion</span>
-2133: <span class="ruby-comment cmt"># degree.</span>
-2134: <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">property</span>.<span class="ruby-identifier">leaf?</span>
-2135: <span class="ruby-comment cmt"># For container task the completion degree is the average of the</span>
-2136: <span class="ruby-comment cmt"># sub tasks.</span>
-2137: <span class="ruby-identifier">completion</span> = <span class="ruby-value">0.0</span>
-2138: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">kids</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">child</span><span class="ruby-operator">|</span>
-2139: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span> <span class="ruby-keyword kw">unless</span> (<span class="ruby-identifier">comp</span> = <span class="ruby-identifier">child</span>.<span class="ruby-identifier">calcCompletion</span>(<span class="ruby-ivar">@scenarioIdx</span>))
-2140: <span class="ruby-identifier">completion</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">comp</span>
-2141: <span class="ruby-keyword kw">end</span>
-2142: <span class="ruby-identifier">completion</span> <span class="ruby-operator">/=</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">children</span>.<span class="ruby-identifier">length</span>
-2143: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>) <span class="ruby-operator"><=</span> <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'now'</span>]
-2144: <span class="ruby-comment cmt"># The task has ended already. It's 100% complete.</span>
-2145: <span class="ruby-identifier">completion</span> = <span class="ruby-value">100.0</span>
-2146: <span class="ruby-keyword kw">elsif</span> <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'now'</span>] <span class="ruby-operator"><=</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>)
-2147: <span class="ruby-comment cmt"># The task has not started yet. Its' 0% complete.</span>
-2148: <span class="ruby-identifier">completion</span> = <span class="ruby-value">0.0</span>
-2149: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'effort'</span>) <span class="ruby-operator">></span> <span class="ruby-value">0</span>
-2150: <span class="ruby-comment cmt"># Effort based leaf tasks. The completion degree is the percentage</span>
-2151: <span class="ruby-comment cmt"># of effort that has been done already.</span>
-2152: <span class="ruby-identifier">done</span> = <span class="ruby-identifier">getEffectiveWork</span>(<span class="ruby-ivar">@project</span>.<span class="ruby-identifier">dateToIdx</span>(<span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>), <span class="ruby-keyword kw">false</span>),
-2153: <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">dateToIdx</span>(<span class="ruby-ivar">@project</span>[<span class="ruby-value str">'now'</span>]))
-2154: <span class="ruby-identifier">total</span> = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">convertToDailyLoad</span>(
-2155: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'effort'</span>) * <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'scheduleGranularity'</span>])
-2156: <span class="ruby-identifier">completion</span> = <span class="ruby-identifier">done</span> <span class="ruby-operator">/</span> <span class="ruby-identifier">total</span> * <span class="ruby-value">100.0</span>
-2157: <span class="ruby-keyword kw">else</span>
-2158: <span class="ruby-comment cmt"># Length/duration leaf tasks.</span>
-2159: <span class="ruby-identifier">completion</span> = ((<span class="ruby-ivar">@project</span>[<span class="ruby-value str">'now'</span>] <span class="ruby-operator">-</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>)) <span class="ruby-operator">/</span>
-2160: (<span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>) <span class="ruby-operator">-</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>))) * <span class="ruby-value">100.0</span>
-2161: <span class="ruby-keyword kw">end</span>
-2162: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'complete'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = <span class="ruby-identifier">completion</span>
-2163: <span class="ruby-identifier">calcStatus</span>
-2164: <span class="ruby-keyword kw">end</span>
-2165:
-2166: <span class="ruby-identifier">completion</span>
-2167: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 2180</span>
+2180: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">calcCompletion</span>
+2181: <span class="ruby-comment cmt"># If the user provided a completion degree we are not touching it.</span>
+2182: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">provided</span>(<span class="ruby-value str">'complete'</span>, <span class="ruby-ivar">@scenarioIdx</span>)
+2183: <span class="ruby-identifier">calcStatus</span>
+2184: <span class="ruby-keyword kw">return</span> <span class="ruby-ivar">@complete</span>
+2185: <span class="ruby-keyword kw">end</span>
+2186:
+2187: <span class="ruby-comment cmt"># We cannot compute a completion degree without a start or end date.</span>
+2188: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@start</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@end</span>.<span class="ruby-identifier">nil?</span>
+2189: <span class="ruby-ivar">@complete</span> = <span class="ruby-value">0.0</span>
+2190: <span class="ruby-ivar">@status</span> = <span class="ruby-value str">'unknown'</span>
+2191: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span>
+2192: <span class="ruby-keyword kw">end</span>
+2193:
+2194: <span class="ruby-identifier">completion</span> = <span class="ruby-value">0.0</span>
+2195: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@milestone</span>
+2196: <span class="ruby-comment cmt"># Milestones are either 0% or 100% complete.</span>
+2197: <span class="ruby-ivar">@complete</span> = <span class="ruby-identifier">completion</span> = <span class="ruby-ivar">@end</span> <span class="ruby-operator"><=</span> <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'now'</span>] <span class="ruby-operator">?</span> <span class="ruby-value">100.0</span> <span class="ruby-operator">:</span> <span class="ruby-value">0.0</span>
+2198: <span class="ruby-ivar">@status</span> = <span class="ruby-ivar">@end</span> <span class="ruby-operator"><=</span> <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'now'</span>] <span class="ruby-operator">?</span> <span class="ruby-value str">'done'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'not reached'</span>
+2199: <span class="ruby-keyword kw">else</span>
+2200: <span class="ruby-comment cmt"># The task is in progress. Calculate the current completion</span>
+2201: <span class="ruby-comment cmt"># degree.</span>
+2202: <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">property</span>.<span class="ruby-identifier">leaf?</span>
+2203: <span class="ruby-comment cmt"># For container task the completion degree is the average of the</span>
+2204: <span class="ruby-comment cmt"># sub tasks.</span>
+2205: <span class="ruby-identifier">completion</span> = <span class="ruby-value">0.0</span>
+2206: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">kids</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">child</span><span class="ruby-operator">|</span>
+2207: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span> <span class="ruby-keyword kw">unless</span> (<span class="ruby-identifier">comp</span> = <span class="ruby-identifier">child</span>.<span class="ruby-identifier">calcCompletion</span>(<span class="ruby-ivar">@scenarioIdx</span>))
+2208: <span class="ruby-identifier">completion</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">comp</span>
+2209: <span class="ruby-keyword kw">end</span>
+2210: <span class="ruby-identifier">completion</span> <span class="ruby-operator">/=</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">children</span>.<span class="ruby-identifier">length</span>
+2211: <span class="ruby-keyword kw">elsif</span> <span class="ruby-ivar">@end</span> <span class="ruby-operator"><=</span> <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'now'</span>]
+2212: <span class="ruby-comment cmt"># The task has ended already. It's 100% complete.</span>
+2213: <span class="ruby-identifier">completion</span> = <span class="ruby-value">100.0</span>
+2214: <span class="ruby-keyword kw">elsif</span> <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'now'</span>] <span class="ruby-operator"><=</span> <span class="ruby-ivar">@start</span>
+2215: <span class="ruby-comment cmt"># The task has not started yet. Its' 0% complete.</span>
+2216: <span class="ruby-identifier">completion</span> = <span class="ruby-value">0.0</span>
+2217: <span class="ruby-keyword kw">elsif</span> <span class="ruby-ivar">@effort</span> <span class="ruby-operator">></span> <span class="ruby-value">0</span>
+2218: <span class="ruby-comment cmt"># Effort based leaf tasks. The completion degree is the percentage</span>
+2219: <span class="ruby-comment cmt"># of effort that has been done already.</span>
+2220: <span class="ruby-identifier">done</span> = <span class="ruby-identifier">getEffectiveWork</span>(<span class="ruby-ivar">@project</span>.<span class="ruby-identifier">dateToIdx</span>(<span class="ruby-ivar">@start</span>, <span class="ruby-keyword kw">false</span>),
+2221: <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">dateToIdx</span>(<span class="ruby-ivar">@project</span>[<span class="ruby-value str">'now'</span>]))
+2222: <span class="ruby-identifier">total</span> = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">convertToDailyLoad</span>(
+2223: <span class="ruby-ivar">@effort</span> * <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'scheduleGranularity'</span>])
+2224: <span class="ruby-identifier">completion</span> = <span class="ruby-identifier">done</span> <span class="ruby-operator">/</span> <span class="ruby-identifier">total</span> * <span class="ruby-value">100.0</span>
+2225: <span class="ruby-keyword kw">else</span>
+2226: <span class="ruby-comment cmt"># Length/duration leaf tasks.</span>
+2227: <span class="ruby-identifier">completion</span> = ((<span class="ruby-ivar">@project</span>[<span class="ruby-value str">'now'</span>] <span class="ruby-operator">-</span> <span class="ruby-ivar">@start</span>) <span class="ruby-operator">/</span>
+2228: (<span class="ruby-ivar">@end</span> <span class="ruby-operator">-</span> <span class="ruby-ivar">@start</span>)) * <span class="ruby-value">100.0</span>
+2229: <span class="ruby-keyword kw">end</span>
+2230: <span class="ruby-ivar">@complete</span> = <span class="ruby-identifier">completion</span>
+2231: <span class="ruby-identifier">calcStatus</span>
+2232: <span class="ruby-keyword kw">end</span>
+2233:
+2234: <span class="ruby-identifier">completion</span>
+2235: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -4011,32 +4139,32 @@
<div class="method-source-code"
id="calc-ath-riticalness-nd-uccs-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 2086</span>
-2086: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">calcPathCriticalnessEndSuccs</span>
-2087: <span class="ruby-identifier">maxCriticalness</span> = <span class="ruby-value">0.0</span>
-2088: <span class="ruby-comment cmt"># Gather a list of all end-successors of this task and its parent task.</span>
-2089: <span class="ruby-identifier">tList</span> = []
-2090: <span class="ruby-identifier">depStruct</span> = <span class="ruby-constant">Struct</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value">:task</span>, <span class="ruby-value">:onEnd</span>)
-2091: <span class="ruby-identifier">p</span> = <span class="ruby-ivar">@property</span>
-2092: <span class="ruby-keyword kw">while</span> (<span class="ruby-identifier">p</span>)
-2093: <span class="ruby-identifier">p</span>[<span class="ruby-value str">'endsuccs'</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
-2094: <span class="ruby-identifier">dep</span> = <span class="ruby-identifier">depStruct</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span>)
-2095: <span class="ruby-identifier">tList</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">dep</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">tList</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">dep</span>)
-2096: <span class="ruby-keyword kw">end</span>
-2097: <span class="ruby-identifier">p</span> = <span class="ruby-identifier">p</span>.<span class="ruby-identifier">parent</span>
-2098: <span class="ruby-keyword kw">end</span>
-2099:
-2100: <span class="ruby-identifier">tList</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">dep</span><span class="ruby-operator">|</span>
-2101: <span class="ruby-identifier">criticalness</span> = <span class="ruby-identifier">dep</span>.<span class="ruby-identifier">task</span>.<span class="ruby-identifier">calcPathCriticalness</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">dep</span>.<span class="ruby-identifier">onEnd</span>)
-2102: <span class="ruby-identifier">maxCriticalness</span> = <span class="ruby-identifier">criticalness</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">criticalness</span> <span class="ruby-operator">></span> <span class="ruby-identifier">maxCriticalness</span>
-2103: <span class="ruby-keyword kw">end</span>
-2104:
-2105: <span class="ruby-identifier">maxCriticalness</span>
-2106: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 2156</span>
+2156: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">calcPathCriticalnessEndSuccs</span>
+2157: <span class="ruby-identifier">maxCriticalness</span> = <span class="ruby-value">0.0</span>
+2158: <span class="ruby-comment cmt"># Gather a list of all end-successors of this task and its parent task.</span>
+2159: <span class="ruby-identifier">tList</span> = []
+2160: <span class="ruby-identifier">depStruct</span> = <span class="ruby-constant">Struct</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value">:task</span>, <span class="ruby-value">:onEnd</span>)
+2161: <span class="ruby-identifier">p</span> = <span class="ruby-ivar">@property</span>
+2162: <span class="ruby-keyword kw">while</span> (<span class="ruby-identifier">p</span>)
+2163: <span class="ruby-identifier">p</span>[<span class="ruby-value str">'endsuccs'</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
+2164: <span class="ruby-identifier">dep</span> = <span class="ruby-identifier">depStruct</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span>)
+2165: <span class="ruby-identifier">tList</span> <span class="ruby-operator"><<</span> <span class="ruby-identifier">dep</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">tList</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-identifier">dep</span>)
+2166: <span class="ruby-keyword kw">end</span>
+2167: <span class="ruby-identifier">p</span> = <span class="ruby-identifier">p</span>.<span class="ruby-identifier">parent</span>
+2168: <span class="ruby-keyword kw">end</span>
+2169:
+2170: <span class="ruby-identifier">tList</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">dep</span><span class="ruby-operator">|</span>
+2171: <span class="ruby-identifier">criticalness</span> = <span class="ruby-identifier">dep</span>.<span class="ruby-identifier">task</span>.<span class="ruby-identifier">calcPathCriticalness</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">dep</span>.<span class="ruby-identifier">onEnd</span>)
+2172: <span class="ruby-identifier">maxCriticalness</span> = <span class="ruby-identifier">criticalness</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">criticalness</span> <span class="ruby-operator">></span> <span class="ruby-identifier">maxCriticalness</span>
+2173: <span class="ruby-keyword kw">end</span>
+2174:
+2175: <span class="ruby-identifier">maxCriticalness</span>
+2176: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -4066,21 +4194,20 @@
<div class="method-source-code"
id="calc-tatus-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 2170</span>
-2170: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">calcStatus</span>
-2171: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'status'</span>, <span class="ruby-ivar">@scenarioIdx</span>] =
-2172: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'complete'</span>) <span class="ruby-operator">==</span> <span class="ruby-value">0.0</span>
-2173: <span class="ruby-value str">'not started'</span>
-2174: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'complete'</span>) <span class="ruby-operator">>=</span> <span class="ruby-value">100.0</span>
-2175: <span class="ruby-value str">'done'</span>
-2176: <span class="ruby-keyword kw">else</span>
-2177: <span class="ruby-value str">'in progress'</span>
-2178: <span class="ruby-keyword kw">end</span>
-2179: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 2238</span>
+2238: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">calcStatus</span>
+2239: <span class="ruby-ivar">@status</span> = <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@complete</span> <span class="ruby-operator">==</span> <span class="ruby-value">0.0</span>
+2240: <span class="ruby-value str">'not started'</span>
+2241: <span class="ruby-keyword kw">elsif</span> <span class="ruby-ivar">@complete</span> <span class="ruby-operator">>=</span> <span class="ruby-value">100.0</span>
+2242: <span class="ruby-value str">'done'</span>
+2243: <span class="ruby-keyword kw">else</span>
+2244: <span class="ruby-value str">'in progress'</span>
+2245: <span class="ruby-keyword kw">end</span>
+2246: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -4107,55 +4234,56 @@
<div class="method-source-code"
id="check-ependency-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 2004</span>
-2004: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">checkDependency</span>(<span class="ruby-identifier">dependency</span>, <span class="ruby-identifier">depType</span>)
-2005: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">depTask</span> = <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">resolve</span>(<span class="ruby-ivar">@project</span>)).<span class="ruby-identifier">nil?</span>
-2006: <span class="ruby-comment cmt"># Remove the broken dependency. It could cause trouble later on.</span>
-2007: <span class="ruby-ivar">@property</span>[<span class="ruby-identifier">depType</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">dependency</span>)
-2008: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_depend_unknown'</span>,
-2009: <span class="ruby-node">"Task #{@property.fullId} has unknown #{depType} "</span> <span class="ruby-operator">+</span>
-2010: <span class="ruby-node">"#{dependency.taskId}"</span>)
-2011: <span class="ruby-keyword kw">end</span>
-2012:
-2013: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">depTask</span> <span class="ruby-operator">==</span> <span class="ruby-ivar">@property</span>
-2014: <span class="ruby-comment cmt"># Remove the broken dependency. It could cause trouble later on.</span>
-2015: <span class="ruby-ivar">@property</span>[<span class="ruby-identifier">depType</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">dependency</span>)
-2016: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_depend_self'</span>, <span class="ruby-node">"Task #{@property.fullId} cannot "</span> <span class="ruby-operator">+</span>
-2017: <span class="ruby-value str">"depend on self"</span>)
-2018: <span class="ruby-keyword kw">end</span>
-2019:
-2020: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">depTask</span>.<span class="ruby-identifier">isChildOf?</span>(<span class="ruby-ivar">@property</span>)
-2021: <span class="ruby-comment cmt"># Remove the broken dependency. It could cause trouble later on.</span>
-2022: <span class="ruby-ivar">@property</span>[<span class="ruby-identifier">depType</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">dependency</span>)
-2023: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_depend_child'</span>,
-2024: <span class="ruby-node">"Task #{@property.fullId} cannot depend on child "</span> <span class="ruby-operator">+</span>
-2025: <span class="ruby-node">"#{depTask.fullId}"</span>)
-2026: <span class="ruby-keyword kw">end</span>
-2027:
-2028: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">isChildOf?</span>(<span class="ruby-identifier">depTask</span>)
-2029: <span class="ruby-comment cmt"># Remove the broken dependency. It could cause trouble later on.</span>
-2030: <span class="ruby-ivar">@property</span>[<span class="ruby-identifier">depType</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">dependency</span>)
-2031: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_depend_parent'</span>,
-2032: <span class="ruby-node">"Task #{@property.fullId} cannot depend on parent "</span> <span class="ruby-operator">+</span>
-2033: <span class="ruby-node">"#{depTask.fullId}"</span>)
-2034: <span class="ruby-keyword kw">end</span>
-2035:
-2036: <span class="ruby-ivar">@property</span>[<span class="ruby-identifier">depType</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">dep</span><span class="ruby-operator">|</span>
-2037: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">dep</span>.<span class="ruby-identifier">task</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">depTask</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">dep</span>.<span class="ruby-identifier">equal?</span>(<span class="ruby-identifier">dependency</span>)
-2038: <span class="ruby-comment cmt"># Remove the broken dependency. It could cause trouble later on.</span>
-2039: <span class="ruby-ivar">@property</span>[<span class="ruby-identifier">depType</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">dependency</span>)
-2040: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_depend_multi'</span>,
-2041: <span class="ruby-node">"No need to specify dependency #{depTask.fullId} multiple "</span> <span class="ruby-operator">+</span>
-2042: <span class="ruby-node">"times for task #{@property.fullId}."</span>)
-2043: <span class="ruby-keyword kw">end</span>
-2044: <span class="ruby-keyword kw">end</span>
-2045:
-2046: <span class="ruby-identifier">depTask</span>
-2047: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 2073</span>
+2073: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">checkDependency</span>(<span class="ruby-identifier">dependency</span>, <span class="ruby-identifier">depType</span>)
+2074: <span class="ruby-identifier">depList</span> = <span class="ruby-identifier">instance_variable_get</span>((<span class="ruby-value str">'@'</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">depType</span>).<span class="ruby-identifier">intern</span>)
+2075: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">depTask</span> = <span class="ruby-identifier">dependency</span>.<span class="ruby-identifier">resolve</span>(<span class="ruby-ivar">@project</span>)).<span class="ruby-identifier">nil?</span>
+2076: <span class="ruby-comment cmt"># Remove the broken dependency. It could cause trouble later on.</span>
+2077: <span class="ruby-identifier">depList</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">dependency</span>)
+2078: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_depend_unknown'</span>,
+2079: <span class="ruby-node">"Task #{@property.fullId} has unknown #{depType} "</span> <span class="ruby-operator">+</span>
+2080: <span class="ruby-node">"#{dependency.taskId}"</span>)
+2081: <span class="ruby-keyword kw">end</span>
+2082:
+2083: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">depTask</span> <span class="ruby-operator">==</span> <span class="ruby-ivar">@property</span>
+2084: <span class="ruby-comment cmt"># Remove the broken dependency. It could cause trouble later on.</span>
+2085: <span class="ruby-identifier">depList</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">dependency</span>)
+2086: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_depend_self'</span>, <span class="ruby-node">"Task #{@property.fullId} cannot "</span> <span class="ruby-operator">+</span>
+2087: <span class="ruby-value str">"depend on self"</span>)
+2088: <span class="ruby-keyword kw">end</span>
+2089:
+2090: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">depTask</span>.<span class="ruby-identifier">isChildOf?</span>(<span class="ruby-ivar">@property</span>)
+2091: <span class="ruby-comment cmt"># Remove the broken dependency. It could cause trouble later on.</span>
+2092: <span class="ruby-identifier">depList</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">dependency</span>)
+2093: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_depend_child'</span>,
+2094: <span class="ruby-node">"Task #{@property.fullId} cannot depend on child "</span> <span class="ruby-operator">+</span>
+2095: <span class="ruby-node">"#{depTask.fullId}"</span>)
+2096: <span class="ruby-keyword kw">end</span>
+2097:
+2098: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">isChildOf?</span>(<span class="ruby-identifier">depTask</span>)
+2099: <span class="ruby-comment cmt"># Remove the broken dependency. It could cause trouble later on.</span>
+2100: <span class="ruby-identifier">depList</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">dependency</span>)
+2101: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_depend_parent'</span>,
+2102: <span class="ruby-node">"Task #{@property.fullId} cannot depend on parent "</span> <span class="ruby-operator">+</span>
+2103: <span class="ruby-node">"#{depTask.fullId}"</span>)
+2104: <span class="ruby-keyword kw">end</span>
+2105:
+2106: <span class="ruby-identifier">depList</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">dep</span><span class="ruby-operator">|</span>
+2107: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">dep</span>.<span class="ruby-identifier">task</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">depTask</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">dep</span>.<span class="ruby-identifier">equal?</span>(<span class="ruby-identifier">dependency</span>)
+2108: <span class="ruby-comment cmt"># Remove the broken dependency. It could cause trouble later on.</span>
+2109: <span class="ruby-identifier">depList</span>.<span class="ruby-identifier">delete</span>(<span class="ruby-identifier">dependency</span>)
+2110: <span class="ruby-identifier">error</span>(<span class="ruby-value str">'task_depend_multi'</span>,
+2111: <span class="ruby-node">"No need to specify dependency #{depTask.fullId} multiple "</span> <span class="ruby-operator">+</span>
+2112: <span class="ruby-node">"times for task #{@property.fullId}."</span>)
+2113: <span class="ruby-keyword kw">end</span>
+2114: <span class="ruby-keyword kw">end</span>
+2115:
+2116: <span class="ruby-identifier">depTask</span>
+2117: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -4182,23 +4310,23 @@
<div class="method-source-code"
id="find-ookings-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 2340</span>
-2340: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">findBookings</span>
-2341: <span class="ruby-comment cmt"># Map the index back to the Scenario object.</span>
-2342: <span class="ruby-identifier">scenario</span> = <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">project</span>.<span class="ruby-identifier">scenario</span>(<span class="ruby-ivar">@scenarioIdx</span>)
-2343: <span class="ruby-comment cmt"># Check if the current scenario should inherit its bookings from the</span>
-2344: <span class="ruby-comment cmt"># parent. If so, redirect 'scenario' to the parent. The top-level</span>
-2345: <span class="ruby-comment cmt"># scenario can never inherit bookings.</span>
-2346: <span class="ruby-keyword kw">while</span> <span class="ruby-operator">!</span><span class="ruby-identifier">scenario</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'ownbookings'</span>) <span class="ruby-keyword kw">do</span>
-2347: <span class="ruby-identifier">scenario</span> = <span class="ruby-identifier">scenario</span>.<span class="ruby-identifier">parent</span>
-2348: <span class="ruby-keyword kw">end</span>
-2349: <span class="ruby-comment cmt"># Return the bookings of the found scenario.</span>
-2350: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'booking'</span>, <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">project</span>.<span class="ruby-identifier">scenarioIdx</span>(<span class="ruby-identifier">scenario</span>)]
-2351: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 2407</span>
+2407: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">findBookings</span>
+2408: <span class="ruby-comment cmt"># Map the index back to the Scenario object.</span>
+2409: <span class="ruby-identifier">scenario</span> = <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">project</span>.<span class="ruby-identifier">scenario</span>(<span class="ruby-ivar">@scenarioIdx</span>)
+2410: <span class="ruby-comment cmt"># Check if the current scenario should inherit its bookings from the</span>
+2411: <span class="ruby-comment cmt"># parent. If so, redirect 'scenario' to the parent. The top-level</span>
+2412: <span class="ruby-comment cmt"># scenario can never inherit bookings.</span>
+2413: <span class="ruby-keyword kw">while</span> <span class="ruby-operator">!</span><span class="ruby-identifier">scenario</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'ownbookings'</span>) <span class="ruby-keyword kw">do</span>
+2414: <span class="ruby-identifier">scenario</span> = <span class="ruby-identifier">scenario</span>.<span class="ruby-identifier">parent</span>
+2415: <span class="ruby-keyword kw">end</span>
+2416: <span class="ruby-comment cmt"># Return the bookings of the found scenario.</span>
+2417: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'booking'</span>, <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">project</span>.<span class="ruby-identifier">scenarioIdx</span>(<span class="ruby-identifier">scenario</span>)]
+2418: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -4225,25 +4353,25 @@
<div class="method-source-code"
id="generate-epency-ist-tem-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 2305</span>
-2305: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">generateDepencyListItem</span>(<span class="ruby-identifier">query</span>, <span class="ruby-identifier">task</span>, <span class="ruby-identifier">dep</span>, <span class="ruby-identifier">date</span>)
-2306: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">query</span>.<span class="ruby-identifier">listItem</span>
-2307: <span class="ruby-identifier">rti</span> = <span class="ruby-constant">RichText</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">listItem</span>, <span class="ruby-constant">RTFHandlers</span>.<span class="ruby-identifier">create</span>(<span class="ruby-ivar">@project</span>),
-2308: <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">messageHandler</span>).<span class="ruby-identifier">generateIntermediateFormat</span>
-2309: <span class="ruby-identifier">q</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">dup</span>
-2310: <span class="ruby-identifier">q</span>.<span class="ruby-identifier">property</span> = <span class="ruby-identifier">task</span>
-2311: <span class="ruby-identifier">q</span>.<span class="ruby-identifier">setCustomData</span>(<span class="ruby-value str">'dependency'</span>, { <span class="ruby-value">:string</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">dep</span> })
-2312: <span class="ruby-identifier">q</span>.<span class="ruby-identifier">setCustomData</span>(<span class="ruby-value str">'date'</span>, { <span class="ruby-value">:string</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">date</span> })
-2313: <span class="ruby-identifier">rti</span>.<span class="ruby-identifier">setQuery</span>(<span class="ruby-identifier">q</span>)
-2314: <span class="ruby-node">"<nowiki>#{rti.to_s}</nowiki>"</span>
-2315: <span class="ruby-keyword kw">else</span>
-2316: <span class="ruby-node">"<nowiki>#{task.name} (#{task.fullId}) #{dep} #{date}</nowiki>"</span>
-2317: <span class="ruby-keyword kw">end</span>
-2318: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 2372</span>
+2372: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">generateDepencyListItem</span>(<span class="ruby-identifier">query</span>, <span class="ruby-identifier">task</span>, <span class="ruby-identifier">dep</span>, <span class="ruby-identifier">date</span>)
+2373: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">query</span>.<span class="ruby-identifier">listItem</span>
+2374: <span class="ruby-identifier">rti</span> = <span class="ruby-constant">RichText</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">listItem</span>, <span class="ruby-constant">RTFHandlers</span>.<span class="ruby-identifier">create</span>(<span class="ruby-ivar">@project</span>),
+2375: <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">messageHandler</span>).<span class="ruby-identifier">generateIntermediateFormat</span>
+2376: <span class="ruby-identifier">q</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">dup</span>
+2377: <span class="ruby-identifier">q</span>.<span class="ruby-identifier">property</span> = <span class="ruby-identifier">task</span>
+2378: <span class="ruby-identifier">q</span>.<span class="ruby-identifier">setCustomData</span>(<span class="ruby-value str">'dependency'</span>, { <span class="ruby-value">:string</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">dep</span> })
+2379: <span class="ruby-identifier">q</span>.<span class="ruby-identifier">setCustomData</span>(<span class="ruby-value str">'date'</span>, { <span class="ruby-value">:string</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">date</span> })
+2380: <span class="ruby-identifier">rti</span>.<span class="ruby-identifier">setQuery</span>(<span class="ruby-identifier">q</span>)
+2381: <span class="ruby-node">"<nowiki>#{rti.to_s}</nowiki>"</span>
+2382: <span class="ruby-keyword kw">else</span>
+2383: <span class="ruby-node">"<nowiki>#{task.name} (#{task.fullId}) #{dep} #{date}</nowiki>"</span>
+2384: <span class="ruby-keyword kw">end</span>
+2385: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -4270,30 +4398,30 @@
<div class="method-source-code"
id="generate-ask-ist-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 2320</span>
-2320: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">generateTaskList</span>(<span class="ruby-identifier">taskList</span>, <span class="ruby-identifier">query</span>)
-2321: <span class="ruby-identifier">list</span> = []
-2322: <span class="ruby-identifier">taskList</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span><span class="ruby-operator">|</span>
-2323: <span class="ruby-identifier">date</span> = <span class="ruby-identifier">task</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>].
-2324: <span class="ruby-identifier">to_s</span>(<span class="ruby-ivar">@property</span>.<span class="ruby-identifier">project</span>[<span class="ruby-value str">'timeFormat'</span>])
-2325: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">query</span>.<span class="ruby-identifier">listItem</span>
-2326: <span class="ruby-identifier">rti</span> = <span class="ruby-constant">RichText</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">listItem</span>, <span class="ruby-constant">RTFHandlers</span>.<span class="ruby-identifier">create</span>(<span class="ruby-ivar">@project</span>),
-2327: <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">messageHandler</span>).<span class="ruby-identifier">generateIntermediateFormat</span>
-2328: <span class="ruby-identifier">q</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">dup</span>
-2329: <span class="ruby-identifier">q</span>.<span class="ruby-identifier">property</span> = <span class="ruby-identifier">task</span>
-2330: <span class="ruby-identifier">q</span>.<span class="ruby-identifier">setCustomData</span>(<span class="ruby-value str">'date'</span>, { <span class="ruby-value">:string</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">date</span> })
-2331: <span class="ruby-identifier">rti</span>.<span class="ruby-identifier">setQuery</span>(<span class="ruby-identifier">q</span>)
-2332: <span class="ruby-identifier">list</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"<nowiki>#{rti.to_s}</nowiki>"</span>
-2333: <span class="ruby-keyword kw">else</span>
-2334: <span class="ruby-identifier">list</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"<nowiki>#{task.name} (#{task.fullId}) #{date}</nowiki>"</span>
-2335: <span class="ruby-keyword kw">end</span>
-2336: <span class="ruby-keyword kw">end</span>
-2337: <span class="ruby-identifier">list</span>
-2338: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 2387</span>
+2387: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">generateTaskList</span>(<span class="ruby-identifier">taskList</span>, <span class="ruby-identifier">query</span>)
+2388: <span class="ruby-identifier">list</span> = []
+2389: <span class="ruby-identifier">taskList</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span><span class="ruby-operator">|</span>
+2390: <span class="ruby-identifier">date</span> = <span class="ruby-identifier">task</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>].
+2391: <span class="ruby-identifier">to_s</span>(<span class="ruby-ivar">@property</span>.<span class="ruby-identifier">project</span>[<span class="ruby-value str">'timeFormat'</span>])
+2392: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">query</span>.<span class="ruby-identifier">listItem</span>
+2393: <span class="ruby-identifier">rti</span> = <span class="ruby-constant">RichText</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">query</span>.<span class="ruby-identifier">listItem</span>, <span class="ruby-constant">RTFHandlers</span>.<span class="ruby-identifier">create</span>(<span class="ruby-ivar">@project</span>),
+2394: <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">messageHandler</span>).<span class="ruby-identifier">generateIntermediateFormat</span>
+2395: <span class="ruby-identifier">q</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">dup</span>
+2396: <span class="ruby-identifier">q</span>.<span class="ruby-identifier">property</span> = <span class="ruby-identifier">task</span>
+2397: <span class="ruby-identifier">q</span>.<span class="ruby-identifier">setCustomData</span>(<span class="ruby-value str">'date'</span>, { <span class="ruby-value">:string</span> =<span class="ruby-operator">></span> <span class="ruby-identifier">date</span> })
+2398: <span class="ruby-identifier">rti</span>.<span class="ruby-identifier">setQuery</span>(<span class="ruby-identifier">q</span>)
+2399: <span class="ruby-identifier">list</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"<nowiki>#{rti.to_s}</nowiki>"</span>
+2400: <span class="ruby-keyword kw">else</span>
+2401: <span class="ruby-identifier">list</span> <span class="ruby-operator"><<</span> <span class="ruby-node">"<nowiki>#{task.name} (#{task.fullId}) #{date}</nowiki>"</span>
+2402: <span class="ruby-keyword kw">end</span>
+2403: <span class="ruby-keyword kw">end</span>
+2404: <span class="ruby-identifier">list</span>
+2405: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -4324,15 +4452,15 @@
<div class="method-source-code"
id="has-ependencies-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1866</span>
-1866: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">hasDependencies</span>(<span class="ruby-identifier">atEnd</span>)
-1867: <span class="ruby-identifier">thisEnd</span> = <span class="ruby-identifier">atEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'end'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'start'</span>
-1868: <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-identifier">thisEnd</span> <span class="ruby-operator">+</span> <span class="ruby-value str">'succs'</span>).<span class="ruby-identifier">empty?</span> <span class="ruby-operator">||</span> <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-identifier">thisEnd</span> <span class="ruby-operator">+</span> <span class="ruby-value str">'preds'</span>).<span class="ruby-identifier">empty?</span>
-1869: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1936</span>
+1936: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">hasDependencies</span>(<span class="ruby-identifier">atEnd</span>)
+1937: <span class="ruby-identifier">thisEnd</span> = <span class="ruby-identifier">atEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'end'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'start'</span>
+1938: <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-identifier">thisEnd</span> <span class="ruby-operator">+</span> <span class="ruby-value str">'succs'</span>).<span class="ruby-identifier">empty?</span> <span class="ruby-operator">||</span> <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-identifier">thisEnd</span> <span class="ruby-operator">+</span> <span class="ruby-value str">'preds'</span>).<span class="ruby-identifier">empty?</span>
+1939: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -4362,20 +4490,20 @@
<div class="method-source-code"
id="has-redecessors-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1873</span>
-1873: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">hasPredecessors</span>
-1874: <span class="ruby-identifier">t</span> = <span class="ruby-ivar">@property</span>
-1875: <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">t</span>
-1876: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">t</span>[<span class="ruby-value str">'startpreds'</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">empty?</span>
-1877: <span class="ruby-identifier">t</span> = <span class="ruby-identifier">t</span>.<span class="ruby-identifier">parent</span>
-1878: <span class="ruby-keyword kw">end</span>
-1879:
-1880: <span class="ruby-keyword kw">false</span>
-1881: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1943</span>
+1943: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">hasPredecessors</span>
+1944: <span class="ruby-identifier">t</span> = <span class="ruby-ivar">@property</span>
+1945: <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">t</span>
+1946: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">t</span>[<span class="ruby-value str">'startpreds'</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">empty?</span>
+1947: <span class="ruby-identifier">t</span> = <span class="ruby-identifier">t</span>.<span class="ruby-identifier">parent</span>
+1948: <span class="ruby-keyword kw">end</span>
+1949:
+1950: <span class="ruby-keyword kw">false</span>
+1951: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -4402,88 +4530,88 @@
<div class="method-source-code"
id="has-trong-eps-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1895</span>
-1895: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">hasStrongDeps</span>(<span class="ruby-identifier">atEnd</span>)
-1896: <span class="ruby-comment cmt"># A dependency that could determine the date on this side of the</span>
-1897: <span class="ruby-comment cmt"># dependency is a strong dependency. If the scheduling direction of the</span>
-1898: <span class="ruby-comment cmt"># task on the other side leads away from the dependency point, then the</span>
-1899: <span class="ruby-comment cmt"># dependency is weak. This date will influence the other date for weak</span>
-1900: <span class="ruby-comment cmt"># dependencies. > means ASAP task, < means ALAP task.</span>
-1901: <span class="ruby-comment cmt">#</span>
-1902: <span class="ruby-comment cmt">#</span>
-1903: <span class="ruby-comment cmt"># T2 depends on T1 start</span>
-1904: <span class="ruby-comment cmt">#</span>
-1905: <span class="ruby-comment cmt"># +--- SS -> S> : Weak</span>
-1906: <span class="ruby-comment cmt"># |-+ SS -> S< : Weak</span>
-1907: <span class="ruby-comment cmt"># +-|- SP -> S> : Strong</span>
-1908: <span class="ruby-comment cmt"># | +--- SP -> S< : Strong</span>
-1909: <span class="ruby-comment cmt"># +-|</span>
-1910: <span class="ruby-comment cmt"># +---</span>
-1911: <span class="ruby-comment cmt">#</span>
-1912: <span class="ruby-comment cmt">#</span>
-1913: <span class="ruby-comment cmt"># T2 depends on T1 end</span>
-1914: <span class="ruby-comment cmt"># T1 precedes T2 start</span>
-1915: <span class="ruby-comment cmt">#</span>
-1916: <span class="ruby-comment cmt"># ---+ ES -> S> : Weak</span>
-1917: <span class="ruby-comment cmt"># |-+ ES -> S< : Strong</span>
-1918: <span class="ruby-comment cmt"># ---+ | SP -> E> : Strong</span>
-1919: <span class="ruby-comment cmt"># | +--- SP -> E< : Weak</span>
-1920: <span class="ruby-comment cmt"># +-|</span>
-1921: <span class="ruby-comment cmt"># +---</span>
-1922: <span class="ruby-comment cmt">#</span>
-1923: <span class="ruby-comment cmt">#</span>
-1924: <span class="ruby-comment cmt"># T1 precedes T2 end</span>
-1925: <span class="ruby-comment cmt">#</span>
-1926: <span class="ruby-comment cmt"># ---+ ES -> E> : Strong</span>
-1927: <span class="ruby-comment cmt"># +-| ES -> E< : Strong</span>
-1928: <span class="ruby-comment cmt"># -|-+ EP -> E> : Weak</span>
-1929: <span class="ruby-comment cmt"># ---+ | EP -> E< : Weak</span>
-1930: <span class="ruby-comment cmt"># |-+</span>
-1931: <span class="ruby-comment cmt"># ---+</span>
-1932: <span class="ruby-comment cmt">#</span>
-1933: <span class="ruby-comment cmt"># All other combinations are illegal and should be caught earlier. So,</span>
-1934: <span class="ruby-comment cmt"># illegal values can be considered don't care values.</span>
-1935: <span class="ruby-comment cmt">#</span>
-1936: <span class="ruby-comment cmt"># f/t S> S< E> E<</span>
-1937: <span class="ruby-comment cmt"># SP S S S W Row 1</span>
-1938: <span class="ruby-comment cmt"># SS W W x x Row 2</span>
-1939: <span class="ruby-comment cmt"># EP x x W W Row 3</span>
-1940: <span class="ruby-comment cmt"># ES W S S S Row 4</span>
-1941: <span class="ruby-comment cmt">#</span>
-1942: <span class="ruby-comment cmt"># If the other end of the dependency already has a date, it's a strong</span>
-1943: <span class="ruby-comment cmt"># dependency no matter how it was set.</span>
-1944: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">atEnd</span>
-1945: <span class="ruby-comment cmt"># Row 1</span>
-1946: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'startpreds'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
-1947: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">onEnd</span> <span class="ruby-operator">&&</span> (<span class="ruby-identifier">task</span>[<span class="ruby-value str">'forward'</span>, <span class="ruby-ivar">@scenarioIdx</span>] <span class="ruby-operator">||</span>
-1948: <span class="ruby-identifier">task</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-ivar">@scenarioIdx</span>])) <span class="ruby-operator">||</span> <span class="ruby-operator">!</span><span class="ruby-identifier">onEnd</span>
-1949: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span>
-1950: <span class="ruby-keyword kw">end</span>
-1951: <span class="ruby-keyword kw">end</span>
-1952: <span class="ruby-comment cmt"># Row 2</span>
-1953: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'startsuccs'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
-1954: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">task</span>[<span class="ruby-identifier">onEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'end'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
-1955: <span class="ruby-keyword kw">end</span>
-1956: <span class="ruby-keyword kw">else</span>
-1957: <span class="ruby-comment cmt"># Row 3</span>
-1958: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'endpreds'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
-1959: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">task</span>[<span class="ruby-identifier">onEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'end'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
-1960: <span class="ruby-keyword kw">end</span>
-1961: <span class="ruby-comment cmt"># Row 4</span>
-1962: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'endsuccs'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
-1963: <span class="ruby-keyword kw">if</span> (<span class="ruby-operator">!</span><span class="ruby-identifier">onEnd</span> <span class="ruby-operator">&&</span> (<span class="ruby-operator">!</span><span class="ruby-identifier">task</span>[<span class="ruby-value str">'forward'</span>, <span class="ruby-ivar">@scenarioIdx</span>] <span class="ruby-operator">||</span>
-1964: <span class="ruby-identifier">task</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>])) <span class="ruby-operator">||</span> <span class="ruby-identifier">onEnd</span>
-1965: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span>
-1966: <span class="ruby-keyword kw">end</span>
-1967: <span class="ruby-keyword kw">end</span>
-1968: <span class="ruby-keyword kw">end</span>
-1969:
-1970: <span class="ruby-keyword kw">false</span>
-1971: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1965</span>
+1965: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">hasStrongDeps</span>(<span class="ruby-identifier">atEnd</span>)
+1966: <span class="ruby-comment cmt"># A dependency that could determine the date on this side of the</span>
+1967: <span class="ruby-comment cmt"># dependency is a strong dependency. If the scheduling direction of the</span>
+1968: <span class="ruby-comment cmt"># task on the other side leads away from the dependency point, then the</span>
+1969: <span class="ruby-comment cmt"># dependency is weak. This date will influence the other date for weak</span>
+1970: <span class="ruby-comment cmt"># dependencies. > means ASAP task, < means ALAP task.</span>
+1971: <span class="ruby-comment cmt">#</span>
+1972: <span class="ruby-comment cmt">#</span>
+1973: <span class="ruby-comment cmt"># T2 depends on T1 start</span>
+1974: <span class="ruby-comment cmt">#</span>
+1975: <span class="ruby-comment cmt"># +--- SS -> S> : Weak</span>
+1976: <span class="ruby-comment cmt"># |-+ SS -> S< : Weak</span>
+1977: <span class="ruby-comment cmt"># +-|- SP -> S> : Strong</span>
+1978: <span class="ruby-comment cmt"># | +--- SP -> S< : Strong</span>
+1979: <span class="ruby-comment cmt"># +-|</span>
+1980: <span class="ruby-comment cmt"># +---</span>
+1981: <span class="ruby-comment cmt">#</span>
+1982: <span class="ruby-comment cmt">#</span>
+1983: <span class="ruby-comment cmt"># T2 depends on T1 end</span>
+1984: <span class="ruby-comment cmt"># T1 precedes T2 start</span>
+1985: <span class="ruby-comment cmt">#</span>
+1986: <span class="ruby-comment cmt"># ---+ ES -> S> : Weak</span>
+1987: <span class="ruby-comment cmt"># |-+ ES -> S< : Strong</span>
+1988: <span class="ruby-comment cmt"># ---+ | SP -> E> : Strong</span>
+1989: <span class="ruby-comment cmt"># | +--- SP -> E< : Weak</span>
+1990: <span class="ruby-comment cmt"># +-|</span>
+1991: <span class="ruby-comment cmt"># +---</span>
+1992: <span class="ruby-comment cmt">#</span>
+1993: <span class="ruby-comment cmt">#</span>
+1994: <span class="ruby-comment cmt"># T1 precedes T2 end</span>
+1995: <span class="ruby-comment cmt">#</span>
+1996: <span class="ruby-comment cmt"># ---+ ES -> E> : Strong</span>
+1997: <span class="ruby-comment cmt"># +-| ES -> E< : Strong</span>
+1998: <span class="ruby-comment cmt"># -|-+ EP -> E> : Weak</span>
+1999: <span class="ruby-comment cmt"># ---+ | EP -> E< : Weak</span>
+2000: <span class="ruby-comment cmt"># |-+</span>
+2001: <span class="ruby-comment cmt"># ---+</span>
+2002: <span class="ruby-comment cmt">#</span>
+2003: <span class="ruby-comment cmt"># All other combinations are illegal and should be caught earlier. So,</span>
+2004: <span class="ruby-comment cmt"># illegal values can be considered don't care values.</span>
+2005: <span class="ruby-comment cmt">#</span>
+2006: <span class="ruby-comment cmt"># f/t S> S< E> E<</span>
+2007: <span class="ruby-comment cmt"># SP S S S W Row 1</span>
+2008: <span class="ruby-comment cmt"># SS W W x x Row 2</span>
+2009: <span class="ruby-comment cmt"># EP x x W W Row 3</span>
+2010: <span class="ruby-comment cmt"># ES W S S S Row 4</span>
+2011: <span class="ruby-comment cmt">#</span>
+2012: <span class="ruby-comment cmt"># If the other end of the dependency already has a date, it's a strong</span>
+2013: <span class="ruby-comment cmt"># dependency no matter how it was set.</span>
+2014: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">atEnd</span>
+2015: <span class="ruby-comment cmt"># Row 1</span>
+2016: <span class="ruby-ivar">@startpreds</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
+2017: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">onEnd</span> <span class="ruby-operator">&&</span> (<span class="ruby-identifier">task</span>[<span class="ruby-value str">'forward'</span>, <span class="ruby-ivar">@scenarioIdx</span>] <span class="ruby-operator">||</span>
+2018: <span class="ruby-identifier">task</span>[<span class="ruby-value str">'end'</span>, <span class="ruby-ivar">@scenarioIdx</span>])) <span class="ruby-operator">||</span> <span class="ruby-operator">!</span><span class="ruby-identifier">onEnd</span>
+2019: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span>
+2020: <span class="ruby-keyword kw">end</span>
+2021: <span class="ruby-keyword kw">end</span>
+2022: <span class="ruby-comment cmt"># Row 2</span>
+2023: <span class="ruby-ivar">@startsuccs</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
+2024: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">task</span>[<span class="ruby-identifier">onEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'end'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
+2025: <span class="ruby-keyword kw">end</span>
+2026: <span class="ruby-keyword kw">else</span>
+2027: <span class="ruby-comment cmt"># Row 3</span>
+2028: <span class="ruby-ivar">@endpreds</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
+2029: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">task</span>[<span class="ruby-identifier">onEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'end'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>]
+2030: <span class="ruby-keyword kw">end</span>
+2031: <span class="ruby-comment cmt"># Row 4</span>
+2032: <span class="ruby-ivar">@endsuccs</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">task</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
+2033: <span class="ruby-keyword kw">if</span> (<span class="ruby-operator">!</span><span class="ruby-identifier">onEnd</span> <span class="ruby-operator">&&</span> (<span class="ruby-operator">!</span><span class="ruby-identifier">task</span>[<span class="ruby-value str">'forward'</span>, <span class="ruby-ivar">@scenarioIdx</span>] <span class="ruby-operator">||</span>
+2034: <span class="ruby-identifier">task</span>[<span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>])) <span class="ruby-operator">||</span> <span class="ruby-identifier">onEnd</span>
+2035: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span>
+2036: <span class="ruby-keyword kw">end</span>
+2037: <span class="ruby-keyword kw">end</span>
+2038: <span class="ruby-keyword kw">end</span>
+2039:
+2040: <span class="ruby-keyword kw">false</span>
+2041: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -4513,20 +4641,20 @@
<div class="method-source-code"
id="has-uccessors-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1885</span>
-1885: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">hasSuccessors</span>
-1886: <span class="ruby-identifier">t</span> = <span class="ruby-ivar">@property</span>
-1887: <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">t</span>
-1888: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">t</span>[<span class="ruby-value str">'endsuccs'</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">empty?</span>
-1889: <span class="ruby-identifier">t</span> = <span class="ruby-identifier">t</span>.<span class="ruby-identifier">parent</span>
-1890: <span class="ruby-keyword kw">end</span>
-1891:
-1892: <span class="ruby-keyword kw">false</span>
-1893: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1955</span>
+1955: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">hasSuccessors</span>
+1956: <span class="ruby-identifier">t</span> = <span class="ruby-ivar">@property</span>
+1957: <span class="ruby-keyword kw">while</span> <span class="ruby-identifier">t</span>
+1958: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">t</span>[<span class="ruby-value str">'endsuccs'</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">empty?</span>
+1959: <span class="ruby-identifier">t</span> = <span class="ruby-identifier">t</span>.<span class="ruby-identifier">parent</span>
+1960: <span class="ruby-keyword kw">end</span>
+1961:
+1962: <span class="ruby-keyword kw">false</span>
+1963: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -4556,41 +4684,41 @@
<div class="method-source-code"
id="inputs-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 2183</span>
-2183: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">inputs</span>(<span class="ruby-identifier">list</span>, <span class="ruby-identifier">includeChildren</span>)
-2184: <span class="ruby-comment cmt"># Ignore tasks that we have already included in the list.</span>
-2185: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">list</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-ivar">@property</span>)
-2186:
-2187: <span class="ruby-comment cmt"># A target must be a leaf function that has no direct or indirect</span>
-2188: <span class="ruby-comment cmt"># (through parent) following tasks. Only milestones are recognized as</span>
-2189: <span class="ruby-comment cmt"># targets.</span>
-2190: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">leaf?</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">hasPredecessors</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'milestone'</span>)
-2191: <span class="ruby-identifier">list</span> <span class="ruby-operator"><<</span> <span class="ruby-ivar">@property</span>
-2192: <span class="ruby-keyword kw">return</span>
-2193: <span class="ruby-keyword kw">end</span>
-2194:
-2195: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'startpreds'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">t</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
-2196: <span class="ruby-identifier">t</span>.<span class="ruby-identifier">inputs</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">list</span>, <span class="ruby-keyword kw">false</span>)
-2197: <span class="ruby-keyword kw">end</span>
-2198:
-2199: <span class="ruby-comment cmt"># Check for indirect predecessors.</span>
-2200: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parent</span>
-2201: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parent</span>.<span class="ruby-identifier">inputs</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">list</span>, <span class="ruby-keyword kw">false</span>)
-2202: <span class="ruby-keyword kw">end</span>
-2203:
-2204: <span class="ruby-comment cmt"># Also include targets of child tasks. The recursive iteration of child</span>
-2205: <span class="ruby-comment cmt"># tasks is limited to the tested task only. The predecessors are not</span>
-2206: <span class="ruby-comment cmt"># iterated.</span>
-2207: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">includeChildren</span>
-2208: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">kids</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">child</span><span class="ruby-operator">|</span>
-2209: <span class="ruby-identifier">child</span>.<span class="ruby-identifier">inputs</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">list</span>, <span class="ruby-keyword kw">true</span>)
-2210: <span class="ruby-keyword kw">end</span>
-2211: <span class="ruby-keyword kw">end</span>
-2212: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 2250</span>
+2250: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">inputs</span>(<span class="ruby-identifier">list</span>, <span class="ruby-identifier">includeChildren</span>)
+2251: <span class="ruby-comment cmt"># Ignore tasks that we have already included in the list.</span>
+2252: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">list</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-ivar">@property</span>)
+2253:
+2254: <span class="ruby-comment cmt"># A target must be a leaf function that has no direct or indirect</span>
+2255: <span class="ruby-comment cmt"># (through parent) following tasks. Only milestones are recognized as</span>
+2256: <span class="ruby-comment cmt"># targets.</span>
+2257: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">leaf?</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">hasPredecessors</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@milestone</span>
+2258: <span class="ruby-identifier">list</span> <span class="ruby-operator"><<</span> <span class="ruby-ivar">@property</span>
+2259: <span class="ruby-keyword kw">return</span>
+2260: <span class="ruby-keyword kw">end</span>
+2261:
+2262: <span class="ruby-ivar">@startpreds</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">t</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
+2263: <span class="ruby-identifier">t</span>.<span class="ruby-identifier">inputs</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">list</span>, <span class="ruby-keyword kw">false</span>)
+2264: <span class="ruby-keyword kw">end</span>
+2265:
+2266: <span class="ruby-comment cmt"># Check for indirect predecessors.</span>
+2267: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parent</span>
+2268: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parent</span>.<span class="ruby-identifier">inputs</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">list</span>, <span class="ruby-keyword kw">false</span>)
+2269: <span class="ruby-keyword kw">end</span>
+2270:
+2271: <span class="ruby-comment cmt"># Also include targets of child tasks. The recursive iteration of child</span>
+2272: <span class="ruby-comment cmt"># tasks is limited to the tested task only. The predecessors are not</span>
+2273: <span class="ruby-comment cmt"># iterated.</span>
+2274: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">includeChildren</span>
+2275: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">kids</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">child</span><span class="ruby-operator">|</span>
+2276: <span class="ruby-identifier">child</span>.<span class="ruby-identifier">inputs</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">list</span>, <span class="ruby-keyword kw">true</span>)
+2277: <span class="ruby-keyword kw">end</span>
+2278: <span class="ruby-keyword kw">end</span>
+2279: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -4603,33 +4731,33 @@
<a name="method-i-limitsOk%3F"></a>
<div class="method-heading">
<span class="method-name">limitsOk?</span><span
- class="method-args">(date, resource = nil)</span>
+ class="method-args">(sbIdx, resource = nil)</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
<p>
-Check if all of the task limits are not exceded at the given <em>date</em>.
-If a <em>resource</em> is provided, the limit for that particular resource
-is checked. If no resource is provided, only non-resource-specific limits
-are checked.
+Check if all of the task limits are not exceded at the given
+<em>sbIdx</em>. If a <em>resource</em> is provided, the limit for that
+particular resource is checked. If no resource is provided, only
+non-resource-specific limits are checked.
</p>
<div class="method-source-code"
id="limits-k--source">
<pre>
<span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1780</span>
-1780: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">limitsOk?</span>(<span class="ruby-identifier">date</span>, <span class="ruby-identifier">resource</span> = <span class="ruby-keyword kw">nil</span>)
-1781: <span class="ruby-ivar">@limits</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">limit</span><span class="ruby-operator">|</span>
-1782: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">limit</span>.<span class="ruby-identifier">ok?</span>(<span class="ruby-identifier">date</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-identifier">resource</span>)
+1780: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">limitsOk?</span>(<span class="ruby-identifier">sbIdx</span>, <span class="ruby-identifier">resource</span> = <span class="ruby-keyword kw">nil</span>)
+1781: <span class="ruby-ivar">@allLimits</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">limit</span><span class="ruby-operator">|</span>
+1782: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">limit</span>.<span class="ruby-identifier">ok?</span>(<span class="ruby-identifier">sbIdx</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-identifier">resource</span>)
1783: <span class="ruby-keyword kw">end</span>
1784: <span class="ruby-keyword kw">true</span>
1785: <span class="ruby-keyword kw">end</span></pre>
</div>
@@ -4659,17 +4787,17 @@
<div class="method-source-code"
id="mark-s-unaway-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1973</span>
-1973: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">markAsRunaway</span>
-1974: <span class="ruby-identifier">warning</span>(<span class="ruby-value str">'runaway'</span>, <span class="ruby-node">"Task #{@property.fullId} does not fit into "</span> <span class="ruby-operator">+</span>
-1975: <span class="ruby-value str">"project time frame"</span>)
-1976:
-1977: <span class="ruby-ivar">@isRunAway</span> = <span class="ruby-keyword kw">true</span>
-1978: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 2043</span>
+2043: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">markAsRunaway</span>
+2044: <span class="ruby-identifier">warning</span>(<span class="ruby-value str">'runaway'</span>, <span class="ruby-node">"Task #{@property.fullId} does not fit into "</span> <span class="ruby-operator">+</span>
+2045: <span class="ruby-value str">"project time frame"</span>)
+2046:
+2047: <span class="ruby-ivar">@isRunAway</span> = <span class="ruby-keyword kw">true</span>
+2048: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -4690,96 +4818,50 @@
</div>
<div class="method-description">
<p>
-This function determines if a task is really a milestones and marks them
+This function determines if a task is a milestones and marks it
accordingly.
</p>
<div class="method-source-code"
id="mark-ilestone-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1982</span>
-1982: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">markMilestone</span>
-1983: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">container?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">hasDurationSpec?</span> <span class="ruby-operator">||</span>
-1984: <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'booking'</span>).<span class="ruby-identifier">empty?</span> <span class="ruby-operator">||</span> <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'allocate'</span>).<span class="ruby-identifier">empty?</span>
-1985:
-1986: <span class="ruby-comment cmt"># The following cases qualify for an automatic milestone promotion.</span>
-1987: <span class="ruby-comment cmt"># - --> -</span>
-1988: <span class="ruby-comment cmt"># | --> -</span>
-1989: <span class="ruby-comment cmt"># |D --> -</span>
-1990: <span class="ruby-comment cmt"># -D --> -</span>
-1991: <span class="ruby-comment cmt"># - <-- -</span>
-1992: <span class="ruby-comment cmt"># - <-- |</span>
-1993: <span class="ruby-comment cmt"># - <-- -D</span>
-1994: <span class="ruby-comment cmt"># - <-- |D</span>
-1995: <span class="ruby-identifier">hasStartSpec</span> = <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>).<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'depends'</span>).<span class="ruby-identifier">empty?</span>
-1996: <span class="ruby-identifier">hasEndSpec</span> = <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>).<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'precedes'</span>).<span class="ruby-identifier">empty?</span>
-1997:
-1998: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'milestone'</span>, <span class="ruby-ivar">@scenarioIdx</span>] =
-1999: (<span class="ruby-identifier">hasStartSpec</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'forward'</span>) <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">hasEndSpec</span>) <span class="ruby-operator">||</span>
-2000: (<span class="ruby-operator">!</span><span class="ruby-identifier">hasStartSpec</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'forward'</span>) <span class="ruby-operator">&&</span> <span class="ruby-identifier">hasEndSpec</span>) <span class="ruby-operator">||</span>
-2001: (<span class="ruby-operator">!</span><span class="ruby-identifier">hasStartSpec</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">hasEndSpec</span>)
-2002: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 2052</span>
+2052: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">markMilestone</span>
+2053: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">container?</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">hasDurationSpec?</span> <span class="ruby-operator">||</span>
+2054: <span class="ruby-operator">!</span><span class="ruby-ivar">@booking</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-operator">||</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@allocate</span>.<span class="ruby-identifier">empty?</span>
+2055:
+2056: <span class="ruby-comment cmt"># The following cases qualify for an automatic milestone promotion.</span>
+2057: <span class="ruby-comment cmt"># - --> -</span>
+2058: <span class="ruby-comment cmt"># | --> -</span>
+2059: <span class="ruby-comment cmt"># |D --> -</span>
+2060: <span class="ruby-comment cmt"># -D --> -</span>
+2061: <span class="ruby-comment cmt"># - <-- -</span>
+2062: <span class="ruby-comment cmt"># - <-- |</span>
+2063: <span class="ruby-comment cmt"># - <-- -D</span>
+2064: <span class="ruby-comment cmt"># - <-- |D</span>
+2065: <span class="ruby-identifier">hasStartSpec</span> = <span class="ruby-operator">!</span><span class="ruby-ivar">@start</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@depends</span>.<span class="ruby-identifier">empty?</span>
+2066: <span class="ruby-identifier">hasEndSpec</span> = <span class="ruby-operator">!</span><span class="ruby-ivar">@end</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@precedes</span>.<span class="ruby-identifier">empty?</span>
+2067:
+2068: <span class="ruby-ivar">@milestone</span> = (<span class="ruby-identifier">hasStartSpec</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@forward</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">hasEndSpec</span>) <span class="ruby-operator">||</span>
+2069: (<span class="ruby-operator">!</span><span class="ruby-identifier">hasStartSpec</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@forward</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">hasEndSpec</span>) <span class="ruby-operator">||</span>
+2070: (<span class="ruby-operator">!</span><span class="ruby-identifier">hasStartSpec</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">hasEndSpec</span>)
+2071: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
</div>
- <div id="next-lot-method" class="method-detail ">
- <a name="method-i-nextSlot"></a>
-
- <div class="method-heading">
-
- <span class="method-name">nextSlot</span><span
- class="method-args">(slotDuration)</span>
- <span class="method-click-advice">click to toggle source</span>
-
- </div>
-
- <div class="method-description">
-
- <p>
-Return the date of the next slot this task wants to have scheduled. This
-must either be the first slot ever or it must be directly adjecent to the
-previous slot. If this task has not yet been scheduled at all, @lastSlot is
-still nil. Otherwise it contains the date of the last scheduled slot.
-</p>
-
-
-
- <div class="method-source-code"
- id="next-lot-source">
-<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1635</span>
-1635: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">nextSlot</span>(<span class="ruby-identifier">slotDuration</span>)
-1636: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">nil</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'scheduled'</span>) <span class="ruby-operator">||</span> <span class="ruby-ivar">@isRunAway</span>
-1637:
-1638: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'forward'</span>)
-1639: <span class="ruby-ivar">@lastSlot</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">?</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>) <span class="ruby-operator">:</span> <span class="ruby-ivar">@lastSlot</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">slotDuration</span>
-1640: <span class="ruby-keyword kw">else</span>
-1641: <span class="ruby-ivar">@lastSlot</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">?</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>) <span class="ruby-operator">-</span> <span class="ruby-identifier">slotDuration</span> <span class="ruby-operator">:</span> <span class="ruby-ivar">@lastSlot</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">slotDuration</span>
-1642: <span class="ruby-keyword kw">end</span>
-1643: <span class="ruby-keyword kw">end</span></pre>
- </div>
-
- </div>
-
-
-
-
- </div>
-
-
<div id="propagate-ate-o-ep-method" class="method-detail ">
<a name="method-i-propagateDateToDep"></a>
<div class="method-heading">
@@ -4801,35 +4883,35 @@
<div class="method-source-code"
id="propagate-ate-o-ep-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 2058</span>
-2058: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">propagateDateToDep</span>(<span class="ruby-identifier">task</span>, <span class="ruby-identifier">atEnd</span>)
-2059: <span class="ruby-comment cmt">#puts "Propagate #{atEnd ? 'end' : 'start'} to dep. #{task.fullId}"</span>
-2060: <span class="ruby-comment cmt"># Don't propagate if the task is already completely scheduled or is a</span>
-2061: <span class="ruby-comment cmt"># container.</span>
-2062: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">task</span>[<span class="ruby-value str">'scheduled'</span>, <span class="ruby-ivar">@scenarioIdx</span>] <span class="ruby-operator">||</span> <span class="ruby-identifier">task</span>.<span class="ruby-identifier">container?</span>
-2063:
-2064: <span class="ruby-comment cmt"># Don't propagate if the task already has a date for that end.</span>
-2065: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">task</span>[<span class="ruby-identifier">atEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'end'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">nil?</span>
-2066:
-2067: <span class="ruby-comment cmt"># Don't propagate if the task has a duration or is a milestone and the</span>
-2068: <span class="ruby-comment cmt"># task end to set is in the scheduling direction.</span>
-2069: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">task</span>.<span class="ruby-identifier">hasDurationSpec?</span>(<span class="ruby-ivar">@scenarioIdx</span>) <span class="ruby-operator">&&</span>
-2070: <span class="ruby-operator">!</span>(<span class="ruby-identifier">atEnd</span> <span class="ruby-operator">^</span> <span class="ruby-identifier">task</span>[<span class="ruby-value str">'forward'</span>, <span class="ruby-ivar">@scenarioIdx</span>])
-2071:
-2072: <span class="ruby-comment cmt"># Check if all other dependencies for that task end have been determined</span>
-2073: <span class="ruby-comment cmt"># already and use the latest or earliest possible date. Don't propagate</span>
-2074: <span class="ruby-comment cmt"># if we don't have all dates yet.</span>
-2075: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">nDate</span> = (<span class="ruby-identifier">atEnd</span> <span class="ruby-operator">?</span> <span class="ruby-identifier">task</span>.<span class="ruby-identifier">latestEnd</span>(<span class="ruby-ivar">@scenarioIdx</span>) <span class="ruby-operator">:</span>
-2076: <span class="ruby-identifier">task</span>.<span class="ruby-identifier">earliestStart</span>(<span class="ruby-ivar">@scenarioIdx</span>))).<span class="ruby-identifier">nil?</span>
-2077:
-2078: <span class="ruby-comment cmt"># Looks like it is ok to propagate the date.</span>
-2079: <span class="ruby-identifier">task</span>.<span class="ruby-identifier">propagateDate</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">nDate</span>, <span class="ruby-identifier">atEnd</span>)
-2080: <span class="ruby-comment cmt"># puts "Propagate #{atEnd ? 'end' : 'start'} to dep. #{task.fullId} done"</span>
-2081: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 2128</span>
+2128: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">propagateDateToDep</span>(<span class="ruby-identifier">task</span>, <span class="ruby-identifier">atEnd</span>)
+2129: <span class="ruby-comment cmt">#puts "Propagate #{atEnd ? 'end' : 'start'} to dep. #{task.fullId}"</span>
+2130: <span class="ruby-comment cmt"># Don't propagate if the task is already completely scheduled or is a</span>
+2131: <span class="ruby-comment cmt"># container.</span>
+2132: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">task</span>[<span class="ruby-value str">'scheduled'</span>, <span class="ruby-ivar">@scenarioIdx</span>] <span class="ruby-operator">||</span> <span class="ruby-identifier">task</span>.<span class="ruby-identifier">container?</span>
+2133:
+2134: <span class="ruby-comment cmt"># Don't propagate if the task already has a date for that end.</span>
+2135: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">task</span>[<span class="ruby-identifier">atEnd</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'end'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'start'</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">nil?</span>
+2136:
+2137: <span class="ruby-comment cmt"># Don't propagate if the task has a duration or is a milestone and the</span>
+2138: <span class="ruby-comment cmt"># task end to set is in the scheduling direction.</span>
+2139: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">task</span>.<span class="ruby-identifier">hasDurationSpec?</span>(<span class="ruby-ivar">@scenarioIdx</span>) <span class="ruby-operator">&&</span>
+2140: <span class="ruby-operator">!</span>(<span class="ruby-identifier">atEnd</span> <span class="ruby-operator">^</span> <span class="ruby-identifier">task</span>[<span class="ruby-value str">'forward'</span>, <span class="ruby-ivar">@scenarioIdx</span>])
+2141:
+2142: <span class="ruby-comment cmt"># Check if all other dependencies for that task end have been determined</span>
+2143: <span class="ruby-comment cmt"># already and use the latest or earliest possible date. Don't propagate</span>
+2144: <span class="ruby-comment cmt"># if we don't have all dates yet.</span>
+2145: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">nDate</span> = (<span class="ruby-identifier">atEnd</span> <span class="ruby-operator">?</span> <span class="ruby-identifier">task</span>.<span class="ruby-identifier">latestEnd</span>(<span class="ruby-ivar">@scenarioIdx</span>) <span class="ruby-operator">:</span>
+2146: <span class="ruby-identifier">task</span>.<span class="ruby-identifier">earliestStart</span>(<span class="ruby-ivar">@scenarioIdx</span>))).<span class="ruby-identifier">nil?</span>
+2147:
+2148: <span class="ruby-comment cmt"># Looks like it is ok to propagate the date.</span>
+2149: <span class="ruby-identifier">task</span>.<span class="ruby-identifier">propagateDate</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">nDate</span>, <span class="ruby-identifier">atEnd</span>)
+2150: <span class="ruby-comment cmt"># puts "Propagate #{atEnd ? 'end' : 'start'} to dep. #{task.fullId} done"</span>
+2151: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -4842,11 +4924,11 @@
<a name="method-i-scheduleSlot"></a>
<div class="method-heading">
<span class="method-name">scheduleSlot</span><span
- class="method-args">(slot, slotDuration)</span>
+ class="method-args">()</span>
<span class="method-click-advice">click to toggle source</span>
</div>
<div class="method-description">
@@ -4856,107 +4938,82 @@
<div class="method-source-code"
id="schedule-lot-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1534</span>
-1534: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">scheduleSlot</span>(<span class="ruby-identifier">slot</span>, <span class="ruby-identifier">slotDuration</span>)
-1535: <span class="ruby-comment cmt"># Tasks must always be scheduled in a single contigous fashion. @lastSlot</span>
-1536: <span class="ruby-comment cmt"># indicates the slot that was used for the previous call. Depending on the</span>
-1537: <span class="ruby-comment cmt"># scheduling direction the next slot must be scheduled either right before</span>
-1538: <span class="ruby-comment cmt"># or after this slot. If the current slot is not directly aligned, we'll</span>
-1539: <span class="ruby-comment cmt"># wait for another call with a proper slot. The function returns true</span>
-1540: <span class="ruby-comment cmt"># only if a slot could be scheduled.</span>
-1541: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'forward'</span>)
-1542: <span class="ruby-comment cmt"># On first call, the @lastSlot is not set yet. We set it to the slot</span>
-1543: <span class="ruby-comment cmt"># before the start slot.</span>
-1544: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@lastSlot</span>.<span class="ruby-identifier">nil?</span>
-1545: <span class="ruby-ivar">@lastSlot</span> = <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>) <span class="ruby-operator">-</span> <span class="ruby-identifier">slotDuration</span>
-1546: <span class="ruby-ivar">@tentativeEnd</span> = <span class="ruby-identifier">slot</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">slotDuration</span>
-1547: <span class="ruby-keyword kw">end</span>
-1548:
-1549: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">slot</span> <span class="ruby-operator">==</span> <span class="ruby-ivar">@lastSlot</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">slotDuration</span>
-1550: <span class="ruby-keyword kw">else</span>
-1551: <span class="ruby-comment cmt"># On first call, the @lastSlot is not set yet. We set it to the slot</span>
-1552: <span class="ruby-comment cmt"># to the end slot.</span>
-1553: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@lastSlot</span>.<span class="ruby-identifier">nil?</span>
-1554: <span class="ruby-ivar">@lastSlot</span> = <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>)
-1555: <span class="ruby-ivar">@tentativeStart</span> = <span class="ruby-identifier">slot</span>
-1556: <span class="ruby-keyword kw">end</span>
-1557:
-1558: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">slot</span> <span class="ruby-operator">==</span> <span class="ruby-ivar">@lastSlot</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">slotDuration</span>
-1559: <span class="ruby-keyword kw">end</span>
-1560: <span class="ruby-ivar">@lastSlot</span> = <span class="ruby-identifier">slot</span>
-1561:
-1562: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'length'</span>) <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'duration'</span>) <span class="ruby-operator">></span> <span class="ruby-value">0</span>
-1563: <span class="ruby-comment cmt"># The doneDuration counts the number of scheduled slots. It is increased</span>
-1564: <span class="ruby-comment cmt"># by one with every scheduled slot. The doneLength is only increased for</span>
-1565: <span class="ruby-comment cmt"># global working time slots.</span>
-1566: <span class="ruby-identifier">bookResources</span>(<span class="ruby-identifier">slot</span>, <span class="ruby-identifier">slotDuration</span>)
-1567: <span class="ruby-ivar">@doneDuration</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
-1568: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">isWorkingTime</span>(<span class="ruby-identifier">slot</span>, <span class="ruby-identifier">slot</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">slotDuration</span>)
-1569: <span class="ruby-ivar">@doneLength</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
-1570: <span class="ruby-keyword kw">end</span>
-1571:
-1572: <span class="ruby-comment cmt"># If we have reached the specified duration or lengths, we set the end</span>
-1573: <span class="ruby-comment cmt"># or start date and propagate the value to neighbouring tasks.</span>
-1574: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">a</span>(<span class="ruby-value str">'length'</span>) <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@doneLength</span> <span class="ruby-operator">>=</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'length'</span>)) <span class="ruby-operator">||</span>
-1575: (<span class="ruby-identifier">a</span>(<span class="ruby-value str">'duration'</span>) <span class="ruby-operator">></span> <span class="ruby-value">0</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@doneDuration</span> <span class="ruby-operator">>=</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'duration'</span>))
-1576: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'forward'</span>)
-1577: <span class="ruby-identifier">propagateDate</span>(<span class="ruby-identifier">slot</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">slotDuration</span>, <span class="ruby-keyword kw">true</span>)
-1578: <span class="ruby-keyword kw">else</span>
-1579: <span class="ruby-identifier">propagateDate</span>(<span class="ruby-identifier">slot</span>, <span class="ruby-keyword kw">false</span>)
-1580: <span class="ruby-keyword kw">end</span>
-1581: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span>
-1582: <span class="ruby-keyword kw">end</span>
-1583: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'effort'</span>) <span class="ruby-operator">></span> <span class="ruby-value">0</span>
-1584: <span class="ruby-identifier">bookResources</span>(<span class="ruby-identifier">slot</span>, <span class="ruby-identifier">slotDuration</span>) <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@doneEffort</span> <span class="ruby-operator"><</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'effort'</span>)
-1585: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@doneEffort</span> <span class="ruby-operator">>=</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'effort'</span>)
-1586: <span class="ruby-comment cmt"># The specified effort has been reached. The task has been fully</span>
-1587: <span class="ruby-comment cmt"># scheduled now.</span>
-1588: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'forward'</span>)
-1589: <span class="ruby-identifier">propagateDate</span>(<span class="ruby-ivar">@tentativeEnd</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-keyword kw">true</span>)
-1590: <span class="ruby-keyword kw">else</span>
-1591: <span class="ruby-identifier">propagateDate</span>(<span class="ruby-ivar">@tentativeStart</span>, <span class="ruby-keyword kw">false</span>, <span class="ruby-keyword kw">true</span>)
-1592: <span class="ruby-keyword kw">end</span>
-1593: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span>
-1594: <span class="ruby-keyword kw">end</span>
-1595: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'milestone'</span>)
-1596: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'forward'</span>)
-1597: <span class="ruby-identifier">propagateDate</span>(<span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>), <span class="ruby-keyword kw">true</span>)
-1598: <span class="ruby-keyword kw">else</span>
-1599: <span class="ruby-identifier">propagateDate</span>(<span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>), <span class="ruby-keyword kw">false</span>)
-1600: <span class="ruby-keyword kw">end</span>
-1601: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span>
-1602: <span class="ruby-keyword kw">elsif</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>) <span class="ruby-operator">&&</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>)
-1603: <span class="ruby-comment cmt"># Task with start and end date but no duration criteria</span>
-1604: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'allocate'</span>).<span class="ruby-identifier">empty?</span>
-1605: <span class="ruby-comment cmt"># For start-end-tasks without allocation, we don't have to do</span>
-1606: <span class="ruby-comment cmt"># anything but to set the 'scheduled' flag.</span>
-1607: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'scheduled'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = <span class="ruby-keyword kw">true</span>
-1608: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parents</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">parent</span><span class="ruby-operator">|</span>
-1609: <span class="ruby-identifier">parent</span>.<span class="ruby-identifier">scheduleContainer</span>(<span class="ruby-ivar">@scenarioIdx</span>)
-1610: <span class="ruby-keyword kw">end</span>
-1611: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span>
-1612: <span class="ruby-keyword kw">end</span>
-1613:
-1614: <span class="ruby-identifier">bookResources</span>(<span class="ruby-identifier">slot</span>, <span class="ruby-identifier">slotDuration</span>)
-1615:
-1616: <span class="ruby-comment cmt"># Depending on the scheduling direction we can mark the task as</span>
-1617: <span class="ruby-comment cmt"># scheduled once we have reached the other end.</span>
-1618: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">a</span>(<span class="ruby-value str">'forward'</span>) <span class="ruby-operator">&&</span> <span class="ruby-identifier">slot</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">slotDuration</span> <span class="ruby-operator">>=</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>)) <span class="ruby-operator">||</span>
-1619: (<span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'forward'</span>) <span class="ruby-operator">&&</span> <span class="ruby-identifier">slot</span> <span class="ruby-operator"><=</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>))
-1620: <span class="ruby-ivar">@property</span>[<span class="ruby-value str">'scheduled'</span>, <span class="ruby-ivar">@scenarioIdx</span>] = <span class="ruby-keyword kw">true</span>
-1621: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parents</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">parent</span><span class="ruby-operator">|</span>
-1622: <span class="ruby-identifier">parent</span>.<span class="ruby-identifier">scheduleContainer</span>(<span class="ruby-ivar">@scenarioIdx</span>)
-1623: <span class="ruby-keyword kw">end</span>
-1624: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">true</span>
-1625: <span class="ruby-keyword kw">end</span>
-1626: <span class="ruby-keyword kw">end</span>
-1627:
-1628: <span class="ruby-keyword kw">false</span>
-1629: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 1586</span>
+1586: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">scheduleSlot</span>
+1587: <span class="ruby-comment cmt"># Tasks must always be scheduled in a single contigous fashion.</span>
+1588: <span class="ruby-comment cmt"># Depending on the scheduling direction the next slot must be scheduled</span>
+1589: <span class="ruby-comment cmt"># either right before or after this slot. If the current slot is not</span>
+1590: <span class="ruby-comment cmt"># directly aligned, we'll wait for another call with a proper slot. The</span>
+1591: <span class="ruby-comment cmt"># function returns false if the task has been completely scheduled.</span>
+1592: <span class="ruby-keyword kw">case</span> <span class="ruby-ivar">@durationType</span>
+1593: <span class="ruby-keyword kw">when</span> <span class="ruby-value">:effortTask</span>
+1594: <span class="ruby-identifier">bookResources</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@doneEffort</span> <span class="ruby-operator"><</span> <span class="ruby-ivar">@effort</span>
+1595: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@doneEffort</span> <span class="ruby-operator">>=</span> <span class="ruby-ivar">@effort</span>
+1596: <span class="ruby-comment cmt"># The specified effort has been reached. The task has been fully</span>
+1597: <span class="ruby-comment cmt"># scheduled now.</span>
+1598: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@forward</span>
+1599: <span class="ruby-identifier">propagateDate</span>(<span class="ruby-ivar">@project</span>.<span class="ruby-identifier">idxToDate</span>(<span class="ruby-ivar">@currentSlotIdx</span> <span class="ruby-operator">+</span> <span class="ruby-value">1</span>), <span class="ruby-keyword kw">true</span>, <span class="ruby-keyword kw">true</span>)
+1600: <span class="ruby-keyword kw">else</span>
+1601: <span class="ruby-identifier">propagateDate</span>(<span class="ruby-ivar">@project</span>.<span class="ruby-identifier">idxToDate</span>(<span class="ruby-ivar">@currentSlotIdx</span>), <span class="ruby-keyword kw">false</span>, <span class="ruby-keyword kw">true</span>)
+1602: <span class="ruby-keyword kw">end</span>
+1603: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
+1604: <span class="ruby-keyword kw">end</span>
+1605: <span class="ruby-keyword kw">when</span> <span class="ruby-value">:lengthTask</span>
+1606: <span class="ruby-identifier">bookResources</span>
+1607: <span class="ruby-comment cmt"># The doneLength is only increased for global working time slots.</span>
+1608: <span class="ruby-ivar">@doneLength</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span> <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">isWorkingTime</span>(<span class="ruby-ivar">@currentSlotIdx</span>)
+1609:
+1610: <span class="ruby-comment cmt"># If we have reached the specified duration or lengths, we set the end</span>
+1611: <span class="ruby-comment cmt"># or start date and propagate the value to neighbouring tasks.</span>
+1612: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@doneLength</span> <span class="ruby-operator">>=</span> <span class="ruby-ivar">@length</span>
+1613: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@forward</span>
+1614: <span class="ruby-identifier">propagateDate</span>(<span class="ruby-ivar">@project</span>.<span class="ruby-identifier">idxToDate</span>(<span class="ruby-ivar">@currentSlotIdx</span> <span class="ruby-operator">+</span> <span class="ruby-value">1</span>), <span class="ruby-keyword kw">true</span>)
+1615: <span class="ruby-keyword kw">else</span>
+1616: <span class="ruby-identifier">propagateDate</span>(<span class="ruby-ivar">@project</span>.<span class="ruby-identifier">idxToDate</span>(<span class="ruby-ivar">@currentSlotIdx</span>), <span class="ruby-keyword kw">false</span>)
+1617: <span class="ruby-keyword kw">end</span>
+1618: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
+1619: <span class="ruby-keyword kw">end</span>
+1620: <span class="ruby-keyword kw">when</span> <span class="ruby-value">:durationTask</span>
+1621: <span class="ruby-comment cmt"># The doneDuration counts the number of scheduled slots. It is increased</span>
+1622: <span class="ruby-comment cmt"># by one with every scheduled slot.</span>
+1623: <span class="ruby-identifier">bookResources</span>
+1624: <span class="ruby-ivar">@doneDuration</span> <span class="ruby-operator">+=</span> <span class="ruby-value">1</span>
+1625:
+1626: <span class="ruby-comment cmt"># If we have reached the specified duration or lengths, we set the end</span>
+1627: <span class="ruby-comment cmt"># or start date and propagate the value to neighbouring tasks.</span>
+1628: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@doneDuration</span> <span class="ruby-operator">>=</span> <span class="ruby-ivar">@duration</span>
+1629: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@forward</span>
+1630: <span class="ruby-identifier">propagateDate</span>(<span class="ruby-ivar">@project</span>.<span class="ruby-identifier">idxToDate</span>(<span class="ruby-ivar">@currentSlotIdx</span> <span class="ruby-operator">+</span> <span class="ruby-value">1</span>), <span class="ruby-keyword kw">true</span>)
+1631: <span class="ruby-keyword kw">else</span>
+1632: <span class="ruby-identifier">propagateDate</span>(<span class="ruby-ivar">@project</span>.<span class="ruby-identifier">idxToDate</span>(<span class="ruby-ivar">@currentSlotIdx</span>), <span class="ruby-keyword kw">false</span>)
+1633: <span class="ruby-keyword kw">end</span>
+1634: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
+1635: <span class="ruby-keyword kw">end</span>
+1636: <span class="ruby-keyword kw">when</span> <span class="ruby-value">:startEndTask</span>
+1637: <span class="ruby-comment cmt"># Task with start and end date but no duration criteria</span>
+1638: <span class="ruby-identifier">bookResources</span>
+1639:
+1640: <span class="ruby-comment cmt"># Depending on the scheduling direction we can mark the task as</span>
+1641: <span class="ruby-comment cmt"># scheduled once we have reached the other end.</span>
+1642: <span class="ruby-identifier">currentSlot</span> = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">idxToDate</span>(<span class="ruby-ivar">@currentSlotIdx</span>)
+1643: <span class="ruby-keyword kw">if</span> (<span class="ruby-ivar">@forward</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">currentSlot</span> <span class="ruby-operator">+</span> <span class="ruby-ivar">@project</span>[<span class="ruby-value str">'scheduleGranularity'</span>] <span class="ruby-operator">>=</span> <span class="ruby-ivar">@end</span>) <span class="ruby-operator">||</span>
+1644: (<span class="ruby-operator">!</span><span class="ruby-ivar">@forward</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">currentSlot</span> <span class="ruby-operator"><=</span> <span class="ruby-ivar">@start</span>)
+1645: <span class="ruby-ivar">@scheduled</span> = <span class="ruby-keyword kw">true</span>
+1646: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parents</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">parent</span><span class="ruby-operator">|</span>
+1647: <span class="ruby-identifier">parent</span>.<span class="ruby-identifier">scheduleContainer</span>(<span class="ruby-ivar">@scenarioIdx</span>)
+1648: <span class="ruby-keyword kw">end</span>
+1649: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">false</span>
+1650: <span class="ruby-keyword kw">end</span>
+1651: <span class="ruby-keyword kw">else</span>
+1652: <span class="ruby-identifier">raise</span> <span class="ruby-node">"Unknown task duration type #{@durationType}"</span>
+1653: <span class="ruby-keyword kw">end</span>
+1654:
+1655: <span class="ruby-keyword kw">true</span>
+1656: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -4986,14 +5043,14 @@
<div class="method-source-code"
id="set-etermination-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 2051</span>
-2051: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">setDetermination</span>(<span class="ruby-identifier">setStart</span>, <span class="ruby-identifier">value</span>)
-2052: <span class="ruby-identifier">setStart</span> <span class="ruby-operator">?</span> <span class="ruby-ivar">@startIsDetermed</span> = <span class="ruby-identifier">value</span> <span class="ruby-operator">:</span> <span class="ruby-ivar">@endIsDetermed</span> = <span class="ruby-identifier">value</span>
-2053: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 2121</span>
+2121: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">setDetermination</span>(<span class="ruby-identifier">setStart</span>, <span class="ruby-identifier">value</span>)
+2122: <span class="ruby-identifier">setStart</span> <span class="ruby-operator">?</span> <span class="ruby-ivar">@startIsDetermed</span> = <span class="ruby-identifier">value</span> <span class="ruby-operator">:</span> <span class="ruby-ivar">@endIsDetermed</span> = <span class="ruby-identifier">value</span>
+2123: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -5023,41 +5080,41 @@
<div class="method-source-code"
id="targets-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 2216</span>
-2216: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">targets</span>(<span class="ruby-identifier">list</span>, <span class="ruby-identifier">includeChildren</span>)
-2217: <span class="ruby-comment cmt"># Ignore tasks that we have already included in the list.</span>
-2218: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">list</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-ivar">@property</span>)
-2219:
-2220: <span class="ruby-comment cmt"># A target must be a leaf function that has no direct or indirect</span>
-2221: <span class="ruby-comment cmt"># (through parent) following tasks. Only milestones are recognized as</span>
-2222: <span class="ruby-comment cmt"># targets.</span>
-2223: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">leaf?</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">hasSuccessors</span> <span class="ruby-operator">&&</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'milestone'</span>)
-2224: <span class="ruby-identifier">list</span> <span class="ruby-operator"><<</span> <span class="ruby-ivar">@property</span>
-2225: <span class="ruby-keyword kw">return</span>
-2226: <span class="ruby-keyword kw">end</span>
-2227:
-2228: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'endsuccs'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">t</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
-2229: <span class="ruby-identifier">t</span>.<span class="ruby-identifier">targets</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">list</span>, <span class="ruby-keyword kw">false</span>)
-2230: <span class="ruby-keyword kw">end</span>
-2231:
-2232: <span class="ruby-comment cmt"># Check for indirect followers.</span>
-2233: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parent</span>
-2234: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parent</span>.<span class="ruby-identifier">targets</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">list</span>, <span class="ruby-keyword kw">false</span>)
-2235: <span class="ruby-keyword kw">end</span>
-2236:
-2237: <span class="ruby-comment cmt"># Also include targets of child tasks. The recursive iteration of child</span>
-2238: <span class="ruby-comment cmt"># tasks is limited to the tested task only. The followers are not</span>
-2239: <span class="ruby-comment cmt"># iterated.</span>
-2240: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">includeChildren</span>
-2241: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">kids</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">child</span><span class="ruby-operator">|</span>
-2242: <span class="ruby-identifier">child</span>.<span class="ruby-identifier">targets</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">list</span>, <span class="ruby-keyword kw">true</span>)
-2243: <span class="ruby-keyword kw">end</span>
-2244: <span class="ruby-keyword kw">end</span>
-2245: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 2283</span>
+2283: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">targets</span>(<span class="ruby-identifier">list</span>, <span class="ruby-identifier">includeChildren</span>)
+2284: <span class="ruby-comment cmt"># Ignore tasks that we have already included in the list.</span>
+2285: <span class="ruby-keyword kw">return</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">list</span>.<span class="ruby-identifier">include?</span>(<span class="ruby-ivar">@property</span>)
+2286:
+2287: <span class="ruby-comment cmt"># A target must be a leaf function that has no direct or indirect</span>
+2288: <span class="ruby-comment cmt"># (through parent) following tasks. Only milestones are recognized as</span>
+2289: <span class="ruby-comment cmt"># targets.</span>
+2290: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">leaf?</span> <span class="ruby-operator">&&</span> <span class="ruby-operator">!</span><span class="ruby-identifier">hasSuccessors</span> <span class="ruby-operator">&&</span> <span class="ruby-ivar">@milestone</span>
+2291: <span class="ruby-identifier">list</span> <span class="ruby-operator"><<</span> <span class="ruby-ivar">@property</span>
+2292: <span class="ruby-keyword kw">return</span>
+2293: <span class="ruby-keyword kw">end</span>
+2294:
+2295: <span class="ruby-ivar">@endsuccs</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">t</span>, <span class="ruby-identifier">onEnd</span><span class="ruby-operator">|</span>
+2296: <span class="ruby-identifier">t</span>.<span class="ruby-identifier">targets</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">list</span>, <span class="ruby-keyword kw">false</span>)
+2297: <span class="ruby-keyword kw">end</span>
+2298:
+2299: <span class="ruby-comment cmt"># Check for indirect followers.</span>
+2300: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parent</span>
+2301: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">parent</span>.<span class="ruby-identifier">targets</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">list</span>, <span class="ruby-keyword kw">false</span>)
+2302: <span class="ruby-keyword kw">end</span>
+2303:
+2304: <span class="ruby-comment cmt"># Also include targets of child tasks. The recursive iteration of child</span>
+2305: <span class="ruby-comment cmt"># tasks is limited to the tested task only. The followers are not</span>
+2306: <span class="ruby-comment cmt"># iterated.</span>
+2307: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">includeChildren</span>
+2308: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">kids</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">child</span><span class="ruby-operator">|</span>
+2309: <span class="ruby-identifier">child</span>.<span class="ruby-identifier">targets</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">list</span>, <span class="ruby-keyword kw">true</span>)
+2310: <span class="ruby-keyword kw">end</span>
+2311: <span class="ruby-keyword kw">end</span>
+2312: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>
@@ -5092,62 +5149,62 @@
<div class="method-source-code"
id="turnover-source">
<pre>
- <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 2252</span>
-2252: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">turnover</span>(<span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">endIdx</span>, <span class="ruby-identifier">account</span>, <span class="ruby-identifier">resource</span> = <span class="ruby-keyword kw">nil</span>)
-2253: <span class="ruby-identifier">amount</span> = <span class="ruby-value">0.0</span>
-2254: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">container?</span>
-2255: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">kids</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">child</span><span class="ruby-operator">|</span>
-2256: <span class="ruby-identifier">amount</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">child</span>.<span class="ruby-identifier">turnover</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">endIdx</span>, <span class="ruby-identifier">account</span>,
-2257: <span class="ruby-identifier">resource</span>)
-2258: <span class="ruby-keyword kw">end</span>
-2259: <span class="ruby-keyword kw">end</span>
-2260:
-2261: <span class="ruby-comment cmt"># If there are no chargeset defined for this task, we don't need to</span>
-2262: <span class="ruby-comment cmt"># compute the resource related or other cost.</span>
-2263: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'chargeset'</span>).<span class="ruby-identifier">empty?</span>
-2264: <span class="ruby-identifier">resourceCost</span> = <span class="ruby-value">0.0</span>
-2265: <span class="ruby-identifier">otherCost</span> = <span class="ruby-value">0.0</span>
-2266:
-2267: <span class="ruby-comment cmt"># Container tasks don't have resource cost.</span>
-2268: <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">container?</span>
-2269: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">resource</span>
-2270: <span class="ruby-identifier">resourceCost</span> = <span class="ruby-identifier">resource</span>.<span class="ruby-identifier">cost</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">endIdx</span>,
-2271: <span class="ruby-ivar">@property</span>)
-2272: <span class="ruby-keyword kw">else</span>
-2273: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'assignedresources'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span>
-2274: <span class="ruby-identifier">resourceCost</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">r</span>.<span class="ruby-identifier">cost</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">endIdx</span>, <span class="ruby-ivar">@property</span>)
-2275: <span class="ruby-keyword kw">end</span>
-2276: <span class="ruby-keyword kw">end</span>
-2277: <span class="ruby-keyword kw">end</span>
-2278:
-2279: <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'charge'</span>).<span class="ruby-identifier">empty?</span>
-2280: <span class="ruby-comment cmt"># Add one-time and periodic charges to the amount.</span>
-2281: <span class="ruby-identifier">startDate</span> = <span class="ruby-identifier">startIdx</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">TjTime</span>) <span class="ruby-operator">?</span> <span class="ruby-identifier">startIdx</span> <span class="ruby-operator">:</span>
-2282: <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">idxToDate</span>(<span class="ruby-identifier">startIdx</span>)
-2283: <span class="ruby-identifier">endDate</span> = <span class="ruby-identifier">endIdx</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">TjTime</span>) <span class="ruby-operator">?</span> <span class="ruby-identifier">endIdx</span> <span class="ruby-operator">:</span>
-2284: <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">idxToDate</span>(<span class="ruby-identifier">endIdx</span>)
-2285: <span class="ruby-identifier">iv</span> = <span class="ruby-constant">Interval</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">startDate</span>, <span class="ruby-identifier">endDate</span>)
-2286: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'charge'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">charge</span><span class="ruby-operator">|</span>
-2287: <span class="ruby-identifier">otherCost</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">charge</span>.<span class="ruby-identifier">turnover</span>(<span class="ruby-identifier">iv</span>)
-2288: <span class="ruby-keyword kw">end</span>
-2289: <span class="ruby-keyword kw">end</span>
-2290:
-2291: <span class="ruby-identifier">totalCost</span> = <span class="ruby-identifier">resourceCost</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">otherCost</span>
-2292: <span class="ruby-comment cmt"># Now weight the total cost by the share of the account</span>
-2293: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'chargeset'</span>).<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">set</span><span class="ruby-operator">|</span>
-2294: <span class="ruby-identifier">set</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">accnt</span>, <span class="ruby-identifier">share</span><span class="ruby-operator">|</span>
-2295: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">share</span> <span class="ruby-operator">></span> <span class="ruby-value">0.0</span> <span class="ruby-operator">&&</span> (<span class="ruby-identifier">accnt</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">account</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">accnt</span>.<span class="ruby-identifier">isChildOf?</span>(<span class="ruby-identifier">account</span>))
-2296: <span class="ruby-identifier">amount</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">totalCost</span> * <span class="ruby-identifier">share</span>
-2297: <span class="ruby-keyword kw">end</span>
-2298: <span class="ruby-keyword kw">end</span>
-2299: <span class="ruby-keyword kw">end</span>
-2300: <span class="ruby-keyword kw">end</span>
-2301:
-2302: <span class="ruby-identifier">amount</span>
-2303: <span class="ruby-keyword kw">end</span></pre>
+ <span class="ruby-comment cmt"># File lib/taskjuggler/TaskScenario.rb, line 2319</span>
+2319: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">turnover</span>(<span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">endIdx</span>, <span class="ruby-identifier">account</span>, <span class="ruby-identifier">resource</span> = <span class="ruby-keyword kw">nil</span>)
+2320: <span class="ruby-identifier">amount</span> = <span class="ruby-value">0.0</span>
+2321: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">container?</span>
+2322: <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">kids</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">child</span><span class="ruby-operator">|</span>
+2323: <span class="ruby-identifier">amount</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">child</span>.<span class="ruby-identifier">turnover</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">endIdx</span>, <span class="ruby-identifier">account</span>,
+2324: <span class="ruby-identifier">resource</span>)
+2325: <span class="ruby-keyword kw">end</span>
+2326: <span class="ruby-keyword kw">end</span>
+2327:
+2328: <span class="ruby-comment cmt"># If there are no chargeset defined for this task, we don't need to</span>
+2329: <span class="ruby-comment cmt"># compute the resource related or other cost.</span>
+2330: <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@chargeset</span>.<span class="ruby-identifier">empty?</span>
+2331: <span class="ruby-identifier">resourceCost</span> = <span class="ruby-value">0.0</span>
+2332: <span class="ruby-identifier">otherCost</span> = <span class="ruby-value">0.0</span>
+2333:
+2334: <span class="ruby-comment cmt"># Container tasks don't have resource cost.</span>
+2335: <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@property</span>.<span class="ruby-identifier">container?</span>
+2336: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">resource</span>
+2337: <span class="ruby-identifier">resourceCost</span> = <span class="ruby-identifier">resource</span>.<span class="ruby-identifier">cost</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">endIdx</span>,
+2338: <span class="ruby-ivar">@property</span>)
+2339: <span class="ruby-keyword kw">else</span>
+2340: <span class="ruby-ivar">@assignedresources</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">r</span><span class="ruby-operator">|</span>
+2341: <span class="ruby-identifier">resourceCost</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">r</span>.<span class="ruby-identifier">cost</span>(<span class="ruby-ivar">@scenarioIdx</span>, <span class="ruby-identifier">startIdx</span>, <span class="ruby-identifier">endIdx</span>, <span class="ruby-ivar">@property</span>)
+2342: <span class="ruby-keyword kw">end</span>
+2343: <span class="ruby-keyword kw">end</span>
+2344: <span class="ruby-keyword kw">end</span>
+2345:
+2346: <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@charge</span>.<span class="ruby-identifier">empty?</span>
+2347: <span class="ruby-comment cmt"># Add one-time and periodic charges to the amount.</span>
+2348: <span class="ruby-identifier">startDate</span> = <span class="ruby-identifier">startIdx</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">TjTime</span>) <span class="ruby-operator">?</span> <span class="ruby-identifier">startIdx</span> <span class="ruby-operator">:</span>
+2349: <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">idxToDate</span>(<span class="ruby-identifier">startIdx</span>)
+2350: <span class="ruby-identifier">endDate</span> = <span class="ruby-identifier">endIdx</span>.<span class="ruby-identifier">is_a?</span>(<span class="ruby-constant">TjTime</span>) <span class="ruby-operator">?</span> <span class="ruby-identifier">endIdx</span> <span class="ruby-operator">:</span>
+2351: <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">idxToDate</span>(<span class="ruby-identifier">endIdx</span>)
+2352: <span class="ruby-identifier">iv</span> = <span class="ruby-constant">TimeInterval</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">startDate</span>, <span class="ruby-identifier">endDate</span>)
+2353: <span class="ruby-ivar">@charge</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">charge</span><span class="ruby-operator">|</span>
+2354: <span class="ruby-identifier">otherCost</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">charge</span>.<span class="ruby-identifier">turnover</span>(<span class="ruby-identifier">iv</span>)
+2355: <span class="ruby-keyword kw">end</span>
+2356: <span class="ruby-keyword kw">end</span>
+2357:
+2358: <span class="ruby-identifier">totalCost</span> = <span class="ruby-identifier">resourceCost</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">otherCost</span>
+2359: <span class="ruby-comment cmt"># Now weight the total cost by the share of the account</span>
+2360: <span class="ruby-ivar">@chargeset</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">set</span><span class="ruby-operator">|</span>
+2361: <span class="ruby-identifier">set</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">accnt</span>, <span class="ruby-identifier">share</span><span class="ruby-operator">|</span>
+2362: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">share</span> <span class="ruby-operator">></span> <span class="ruby-value">0.0</span> <span class="ruby-operator">&&</span> (<span class="ruby-identifier">accnt</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">account</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">accnt</span>.<span class="ruby-identifier">isChildOf?</span>(<span class="ruby-identifier">account</span>))
+2363: <span class="ruby-identifier">amount</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">totalCost</span> * <span class="ruby-identifier">share</span>
+2364: <span class="ruby-keyword kw">end</span>
+2365: <span class="ruby-keyword kw">end</span>
+2366: <span class="ruby-keyword kw">end</span>
+2367: <span class="ruby-keyword kw">end</span>
+2368:
+2369: <span class="ruby-identifier">amount</span>
+2370: <span class="ruby-keyword kw">end</span></pre>
</div>
</div>