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">&lt;&lt;</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">&lt;&lt;</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">&lt;=</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">&lt;=</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">&gt;</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">&gt;</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">&gt;</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">&gt;</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">&gt;</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">&gt;</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">&gt;</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">&gt;</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"># - --&gt; - inhS*1 - &lt;-- - inhE*1</span> - 966: <span class="ruby-comment cmt"># - --&gt; | inhS | &lt;-- - inhE</span> - 967: <span class="ruby-comment cmt"># - x-&gt; - inhS - &lt;-x - inhE</span> - 968: <span class="ruby-comment cmt"># - x-&gt; | inhS | &lt;-x - inhE</span> - 969: <span class="ruby-comment cmt"># - x-&gt; -D inhS -D &lt;-x - inhE</span> - 970: <span class="ruby-comment cmt"># - x-&gt; |D inhS |D &lt;-x - inhE</span> - 971: <span class="ruby-comment cmt"># - --&gt; -D inhS -D &lt;-- - inhE</span> - 972: <span class="ruby-comment cmt"># - --&gt; |D inhS |D &lt;-- - inhE</span> - 973: <span class="ruby-comment cmt"># - &lt;-- | inhS | --&gt; - 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">&amp;&amp;</span> <span class="ruby-operator">!</span><span class="ruby-identifier">hasDurationSpec</span> <span class="ruby-operator">&amp;&amp;</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">&amp;&amp;</span> <span class="ruby-operator">!</span><span class="ruby-identifier">hasDurationSpec</span> <span class="ruby-operator">&amp;&amp;</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">#&amp;&amp; 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"># - --&gt; - inhS*1 - &lt;-- - inhE*1</span> +1016: <span class="ruby-comment cmt"># - --&gt; | inhS | &lt;-- - inhE</span> +1017: <span class="ruby-comment cmt"># - x-&gt; - inhS - &lt;-x - inhE</span> +1018: <span class="ruby-comment cmt"># - x-&gt; | inhS | &lt;-x - inhE</span> +1019: <span class="ruby-comment cmt"># - x-&gt; -D inhS -D &lt;-x - inhE</span> +1020: <span class="ruby-comment cmt"># - x-&gt; |D inhS |D &lt;-x - inhE</span> +1021: <span class="ruby-comment cmt"># - --&gt; -D inhS -D &lt;-- - inhE</span> +1022: <span class="ruby-comment cmt"># - --&gt; |D inhS |D &lt;-- - inhE</span> +1023: <span class="ruby-comment cmt"># - &lt;-- | inhS | --&gt; - 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">&amp;&amp;</span> <span class="ruby-operator">!</span><span class="ruby-identifier">hasDurationSpec</span> <span class="ruby-operator">&amp;&amp;</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">&amp;&amp;</span> <span class="ruby-operator">!</span><span class="ruby-identifier">hasDurationSpec</span> <span class="ruby-operator">&amp;&amp;</span> +1051: <span class="ruby-ivar">@booking</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-comment cmt">#&amp;&amp; @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">&lt;&lt;</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">&lt;&lt;</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">&quot;Dependency loop detected at #{atEnd ? 'end' : 'start'} &quot;</span> <span class="ruby-operator">+</span> -554: <span class="ruby-node">&quot;of task #{@property.fullId}&quot;</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">&amp;&amp;</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">&quot;loop_at_#{e ? 'end' : 'start'}&quot;</span>, -563: <span class="ruby-node">&quot;Loop ctnd. at #{e ? 'end' : 'start'} of task #{t.fullId}&quot;</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">&quot;Aborting&quot;</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">&quot;#{t.fullId}(#{e ? 'end' : 'start'}) -&gt; &quot;</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">&quot;#{@property.fullId}(#{atEnd ? 'end' : 'start'})&quot;</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">&lt;&lt;</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"># --&gt;| o &lt;--- ---&gt; o |&lt;--</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"># --&gt;| 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"># --&gt;| o----&gt;</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">&amp;&amp;</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 &lt;--</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"># &lt;---- o &lt;--</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 |&lt;--</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"># &lt;----o |&lt;--</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">&amp;&amp;</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"># --&gt; 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">&quot;Dependency loop detected at #{atEnd ? 'end' : 'start'} &quot;</span> <span class="ruby-operator">+</span> +596: <span class="ruby-node">&quot;of task #{@property.fullId}&quot;</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">&amp;&amp;</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">&quot;loop_at_#{e ? 'end' : 'start'}&quot;</span>, +605: <span class="ruby-node">&quot;Loop ctnd. at #{e ? 'end' : 'start'} of task #{t.fullId}&quot;</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">&quot;Aborting&quot;</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">&quot;#{t.fullId}(#{e ? 'end' : 'start'}) -&gt; &quot;</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">&quot;#{@property.fullId}(#{atEnd ? 'end' : 'start'})&quot;</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">&lt;&lt;</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"># --&gt;| o &lt;--- ---&gt; o |&lt;--</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"># --&gt;| 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"># --&gt;| o----&gt;</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">&amp;&amp;</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 &lt;--</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"># &lt;---- o &lt;--</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"># --&gt; o----&gt;</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 &quot;Finished with #{@property.fullId} #{atEnd ? 'end' : 'start'} &quot; +</span> -711: <span class="ruby-comment cmt"># &quot;#{fromOutside ? 'outside' : 'inside'}&quot;</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 |&lt;--</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"># &lt;----o |&lt;--</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">&amp;&amp;</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"># --&gt; 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"># --&gt; o----&gt;</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 &quot;Finished with #{@property.fullId} #{atEnd ? 'end' : 'start'} &quot; +</span> +753: <span class="ruby-comment cmt"># &quot;#{fromOutside ? 'outside' : 'inside'}&quot;</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">&lt;&lt;</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">&amp;=</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">&amp;=</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">&amp;=</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">&lt;&lt;</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">&amp;=</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">&amp;=</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">&amp;=</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">&lt;=</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">&lt;=</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">&gt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">dateAfterLengthGap</span> <span class="ruby-operator">&lt;</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">&gt;</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">&lt;</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">&amp;&amp;</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">&gt;</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: | --&gt; D-</span> -1103: <span class="ruby-comment cmt"># task B: -D &lt;-- |</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">&amp;&amp;</span> <span class="ruby-identifier">startDate</span> <span class="ruby-operator">&gt;</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">&quot;Task #{@property.fullId} has a too weak start dependencies &quot;</span> <span class="ruby-operator">+</span> -1107: <span class="ruby-value str">&quot;to be scheduled properly.&quot;</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">&gt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">dateAfterLengthGap</span> <span class="ruby-operator">&lt;</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">&gt;</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">&lt;</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">&amp;&amp;</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">&gt;</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: | --&gt; D-</span> +1153: <span class="ruby-comment cmt"># task B: -D &lt;-- |</span> +1154: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@end</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">startDate</span> <span class="ruby-operator">&gt;</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">&quot;Task #{@property.fullId} has a too weak start dependencies &quot;</span> <span class="ruby-operator">+</span> +1157: <span class="ruby-value str">&quot;to be scheduled properly.&quot;</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">&lt;&lt;</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">&lt;&lt;</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">&gt;=</span> <span class="ruby-identifier">endIdx</span> <span class="ruby-operator">||</span> -1378: (<span class="ruby-identifier">resource</span> <span class="ruby-operator">&amp;&amp;</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">&gt;=</span> <span class="ruby-identifier">endIdx</span> <span class="ruby-operator">||</span> +1429: (<span class="ruby-identifier">resource</span> <span class="ruby-operator">&amp;&amp;</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">&gt;=</span> <span class="ruby-identifier">endIdx</span> <span class="ruby-operator">||</span> -1409: (<span class="ruby-identifier">resource</span> <span class="ruby-operator">&amp;&amp;</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">&gt;=</span> <span class="ruby-identifier">endIdx</span> <span class="ruby-operator">||</span> +1460: (<span class="ruby-identifier">resource</span> <span class="ruby-operator">&amp;&amp;</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">&gt;</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">&gt;</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">&gt;</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">&gt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@duration</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">||</span> <span class="ruby-ivar">@effort</span> <span class="ruby-operator">&gt;</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-&gt;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-&gt;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-&gt;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-&gt;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">&gt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">dateBeforeLengthGap</span> <span class="ruby-operator">&gt;</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">&lt;</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">&gt;</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">&amp;&amp;</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">&lt;</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: | --&gt; D-</span> -1160: <span class="ruby-comment cmt"># task B: -D &lt;-- |</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">&amp;&amp;</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">&gt;</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">&quot;Task #{@property.fullId} has a too weak end dependencies &quot;</span> <span class="ruby-operator">+</span> -1164: <span class="ruby-value str">&quot;to be scheduled properly.&quot;</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">&gt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">dateBeforeLengthGap</span> <span class="ruby-operator">&gt;</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">&lt;</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">&gt;</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">&amp;&amp;</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">&lt;</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: | --&gt; D-</span> +1210: <span class="ruby-comment cmt"># task B: -D &lt;-- |</span> +1211: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@start</span> <span class="ruby-operator">&amp;&amp;</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">&gt;</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">&quot;Task #{@property.fullId} has a too weak end dependencies &quot;</span> <span class="ruby-operator">+</span> +1214: <span class="ruby-value str">&quot;to be scheduled properly.&quot;</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">&gt;</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">&quot;Some tasks did not fit into the project time &quot;</span> <span class="ruby-operator">+</span> -370: <span class="ruby-value str">&quot;frame.&quot;</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">&quot;Task #{@property.fullId} has not been marked as scheduled.&quot;</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">&quot;Task #{@property.fullId} has undefined start time&quot;</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">&lt;</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">&gt;</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">&quot;The start time (#{a('start')}) of task #{@property.fullId} &quot;</span> <span class="ruby-operator">+</span> -396: <span class="ruby-node">&quot;is outside the project interval (#{@project['start']} - &quot;</span> <span class="ruby-operator">+</span> -397: <span class="ruby-node">&quot;#{@project['end']})&quot;</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">&amp;&amp;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>) <span class="ruby-operator">&lt;</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">&quot;The start time (#{a('start')}) of task #{@property.fullId} &quot;</span> <span class="ruby-operator">+</span> -402: <span class="ruby-node">&quot;is too early. Must be after #{a('minstart')}.&quot;</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">&amp;&amp;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>) <span class="ruby-operator">&gt;</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">&quot;The start time (#{a('start')}) of task #{@property.fullId} &quot;</span> <span class="ruby-operator">+</span> -407: <span class="ruby-node">&quot;is too late. Must be before #{a('maxstart')}.&quot;</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">&quot;Task #{@property.fullId} has undefined end time&quot;</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">&lt;</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">&gt;</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">&quot;The end time (#{a('end')}) of task #{@property.fullId} &quot;</span> <span class="ruby-operator">+</span> -415: <span class="ruby-node">&quot;is outside the project interval (#{@project['start']} - &quot;</span> <span class="ruby-operator">+</span> -416: <span class="ruby-node">&quot;#{@project['end']})&quot;</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">&amp;&amp;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>) <span class="ruby-operator">&lt;</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">&quot;The end time (#{a('end')}) of task #{@property.fullId} &quot;</span> <span class="ruby-operator">+</span> -421: <span class="ruby-node">&quot;is too early. Must be after #{a('minend')}.&quot;</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">&amp;&amp;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>) <span class="ruby-operator">&gt;</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">&quot;The end time (#{a('end')}) of task #{@property.fullId} &quot;</span> <span class="ruby-operator">+</span> -426: <span class="ruby-node">&quot;is too late. Must be before #{a('maxend')}.&quot;</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">&gt;</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">&quot;Some tasks did not fit into the project time &quot;</span> <span class="ruby-operator">+</span> +399: <span class="ruby-value str">&quot;frame.&quot;</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">&quot;Task #{@property.fullId} has not been marked as scheduled.&quot;</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">&quot;Task #{@property.fullId} has undefined start time&quot;</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">&lt;</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">&gt;</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">&quot;The start time (#{@start}) of task #{@property.fullId} &quot;</span> <span class="ruby-operator">+</span> +425: <span class="ruby-node">&quot;is outside the project interval (#{@project['start']} - &quot;</span> <span class="ruby-operator">+</span> +426: <span class="ruby-node">&quot;#{@project['end']})&quot;</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">&gt;</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">&quot;The start time (#{a('start')}) of task #{@property.fullId} &quot;</span> <span class="ruby-operator">+</span> -432: <span class="ruby-node">&quot;is after the end time (#{a('end')}).&quot;</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">&lt;</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">&quot;The start date (#{a('start')}) of task #{@property.fullId} &quot;</span> <span class="ruby-operator">+</span> -443: <span class="ruby-value str">&quot;is before the start date of the enclosing task &quot;</span> <span class="ruby-operator">+</span> -444: <span class="ruby-node">&quot;#{parent['start', @scenarioIdx]}. &quot;</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">&gt;</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">&quot;The end date (#{a('end')}) of task #{@property.fullId} &quot;</span> <span class="ruby-operator">+</span> -449: <span class="ruby-value str">&quot;is after the end date of the enclosing task &quot;</span> <span class="ruby-operator">+</span> -450: <span class="ruby-node">&quot;#{parent['end', @scenarioIdx]}. &quot;</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">&lt;</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">&quot;Task #{@property.fullId} must start after &quot;</span> <span class="ruby-operator">+</span> -462: <span class="ruby-node">&quot;#{dependency.onEnd ? 'end' : 'start'} of task &quot;</span> <span class="ruby-operator">+</span> -463: <span class="ruby-node">&quot;#{task.fullId}.&quot;</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">&gt;</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">&gt;</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">&quot;Task #{@property.fullId} must start &quot;</span> <span class="ruby-operator">+</span> -469: <span class="ruby-node">&quot;#{dependency.gapDuration / (60 * 60 * 24)} days after &quot;</span> <span class="ruby-operator">+</span> -470: <span class="ruby-node">&quot;#{dependency.onEnd ? 'end' : 'start'} of task &quot;</span> <span class="ruby-operator">+</span> -471: <span class="ruby-node">&quot;#{task.fullId}. TaskJuggler cannot enforce this condition &quot;</span> <span class="ruby-operator">+</span> -472: <span class="ruby-value str">&quot;because the task is scheduled ALAP (finish-to-start) or &quot;</span> <span class="ruby-operator">+</span> -473: <span class="ruby-node">&quot;has a fixed #{dependency.onEnd ? 'end' : 'start'} date.&quot;</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">&gt;</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">&lt;</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">&quot;Task #{@property.fullId} must start &quot;</span> <span class="ruby-operator">+</span> -480: <span class="ruby-node">&quot;#{@project.slotsToDays(dependency.gapLength)} &quot;</span> <span class="ruby-operator">+</span> -481: <span class="ruby-value str">&quot;working days after &quot;</span> <span class="ruby-operator">+</span> -482: <span class="ruby-node">&quot;#{dependency.onEnd ? 'end' : 'start'} of task &quot;</span> <span class="ruby-operator">+</span> -483: <span class="ruby-node">&quot;#{task.fullId}. TaskJuggler cannot enforce this condition &quot;</span> <span class="ruby-operator">+</span> -484: <span class="ruby-value str">&quot;because the task is scheduled ALAP (finish-to-start) or &quot;</span> <span class="ruby-operator">+</span> -485: <span class="ruby-node">&quot;has a fixed #{dependency.onEnd ? 'end' : 'start'} date.&quot;</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">&lt;</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">&quot;Task #{@property.fullId} must end before &quot;</span> <span class="ruby-operator">+</span> -498: <span class="ruby-node">&quot;#{dependency.onEnd ? 'end' : 'start'} of task #{task.fullId}.&quot;</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">&gt;</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">&lt;</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">&quot;Task #{@property.fullId} must end &quot;</span> <span class="ruby-operator">+</span> -504: <span class="ruby-node">&quot;#{dependency.gapDuration / (60 * 60 * 24)} days before &quot;</span> <span class="ruby-operator">+</span> -505: <span class="ruby-node">&quot;#{dependency.onEnd ? 'end' : 'start'} of task &quot;</span> <span class="ruby-operator">+</span> -506: <span class="ruby-node">&quot;#{task.fullId}. TaskJuggler cannot enforce this condition &quot;</span> <span class="ruby-operator">+</span> -507: <span class="ruby-value str">&quot;because the task is scheduled ASAP (start-to-finish) or &quot;</span> <span class="ruby-operator">+</span> -508: <span class="ruby-node">&quot;has a fixed #{dependency.onEnd ? 'end' : 'start'} date.&quot;</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">&gt;</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">&lt;</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">&quot;Task #{@property.fullId} must end &quot;</span> <span class="ruby-operator">+</span> -515: <span class="ruby-node">&quot;#{@project.slotsToDays(dependency.gapLength)} &quot;</span> <span class="ruby-operator">+</span> -516: <span class="ruby-value str">&quot;working days before &quot;</span> <span class="ruby-operator">+</span> -517: <span class="ruby-node">&quot;#{dependency.onEnd ? 'end' : 'start'} of task &quot;</span> <span class="ruby-operator">+</span> -518: <span class="ruby-node">&quot;#{task.fullId}. TaskJuggler cannot enforce this condition &quot;</span> <span class="ruby-operator">+</span> -519: <span class="ruby-value str">&quot;because the task is scheduled ASAP (start-to-finish) or &quot;</span> <span class="ruby-operator">+</span> -520: <span class="ruby-node">&quot;has a fixed #{dependency.onEnd ? 'end' : 'start'} date.&quot;</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">&amp;&amp;</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">&quot;Milestone #{@property.fullId} must have identical start and &quot;</span> <span class="ruby-operator">+</span> -528: <span class="ruby-value str">&quot;end date.&quot;</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">&amp;&amp;</span> <span class="ruby-ivar">@start</span> <span class="ruby-operator">&lt;</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">&quot;The start time (#{@start}) of task #{@property.fullId} &quot;</span> <span class="ruby-operator">+</span> +431: <span class="ruby-node">&quot;is too early. Must be after #{@minstart}.&quot;</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">&amp;&amp;</span> <span class="ruby-ivar">@start</span> <span class="ruby-operator">&gt;</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">&quot;The start time (#{@start}) of task #{@property.fullId} &quot;</span> <span class="ruby-operator">+</span> +436: <span class="ruby-node">&quot;is too late. Must be before #{@maxstart}.&quot;</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">&quot;Task #{@property.fullId} has undefined end time&quot;</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">&lt;</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">&gt;</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">&quot;The end time (#{@end}) of task #{@property.fullId} &quot;</span> <span class="ruby-operator">+</span> +444: <span class="ruby-node">&quot;is outside the project interval (#{@project['start']} - &quot;</span> <span class="ruby-operator">+</span> +445: <span class="ruby-node">&quot;#{@project['end']})&quot;</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">&amp;&amp;</span> <span class="ruby-ivar">@end</span> <span class="ruby-operator">&lt;</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">&quot;The end time (#{@end}) of task #{@property.fullId} &quot;</span> <span class="ruby-operator">+</span> +450: <span class="ruby-node">&quot;is too early. Must be after #{@minend}.&quot;</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">&amp;&amp;</span> <span class="ruby-ivar">@end</span> <span class="ruby-operator">&gt;</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">&quot;The end time (#{@end}) of task #{@property.fullId} &quot;</span> <span class="ruby-operator">+</span> +455: <span class="ruby-node">&quot;is too late. Must be before #{@maxend}.&quot;</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">&gt;</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">&quot;The start time (#{@start}) of task #{@property.fullId} &quot;</span> <span class="ruby-operator">+</span> +461: <span class="ruby-node">&quot;is after the end time (#{@end}).&quot;</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">&lt;</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">&quot;The start date (#{@start}) of task #{@property.fullId} &quot;</span> <span class="ruby-operator">+</span> +472: <span class="ruby-node">&quot;is before the start date (#{parent['start', @scenarioIdx]}) &quot;</span> <span class="ruby-operator">+</span> +473: <span class="ruby-value str">&quot;of the enclosing task.&quot;</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">&gt;</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">&quot;The end date (#{@end}) of task #{@property.fullId} &quot;</span> <span class="ruby-operator">+</span> +478: <span class="ruby-node">&quot;is after the end date (#{parent['end', @scenarioIdx]}) &quot;</span> <span class="ruby-operator">+</span> +479: <span class="ruby-value str">&quot;of the enclosing task.&quot;</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">&lt;</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">&quot;Task #{@property.fullId} (#{@start}) must start after &quot;</span> <span class="ruby-operator">+</span> +491: <span class="ruby-node">&quot;#{dependency.onEnd ? 'end' : 'start'} (#{limit}) of task &quot;</span> <span class="ruby-operator">+</span> +492: <span class="ruby-node">&quot;#{task.fullId}.&quot;</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">&gt;</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">&gt;</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">&quot;Task #{@property.fullId} must start &quot;</span> <span class="ruby-operator">+</span> +498: <span class="ruby-node">&quot;#{dependency.gapDuration / (60 * 60 * 24)} days after &quot;</span> <span class="ruby-operator">+</span> +499: <span class="ruby-node">&quot;#{dependency.onEnd ? 'end' : 'start'} of task &quot;</span> <span class="ruby-operator">+</span> +500: <span class="ruby-node">&quot;#{task.fullId}. TaskJuggler cannot enforce this condition &quot;</span> <span class="ruby-operator">+</span> +501: <span class="ruby-value str">&quot;because the task is scheduled ALAP (finish-to-start) or &quot;</span> <span class="ruby-operator">+</span> +502: <span class="ruby-node">&quot;has a fixed #{dependency.onEnd ? 'end' : 'start'} date.&quot;</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">&gt;</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">&lt;</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">&quot;Task #{@property.fullId} must start &quot;</span> <span class="ruby-operator">+</span> +509: <span class="ruby-node">&quot;#{@project.slotsToDays(dependency.gapLength)} &quot;</span> <span class="ruby-operator">+</span> +510: <span class="ruby-value str">&quot;working days after &quot;</span> <span class="ruby-operator">+</span> +511: <span class="ruby-node">&quot;#{dependency.onEnd ? 'end' : 'start'} of task &quot;</span> <span class="ruby-operator">+</span> +512: <span class="ruby-node">&quot;#{task.fullId}. TaskJuggler cannot enforce this condition &quot;</span> <span class="ruby-operator">+</span> +513: <span class="ruby-value str">&quot;because the task is scheduled ALAP (finish-to-start) or &quot;</span> <span class="ruby-operator">+</span> +514: <span class="ruby-node">&quot;has a fixed #{dependency.onEnd ? 'end' : 'start'} date.&quot;</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">&lt;</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">&quot;Task #{@property.fullId} (#{@end}) must end before &quot;</span> <span class="ruby-operator">+</span> +527: <span class="ruby-node">&quot;#{dependency.onEnd ? 'end' : 'start'} (#{limit}) of task &quot;</span> <span class="ruby-operator">+</span> +528: <span class="ruby-node">&quot;#{task.fullId}.&quot;</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">&gt;</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">&lt;</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">&quot;Task #{@property.fullId} must end &quot;</span> <span class="ruby-operator">+</span> +534: <span class="ruby-node">&quot;#{dependency.gapDuration / (60 * 60 * 24)} days before &quot;</span> <span class="ruby-operator">+</span> +535: <span class="ruby-node">&quot;#{dependency.onEnd ? 'end' : 'start'} of task &quot;</span> <span class="ruby-operator">+</span> +536: <span class="ruby-node">&quot;#{task.fullId}. TaskJuggler cannot enforce this condition &quot;</span> <span class="ruby-operator">+</span> +537: <span class="ruby-value str">&quot;because the task is scheduled ASAP (start-to-finish) or &quot;</span> <span class="ruby-operator">+</span> +538: <span class="ruby-node">&quot;has a fixed #{dependency.onEnd ? 'end' : 'start'} date.&quot;</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">&gt;</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">&lt;</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">&quot;Task #{@property.fullId} must end &quot;</span> <span class="ruby-operator">+</span> +545: <span class="ruby-node">&quot;#{@project.slotsToDays(dependency.gapLength)} &quot;</span> <span class="ruby-operator">+</span> +546: <span class="ruby-value str">&quot;working days before &quot;</span> <span class="ruby-operator">+</span> +547: <span class="ruby-node">&quot;#{dependency.onEnd ? 'end' : 'start'} of task &quot;</span> <span class="ruby-operator">+</span> +548: <span class="ruby-node">&quot;#{task.fullId}. TaskJuggler cannot enforce this condition &quot;</span> <span class="ruby-operator">+</span> +549: <span class="ruby-value str">&quot;because the task is scheduled ASAP (start-to-finish) or &quot;</span> <span class="ruby-operator">+</span> +550: <span class="ruby-node">&quot;has a fixed #{dependency.onEnd ? 'end' : 'start'} date.&quot;</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">&amp;&amp;</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">&quot;Milestone #{@property.fullId} must have identical start and &quot;</span> <span class="ruby-operator">+</span> +558: <span class="ruby-value str">&quot;end date.&quot;</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">&amp;&amp;</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@milestone</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@allocate</span>.<span class="ruby-identifier">empty?</span> <span class="ruby-operator">&amp;&amp;</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">&quot;Task #{@property.id} has resource allocation requested, but &quot;</span> <span class="ruby-operator">+</span> +569: <span class="ruby-value str">&quot;did not get any resources assigned. Either use 'effort' &quot;</span> <span class="ruby-operator">+</span> +570: <span class="ruby-value str">&quot;to ensure allocations or use a higher 'priority'.&quot;</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">&quot;Chargesets may not include group account #{account.fullId}.&quot;</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">&quot;Container task #{@property.fullId} may not have bookings.&quot;</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">&amp;&amp;</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">&quot;Milestone #{@property.fullId} may not have bookings.&quot;</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">&amp;&amp;</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">&quot;Task #{@property.fullId} is marked as scheduled but does not &quot;</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">&gt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</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">&quot;Task #{@property.fullId} has an effort but no resource &quot;</span> <span class="ruby-operator">+</span> -182: <span class="ruby-value str">&quot;allocations.&quot;</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">&gt;</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">&gt;</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">&gt;</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-&gt;: ASAP task with duration criteria</span> -200: <span class="ruby-comment cmt"># &lt;-x: ALAP task with duration criteria</span> -201: <span class="ruby-comment cmt"># --&gt;: ASAP task without duration criteria</span> -202: <span class="ruby-comment cmt"># &lt;--: 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">&gt;</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">&quot;Container task #{@property.fullId} may not have a duration &quot;</span> <span class="ruby-operator">+</span> -208: <span class="ruby-value str">&quot;or be marked as milestones.&quot;</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">&gt;</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">&quot;Milestone task #{@property.fullId} may not have a duration.&quot;</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">&amp;&amp;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>) <span class="ruby-operator">&amp;&amp;</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">&quot;Start (#{a('start')}) and end (#{a('end')}) dates of &quot;</span> <span class="ruby-operator">+</span> -229: <span class="ruby-node">&quot;milestone task #{@property.fullId} must be identical.&quot;</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-&gt; - ok |D x-&gt; - ok - x-&gt; - inhS -D x-&gt; - ok</span> -243: <span class="ruby-comment cmt"># | x-&gt; | err1 |D x-&gt; | err1 - x-&gt; | inhS -D x-&gt; | err1</span> -244: <span class="ruby-comment cmt"># | x-&gt; -D ok |D x-&gt; -D ok - x-&gt; -D inhS -D x-&gt; -D ok</span> -245: <span class="ruby-comment cmt"># | x-&gt; |D err1 |D x-&gt; |D err1 - x-&gt; |D inhS -D x-&gt; |D err1</span> -246: <span class="ruby-comment cmt"># | --&gt; - AMP |D --&gt; - AMP - --&gt; - AMPi -D --&gt; - AMP</span> -247: <span class="ruby-comment cmt"># | --&gt; | ok |D --&gt; | ok - --&gt; | inhS -D --&gt; | ok</span> -248: <span class="ruby-comment cmt"># | --&gt; -D ok |D --&gt; -D ok - --&gt; -D inhS -D --&gt; -D ok</span> -249: <span class="ruby-comment cmt"># | --&gt; |D ok |D --&gt; |D ok - --&gt; |D inhS -D --&gt; |D ok</span> -250: <span class="ruby-comment cmt"># | &lt;-x - inhE |D &lt;-x - inhE - &lt;-x - inhE -D &lt;-x - inhE</span> -251: <span class="ruby-comment cmt"># | &lt;-x | err1 |D &lt;-x | err1 - &lt;-x | ok -D &lt;-x | ok</span> -252: <span class="ruby-comment cmt"># | &lt;-x -D err1 |D &lt;-x -D err1 - &lt;-x -D ok -D &lt;-x -D ok</span> -253: <span class="ruby-comment cmt"># | &lt;-x |D err1 |D &lt;-x |D err1 - &lt;-x |D ok -D &lt;-x |D ok</span> -254: <span class="ruby-comment cmt"># | &lt;-- - inhE |D &lt;-- - inhE - &lt;-- - AMP -D &lt;-- - inhE</span> -255: <span class="ruby-comment cmt"># | &lt;-- | ok |D &lt;-- | ok - &lt;-- | AMP -D &lt;-- | ok</span> -256: <span class="ruby-comment cmt"># | &lt;-- -D ok |D &lt;-- -D ok - &lt;-- -D AMP -D &lt;-- -D ok</span> -257: <span class="ruby-comment cmt"># | &lt;-- |D ok |D &lt;-- |D ok - &lt;-- |D AMP -D &lt;-- |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"># - --&gt; -</span> -263: <span class="ruby-comment cmt"># | --&gt; -</span> -264: <span class="ruby-comment cmt"># |D --&gt; -</span> -265: <span class="ruby-comment cmt"># -D --&gt; -</span> -266: <span class="ruby-comment cmt"># - &lt;-- -</span> -267: <span class="ruby-comment cmt"># - &lt;-- |</span> -268: <span class="ruby-comment cmt"># - &lt;-- -D</span> -269: <span class="ruby-comment cmt"># - &lt;-- |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">&amp;&amp;</span> -271: ((<span class="ruby-identifier">a</span>(<span class="ruby-value str">'forward'</span>) <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>).<span class="ruby-identifier">nil?</span> <span class="ruby-operator">&amp;&amp;</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">&amp;&amp;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>).<span class="ruby-identifier">nil?</span> <span class="ruby-operator">&amp;&amp;</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">&quot;Task #{@property.fullId} has too few specifations to be &quot;</span> <span class="ruby-operator">+</span> -275: <span class="ruby-value str">&quot;scheduled.&quot;</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-&gt; |</span> -280: <span class="ruby-comment cmt"># | &lt;-x |</span> -281: <span class="ruby-comment cmt"># | x-&gt; |D</span> -282: <span class="ruby-comment cmt"># | &lt;-x |D</span> -283: <span class="ruby-comment cmt"># |D x-&gt; |</span> -284: <span class="ruby-comment cmt"># |D &lt;-x |</span> -285: <span class="ruby-comment cmt"># |D &lt;-x |D</span> -286: <span class="ruby-comment cmt"># |D x-&gt; |D</span> -287: <span class="ruby-comment cmt"># -D x-&gt; |</span> -288: <span class="ruby-comment cmt"># -D x-&gt; |D</span> -289: <span class="ruby-comment cmt"># |D &lt;-x -D</span> -290: <span class="ruby-comment cmt"># | &lt;-x -D</span> -291: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">durationSpecs</span> <span class="ruby-operator">&gt;</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">&quot;Tasks may only have either a duration, length or effort or &quot;</span> <span class="ruby-operator">+</span> -294: <span class="ruby-value str">&quot;be a milestone.&quot;</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">&amp;&amp;</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">&amp;&amp;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'forward'</span>) <span class="ruby-operator">&amp;&amp;</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">&amp;&amp;</span> <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'forward'</span>) <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">startSpeced</span>)) <span class="ruby-operator">&amp;&amp;</span> -301: <span class="ruby-identifier">durationSpecs</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</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">&quot;Task #{@property.fullId} has a start, an end and a &quot;</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">&quot;Chargesets may not include group account #{account.fullId}.&quot;</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">&quot;Container task #{@property.fullId} may not have bookings.&quot;</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">&amp;&amp;</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">&quot;Milestone #{@property.fullId} may not have bookings.&quot;</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">&amp;&amp;</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">&quot;Task #{@property.fullId} is marked as scheduled but does not &quot;</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">&gt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</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">&quot;Task #{@property.fullId} has an effort but no resource &quot;</span> <span class="ruby-operator">+</span> +211: <span class="ruby-value str">&quot;allocations.&quot;</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">&gt;</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">&gt;</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">&gt;</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-&gt;: ASAP task with duration criteria</span> +229: <span class="ruby-comment cmt"># &lt;-x: ALAP task with duration criteria</span> +230: <span class="ruby-comment cmt"># --&gt;: ASAP task without duration criteria</span> +231: <span class="ruby-comment cmt"># &lt;--: 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">&gt;</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">&quot;Container task #{@property.fullId} may not have a duration &quot;</span> <span class="ruby-operator">+</span> +237: <span class="ruby-value str">&quot;or be marked as milestones.&quot;</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">&gt;</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">&quot;Milestone task #{@property.fullId} may not have a duration.&quot;</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">&amp;&amp;</span> <span class="ruby-ivar">@end</span> <span class="ruby-operator">&amp;&amp;</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">&quot;Start (#{@start}) and end (#{@end}) dates of &quot;</span> <span class="ruby-operator">+</span> +258: <span class="ruby-node">&quot;milestone task #{@property.fullId} must be identical.&quot;</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-&gt; - ok |D x-&gt; - ok - x-&gt; - inhS -D x-&gt; - ok</span> +272: <span class="ruby-comment cmt"># | x-&gt; | err1 |D x-&gt; | err1 - x-&gt; | inhS -D x-&gt; | err1</span> +273: <span class="ruby-comment cmt"># | x-&gt; -D ok |D x-&gt; -D ok - x-&gt; -D inhS -D x-&gt; -D ok</span> +274: <span class="ruby-comment cmt"># | x-&gt; |D err1 |D x-&gt; |D err1 - x-&gt; |D inhS -D x-&gt; |D err1</span> +275: <span class="ruby-comment cmt"># | --&gt; - AMP |D --&gt; - AMP - --&gt; - AMPi -D --&gt; - AMP</span> +276: <span class="ruby-comment cmt"># | --&gt; | ok |D --&gt; | ok - --&gt; | inhS -D --&gt; | ok</span> +277: <span class="ruby-comment cmt"># | --&gt; -D ok |D --&gt; -D ok - --&gt; -D inhS -D --&gt; -D ok</span> +278: <span class="ruby-comment cmt"># | --&gt; |D ok |D --&gt; |D ok - --&gt; |D inhS -D --&gt; |D ok</span> +279: <span class="ruby-comment cmt"># | &lt;-x - inhE |D &lt;-x - inhE - &lt;-x - inhE -D &lt;-x - inhE</span> +280: <span class="ruby-comment cmt"># | &lt;-x | err1 |D &lt;-x | err1 - &lt;-x | ok -D &lt;-x | ok</span> +281: <span class="ruby-comment cmt"># | &lt;-x -D err1 |D &lt;-x -D err1 - &lt;-x -D ok -D &lt;-x -D ok</span> +282: <span class="ruby-comment cmt"># | &lt;-x |D err1 |D &lt;-x |D err1 - &lt;-x |D ok -D &lt;-x |D ok</span> +283: <span class="ruby-comment cmt"># | &lt;-- - inhE |D &lt;-- - inhE - &lt;-- - AMP -D &lt;-- - inhE</span> +284: <span class="ruby-comment cmt"># | &lt;-- | ok |D &lt;-- | ok - &lt;-- | AMP -D &lt;-- | ok</span> +285: <span class="ruby-comment cmt"># | &lt;-- -D ok |D &lt;-- -D ok - &lt;-- -D AMP -D &lt;-- -D ok</span> +286: <span class="ruby-comment cmt"># | &lt;-- |D ok |D &lt;-- |D ok - &lt;-- |D AMP -D &lt;-- |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"># - --&gt; -</span> +292: <span class="ruby-comment cmt"># | --&gt; -</span> +293: <span class="ruby-comment cmt"># |D --&gt; -</span> +294: <span class="ruby-comment cmt"># -D --&gt; -</span> +295: <span class="ruby-comment cmt"># - &lt;-- -</span> +296: <span class="ruby-comment cmt"># - &lt;-- |</span> +297: <span class="ruby-comment cmt"># - &lt;-- -D</span> +298: <span class="ruby-comment cmt"># - &lt;-- |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">&amp;&amp;</span> +300: ((<span class="ruby-ivar">@forward</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-ivar">@end</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">&amp;&amp;</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">&amp;&amp;</span> <span class="ruby-ivar">@start</span>.<span class="ruby-identifier">nil?</span> <span class="ruby-operator">&amp;&amp;</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">&quot;Task #{@property.fullId} has too few specifations to be &quot;</span> <span class="ruby-operator">+</span> +304: <span class="ruby-value str">&quot;scheduled.&quot;</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">&amp;&amp;</span> <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'forward'</span>) <span class="ruby-operator">&amp;&amp;</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-&gt; |</span> +309: <span class="ruby-comment cmt"># | &lt;-x |</span> +310: <span class="ruby-comment cmt"># | x-&gt; |D</span> +311: <span class="ruby-comment cmt"># | &lt;-x |D</span> +312: <span class="ruby-comment cmt"># |D x-&gt; |</span> +313: <span class="ruby-comment cmt"># |D &lt;-x |</span> +314: <span class="ruby-comment cmt"># |D &lt;-x |D</span> +315: <span class="ruby-comment cmt"># |D x-&gt; |D</span> +316: <span class="ruby-comment cmt"># -D x-&gt; |</span> +317: <span class="ruby-comment cmt"># -D x-&gt; |D</span> +318: <span class="ruby-comment cmt"># |D &lt;-x -D</span> +319: <span class="ruby-comment cmt"># | &lt;-x -D</span> +320: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">durationSpecs</span> <span class="ruby-operator">&gt;</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">&quot;Tasks may only have either a duration, length or effort or &quot;</span> <span class="ruby-operator">+</span> +323: <span class="ruby-value str">&quot;be a milestone.&quot;</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">&amp;&amp;</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">&amp;&amp;</span> <span class="ruby-ivar">@forward</span> <span class="ruby-operator">&amp;&amp;</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">&amp;&amp;</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@forward</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">startSpeced</span>)) <span class="ruby-operator">&amp;&amp;</span> +330: <span class="ruby-identifier">durationSpecs</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</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">&quot;Task #{@property.fullId} has a start, an end and a &quot;</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">&amp;&amp;</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@forward</span> <span class="ruby-operator">&amp;&amp;</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">&amp;&amp;</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">&amp;&amp;</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">&amp;&amp;</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">&lt;&lt;</span> <span class="ruby-node">&quot;Milestone #{@property.fullId}: #{a('start')} -&gt; #{a('end')}&quot;</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">&lt;&lt;</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">&lt;&lt;</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">&amp;&amp;</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">&amp;&amp;</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">&amp;&amp;</span> <span class="ruby-ivar">@end</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-ivar">@effort</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-ivar">@length</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-ivar">@duration</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</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">&lt;&lt;</span> <span class="ruby-node">&quot;Task #{@property.fullId}: #{@start} -&gt; #{@end}&quot;</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">&lt;&lt;</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">&lt;&lt;</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">&gt;</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">&gt;</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">&gt;</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 &quot;Propagating #{thisEnd} date #{date} of #{@property.fullId} &quot; +</span> -886: <span class="ruby-comment cmt"># &quot;#{ignoreEffort ? &quot;ignoring effort&quot; : &quot;&quot; }&quot;</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">&lt;&lt;</span> <span class="ruby-node">&quot;Task #{@property.fullId}: #{a('start')} -&gt; #{a('end')}&quot;</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">&lt;&lt;</span> <span class="ruby-node">&quot;Milestone #{@property.fullId}: #{a('start')} -&gt; #{a('end')}&quot;</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">&amp;&amp;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>) <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>) <span class="ruby-operator">&amp;&amp;</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">&amp;&amp;</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">&amp;&amp;</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">&amp;&amp;</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">&lt;&lt;</span> <span class="ruby-node">&quot;Task #{@property.fullId} has been scheduled&quot;</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 &quot;Propagating #{thisEnd} date #{date} of #{@property.fullId} &quot; +</span> + 936: <span class="ruby-comment cmt"># &quot;#{ignoreEffort ? &quot;ignoring effort&quot; : &quot;&quot; }&quot;</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">&lt;&lt;</span> <span class="ruby-node">&quot;Task #{@property.fullId}: #{@start} -&gt; #{@end}&quot;</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">&lt;&lt;</span> <span class="ruby-node">&quot;Milestone #{@property.fullId}: #{@start} -&gt; #{@end}&quot;</span> + 960: <span class="ruby-keyword kw">elsif</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@scheduled</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-ivar">@start</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-ivar">@end</span> <span class="ruby-operator">&amp;&amp;</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">&amp;&amp;</span> <span class="ruby-ivar">@duration</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-ivar">@effort</span> <span class="ruby-operator">==</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</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">&lt;&lt;</span> <span class="ruby-node">&quot;Task #{@property.fullId} has been scheduled&quot;</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">&amp;&amp;</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">&amp;&amp;</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">&amp;&amp;</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">&amp;&amp;</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">&quot;#{complete.to_i}%&quot;</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">&quot;#{complete.to_i}%&quot;</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">&quot;[-&gt;]&quot;</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">&quot;[-&gt;[&quot;</span> -1255: <span class="ruby-keyword kw">end</span> -1256: <span class="ruby-identifier">list</span> <span class="ruby-operator">&lt;&lt;</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">&quot;]-&gt;]&quot;</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">&quot;]-&gt;[&quot;</span> -1266: <span class="ruby-keyword kw">end</span> -1267: <span class="ruby-identifier">list</span> <span class="ruby-operator">&lt;&lt;</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">&quot;[-&gt;]&quot;</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">&quot;[-&gt;[&quot;</span> +1305: <span class="ruby-keyword kw">end</span> +1306: <span class="ruby-identifier">list</span> <span class="ruby-operator">&lt;&lt;</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">&quot;]-&gt;]&quot;</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">&quot;]-&gt;[&quot;</span> +1316: <span class="ruby-keyword kw">end</span> +1317: <span class="ruby-identifier">list</span> <span class="ruby-operator">&lt;&lt;</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">&quot;]-&gt;[&quot;</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">&quot;[-&gt;[&quot;</span> -1284: <span class="ruby-keyword kw">end</span> -1285: <span class="ruby-identifier">list</span> <span class="ruby-operator">&lt;&lt;</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">&quot;]-&gt;]&quot;</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">&quot;[-&gt;]&quot;</span> -1295: <span class="ruby-keyword kw">end</span> -1296: <span class="ruby-identifier">list</span> <span class="ruby-operator">&lt;&lt;</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">&quot;]-&gt;[&quot;</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">&quot;[-&gt;[&quot;</span> +1334: <span class="ruby-keyword kw">end</span> +1335: <span class="ruby-identifier">list</span> <span class="ruby-operator">&lt;&lt;</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">&quot;]-&gt;]&quot;</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">&quot;[-&gt;]&quot;</span> +1345: <span class="ruby-keyword kw">end</span> +1346: <span class="ruby-identifier">list</span> <span class="ruby-operator">&lt;&lt;</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">&lt;&lt;</span> <span class="ruby-node">&quot;&lt;nowiki&gt;#{rti.to_s}&lt;/nowiki&gt;&quot;</span> -1319: <span class="ruby-keyword kw">else</span> -1320: <span class="ruby-identifier">list</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-node">&quot;&lt;nowiki&gt;#{resource.name} (#{resource.fullId})&lt;/nowiki&gt;&quot;</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">&lt;&lt;</span> <span class="ruby-node">&quot;&lt;nowiki&gt;#{rti.to_s}&lt;/nowiki&gt;&quot;</span> +1370: <span class="ruby-keyword kw">else</span> +1371: <span class="ruby-identifier">list</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-node">&quot;&lt;nowiki&gt;#{resource.name} (#{resource.fullId})&lt;/nowiki&gt;&quot;</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">&amp;&amp;</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">&amp;&amp;</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">&amp;&amp;</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">&amp;&amp;</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">&gt;</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">&lt;</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">&amp;&amp;</span> (<span class="ruby-ivar">@project</span>[<span class="ruby-value str">'now'</span>] <span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@start</span>) <span class="ruby-operator">&amp;&amp;</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">&lt;</span> <span class="ruby-identifier">lowerLimit</span> <span class="ruby-operator">||</span> <span class="ruby-identifier">upperLimit</span> <span class="ruby-operator">&lt;</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">&lt;</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">&gt;</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">&gt;</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">&lt;</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">&amp;&amp;</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">&quot;Start (#{a('start')}) and end (#{a('end')}) must be set&quot;</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">&lt;&lt;</span> <span class="ruby-node">&quot;Container task #{@property.fullId} completed: #{a('start')} -&gt; #{a('end')}&quot;</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">&lt;</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">&gt;</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">&gt;</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">&lt;</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">&amp;&amp;</span> <span class="ruby-ivar">@end</span> +1090: <span class="ruby-identifier">raise</span> <span class="ruby-node">&quot;Start (#{@start}) and end (#{@end}) must be set&quot;</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">&lt;&lt;</span> <span class="ruby-node">&quot;Container task #{@property.fullId} completed: #{@start} -&gt; #{@end}&quot;</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">&quot;Booked resources may not be group resources&quot;</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">&quot;Only forward scheduled tasks may have booking statements.&quot;</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">&gt;</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">&lt;</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">&amp;&amp;</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">&lt;</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">&lt;&lt;</span> <span class="ruby-node">&quot;Task #{@property.fullId} first booking: &quot;</span> <span class="ruby-operator">+</span> -1833: <span class="ruby-node">&quot;#{a('start')} -&gt; #{a('end')}&quot;</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">&lt;&lt;</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">&gt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</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">&amp;&amp;</span> <span class="ruby-ivar">@doneLength</span> <span class="ruby-operator">&gt;=</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">&gt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</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">&amp;&amp;</span> <span class="ruby-ivar">@doneDuration</span> <span class="ruby-operator">&gt;=</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">&gt;</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">&lt;</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">&lt;&lt;</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">&gt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-ivar">@effort</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">0</span>)) <span class="ruby-operator">&amp;&amp;</span> +1839: <span class="ruby-operator">!</span><span class="ruby-ivar">@scheduled</span> <span class="ruby-operator">&amp;&amp;</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">&gt;</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">&lt;&lt;</span> <span class="ruby-node">&quot;Task #{@property.fullId} first booking: &quot;</span> <span class="ruby-operator">+</span> +1844: <span class="ruby-node">&quot;#{@start} -&gt; #{@end}&quot;</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">&amp;&amp;</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">&gt;</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">&gt;=</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">&gt;</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">&gt;=</span> <span class="ruby-ivar">@length</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-identifier">date</span> <span class="ruby-operator">&gt;=</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">&gt;</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">&gt;=</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">&lt;</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">&gt;</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">&gt;</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">&gt;</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">&quot;The total effort (#{effort}d or #{effortHours}h) of the &quot;</span> <span class="ruby-operator">+</span> +1908: <span class="ruby-node">&quot;provided bookings for task #{@property.fullId} exceeds &quot;</span> <span class="ruby-operator">+</span> +1909: <span class="ruby-node">&quot;the specified effort of #{requestedEffort}d or &quot;</span> <span class="ruby-operator">+</span> +1910: <span class="ruby-node">&quot;#{requestedEffortHours}h.&quot;</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">&gt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-ivar">@doneLength</span> <span class="ruby-operator">&gt;</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">&quot;The total length (#{length}d) of the provided bookings &quot;</span> <span class="ruby-operator">+</span> +1918: <span class="ruby-node">&quot;for task #{@property.fullId} exceeds the specified length of &quot;</span> <span class="ruby-operator">+</span> +1919: <span class="ruby-node">&quot;#{requestedLength}d.&quot;</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">&gt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-ivar">@doneDuration</span> <span class="ruby-operator">&gt;</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">&quot;The total duration (#{duration}d) of the provided bookings &quot;</span> <span class="ruby-operator">+</span> +1928: <span class="ruby-node">&quot;for task #{@property.fullId} exceeds the specified duration &quot;</span> <span class="ruby-operator">+</span> +1929: <span class="ruby-node">&quot;of #{requestedDuration}d.&quot;</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">&gt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-ivar">@doneEffort</span> <span class="ruby-operator">&gt;=</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">&gt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</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">&lt;&lt;</span> <span class="ruby-node">&quot;Task #{@property.fullId} first assignment: &quot;</span> <span class="ruby-operator">+</span> -1742: <span class="ruby-node">&quot;#{a('start')} -&gt; #{a('end')}&quot;</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">&lt;&lt;</span> <span class="ruby-node">&quot;Task #{@property.fullId} last assignment: &quot;</span> <span class="ruby-operator">+</span> -1749: <span class="ruby-node">&quot;#{a('start')} -&gt; #{a('end')}&quot;</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">&gt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-ivar">@doneEffort</span> <span class="ruby-operator">&gt;=</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">&gt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</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">&lt;&lt;</span> <span class="ruby-node">&quot;Task #{@property.fullId} first assignment: &quot;</span> <span class="ruby-operator">+</span> +1745: <span class="ruby-node">&quot;#{@start} -&gt; #{@end}&quot;</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">&lt;&lt;</span> <span class="ruby-node">&quot;Task #{@property.fullId} last assignment: &quot;</span> <span class="ruby-operator">+</span> +1752: <span class="ruby-node">&quot;#{@start} -&gt; #{@end}&quot;</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">&lt;&lt;</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">&lt;&lt;</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">&amp;&amp;</span> -1653: <span class="ruby-identifier">date</span> <span class="ruby-operator">&lt;</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">&amp;&amp;</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">&lt;&lt;</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">&amp;&amp;</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">&lt;&lt;</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">&amp;&amp;</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">&lt;=</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">&lt;=</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">&lt;=</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">&lt;=</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">&gt;</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">&lt;=</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">&lt;=</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">&lt;=</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">&lt;=</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">&gt;</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">&lt;&lt;</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">&gt;</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">&lt;&lt;</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">&gt;</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">&gt;=</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">&gt;=</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">&quot;Task #{@property.fullId} has unknown #{depType} &quot;</span> <span class="ruby-operator">+</span> -2010: <span class="ruby-node">&quot;#{dependency.taskId}&quot;</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">&quot;Task #{@property.fullId} cannot &quot;</span> <span class="ruby-operator">+</span> -2017: <span class="ruby-value str">&quot;depend on self&quot;</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">&quot;Task #{@property.fullId} cannot depend on child &quot;</span> <span class="ruby-operator">+</span> -2025: <span class="ruby-node">&quot;#{depTask.fullId}&quot;</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">&quot;Task #{@property.fullId} cannot depend on parent &quot;</span> <span class="ruby-operator">+</span> -2033: <span class="ruby-node">&quot;#{depTask.fullId}&quot;</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">&amp;&amp;</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">&quot;No need to specify dependency #{depTask.fullId} multiple &quot;</span> <span class="ruby-operator">+</span> -2042: <span class="ruby-node">&quot;times for task #{@property.fullId}.&quot;</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">&quot;Task #{@property.fullId} has unknown #{depType} &quot;</span> <span class="ruby-operator">+</span> +2080: <span class="ruby-node">&quot;#{dependency.taskId}&quot;</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">&quot;Task #{@property.fullId} cannot &quot;</span> <span class="ruby-operator">+</span> +2087: <span class="ruby-value str">&quot;depend on self&quot;</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">&quot;Task #{@property.fullId} cannot depend on child &quot;</span> <span class="ruby-operator">+</span> +2095: <span class="ruby-node">&quot;#{depTask.fullId}&quot;</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">&quot;Task #{@property.fullId} cannot depend on parent &quot;</span> <span class="ruby-operator">+</span> +2103: <span class="ruby-node">&quot;#{depTask.fullId}&quot;</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">&amp;&amp;</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">&quot;No need to specify dependency #{depTask.fullId} multiple &quot;</span> <span class="ruby-operator">+</span> +2112: <span class="ruby-node">&quot;times for task #{@property.fullId}.&quot;</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">&gt;</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">&gt;</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">&quot;&lt;nowiki&gt;#{rti.to_s}&lt;/nowiki&gt;&quot;</span> -2315: <span class="ruby-keyword kw">else</span> -2316: <span class="ruby-node">&quot;&lt;nowiki&gt;#{task.name} (#{task.fullId}) #{dep} #{date}&lt;/nowiki&gt;&quot;</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">&gt;</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">&gt;</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">&quot;&lt;nowiki&gt;#{rti.to_s}&lt;/nowiki&gt;&quot;</span> +2382: <span class="ruby-keyword kw">else</span> +2383: <span class="ruby-node">&quot;&lt;nowiki&gt;#{task.name} (#{task.fullId}) #{dep} #{date}&lt;/nowiki&gt;&quot;</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">&gt;</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">&lt;&lt;</span> <span class="ruby-node">&quot;&lt;nowiki&gt;#{rti.to_s}&lt;/nowiki&gt;&quot;</span> -2333: <span class="ruby-keyword kw">else</span> -2334: <span class="ruby-identifier">list</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-node">&quot;&lt;nowiki&gt;#{task.name} (#{task.fullId}) #{date}&lt;/nowiki&gt;&quot;</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">&gt;</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">&lt;&lt;</span> <span class="ruby-node">&quot;&lt;nowiki&gt;#{rti.to_s}&lt;/nowiki&gt;&quot;</span> +2400: <span class="ruby-keyword kw">else</span> +2401: <span class="ruby-identifier">list</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-node">&quot;&lt;nowiki&gt;#{task.name} (#{task.fullId}) #{date}&lt;/nowiki&gt;&quot;</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. &gt; means ASAP task, &lt; 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 -&gt; S&gt; : Weak</span> -1906: <span class="ruby-comment cmt"># |-+ SS -&gt; S&lt; : Weak</span> -1907: <span class="ruby-comment cmt"># +-|- SP -&gt; S&gt; : Strong</span> -1908: <span class="ruby-comment cmt"># | +--- SP -&gt; S&lt; : 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 -&gt; S&gt; : Weak</span> -1917: <span class="ruby-comment cmt"># |-+ ES -&gt; S&lt; : Strong</span> -1918: <span class="ruby-comment cmt"># ---+ | SP -&gt; E&gt; : Strong</span> -1919: <span class="ruby-comment cmt"># | +--- SP -&gt; E&lt; : 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 -&gt; E&gt; : Strong</span> -1927: <span class="ruby-comment cmt"># +-| ES -&gt; E&lt; : Strong</span> -1928: <span class="ruby-comment cmt"># -|-+ EP -&gt; E&gt; : Weak</span> -1929: <span class="ruby-comment cmt"># ---+ | EP -&gt; E&lt; : 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&gt; S&lt; E&gt; E&lt;</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">&amp;&amp;</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">&amp;&amp;</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. &gt; means ASAP task, &lt; 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 -&gt; S&gt; : Weak</span> +1976: <span class="ruby-comment cmt"># |-+ SS -&gt; S&lt; : Weak</span> +1977: <span class="ruby-comment cmt"># +-|- SP -&gt; S&gt; : Strong</span> +1978: <span class="ruby-comment cmt"># | +--- SP -&gt; S&lt; : 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 -&gt; S&gt; : Weak</span> +1987: <span class="ruby-comment cmt"># |-+ ES -&gt; S&lt; : Strong</span> +1988: <span class="ruby-comment cmt"># ---+ | SP -&gt; E&gt; : Strong</span> +1989: <span class="ruby-comment cmt"># | +--- SP -&gt; E&lt; : 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 -&gt; E&gt; : Strong</span> +1997: <span class="ruby-comment cmt"># +-| ES -&gt; E&lt; : Strong</span> +1998: <span class="ruby-comment cmt"># -|-+ EP -&gt; E&gt; : Weak</span> +1999: <span class="ruby-comment cmt"># ---+ | EP -&gt; E&lt; : 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&gt; S&lt; E&gt; E&lt;</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">&amp;&amp;</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">&amp;&amp;</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">&amp;&amp;</span> <span class="ruby-operator">!</span><span class="ruby-identifier">hasPredecessors</span> <span class="ruby-operator">&amp;&amp;</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">&lt;&lt;</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">&amp;&amp;</span> <span class="ruby-operator">!</span><span class="ruby-identifier">hasPredecessors</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-ivar">@milestone</span> +2258: <span class="ruby-identifier">list</span> <span class="ruby-operator">&lt;&lt;</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">&quot;Task #{@property.fullId} does not fit into &quot;</span> <span class="ruby-operator">+</span> -1975: <span class="ruby-value str">&quot;project time frame&quot;</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">&quot;Task #{@property.fullId} does not fit into &quot;</span> <span class="ruby-operator">+</span> +2045: <span class="ruby-value str">&quot;project time frame&quot;</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"># - --&gt; -</span> -1988: <span class="ruby-comment cmt"># | --&gt; -</span> -1989: <span class="ruby-comment cmt"># |D --&gt; -</span> -1990: <span class="ruby-comment cmt"># -D --&gt; -</span> -1991: <span class="ruby-comment cmt"># - &lt;-- -</span> -1992: <span class="ruby-comment cmt"># - &lt;-- |</span> -1993: <span class="ruby-comment cmt"># - &lt;-- -D</span> -1994: <span class="ruby-comment cmt"># - &lt;-- |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">&amp;&amp;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'forward'</span>) <span class="ruby-operator">&amp;&amp;</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">&amp;&amp;</span> <span class="ruby-operator">!</span><span class="ruby-identifier">a</span>(<span class="ruby-value str">'forward'</span>) <span class="ruby-operator">&amp;&amp;</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">&amp;&amp;</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"># - --&gt; -</span> +2058: <span class="ruby-comment cmt"># | --&gt; -</span> +2059: <span class="ruby-comment cmt"># |D --&gt; -</span> +2060: <span class="ruby-comment cmt"># -D --&gt; -</span> +2061: <span class="ruby-comment cmt"># - &lt;-- -</span> +2062: <span class="ruby-comment cmt"># - &lt;-- |</span> +2063: <span class="ruby-comment cmt"># - &lt;-- -D</span> +2064: <span class="ruby-comment cmt"># - &lt;-- |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">&amp;&amp;</span> <span class="ruby-ivar">@forward</span> <span class="ruby-operator">&amp;&amp;</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">&amp;&amp;</span> <span class="ruby-operator">!</span><span class="ruby-ivar">@forward</span> <span class="ruby-operator">&amp;&amp;</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">&amp;&amp;</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 &quot;Propagate #{atEnd ? 'end' : 'start'} to dep. #{task.fullId}&quot;</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">&amp;&amp;</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 &quot;Propagate #{atEnd ? 'end' : 'start'} to dep. #{task.fullId} done&quot;</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 &quot;Propagate #{atEnd ? 'end' : 'start'} to dep. #{task.fullId}&quot;</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">&amp;&amp;</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 &quot;Propagate #{atEnd ? 'end' : 'start'} to dep. #{task.fullId} done&quot;</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">&gt;</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">&gt;</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">&gt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-ivar">@doneLength</span> <span class="ruby-operator">&gt;=</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">&gt;</span> <span class="ruby-value">0</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-ivar">@doneDuration</span> <span class="ruby-operator">&gt;=</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">&gt;</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">&lt;</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">&gt;=</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">&amp;&amp;</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">&amp;&amp;</span> <span class="ruby-identifier">slot</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">slotDuration</span> <span class="ruby-operator">&gt;=</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">&amp;&amp;</span> <span class="ruby-identifier">slot</span> <span class="ruby-operator">&lt;=</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">&lt;</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">&gt;=</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">&gt;=</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">&gt;=</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">&amp;&amp;</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">&gt;=</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">&amp;&amp;</span> <span class="ruby-identifier">currentSlot</span> <span class="ruby-operator">&lt;=</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">&quot;Unknown task duration type #{@durationType}&quot;</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">&amp;&amp;</span> <span class="ruby-operator">!</span><span class="ruby-identifier">hasSuccessors</span> <span class="ruby-operator">&amp;&amp;</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">&lt;&lt;</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">&amp;&amp;</span> <span class="ruby-operator">!</span><span class="ruby-identifier">hasSuccessors</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-ivar">@milestone</span> +2291: <span class="ruby-identifier">list</span> <span class="ruby-operator">&lt;&lt;</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">&gt;</span> <span class="ruby-value">0.0</span> <span class="ruby-operator">&amp;&amp;</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">&gt;</span> <span class="ruby-value">0.0</span> <span class="ruby-operator">&amp;&amp;</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>