doc/TaskJuggler/NikuReport.html in taskjuggler-0.0.8 vs doc/TaskJuggler/NikuReport.html in taskjuggler-0.0.9

- old
+ new

@@ -149,10 +149,12 @@ <li><a href="../TaskJuggler/AttributeBase.html">TaskJuggler::AttributeBase</a></li> <li><a href="../TaskJuggler/AttributeDefinition.html">TaskJuggler::AttributeDefinition</a></li> + <li><a href="../TaskJuggler/AttributeOverwrite.html">TaskJuggler::AttributeOverwrite</a></li> + <li><a href="../TaskJuggler/BatchProcessor.html">TaskJuggler::BatchProcessor</a></li> <li><a href="../TaskJuggler/Booking.html">TaskJuggler::Booking</a></li> <li><a href="../TaskJuggler/BookingListAttribute.html">TaskJuggler::BookingListAttribute</a></li> @@ -227,10 +229,12 @@ <li><a href="../TaskJuggler/HTMLGraphics.html">TaskJuggler::HTMLGraphics</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> @@ -259,10 +263,12 @@ <li><a href="../TaskJuggler/LogicalExpression.html">TaskJuggler::LogicalExpression</a></li> <li><a href="../TaskJuggler/LogicalExpressionAttribute.html">TaskJuggler::LogicalExpressionAttribute</a></li> + <li><a href="../TaskJuggler/LogicalExpressionListAttribute.html">TaskJuggler::LogicalExpressionListAttribute</a></li> + <li><a href="../TaskJuggler/LogicalFlag.html">TaskJuggler::LogicalFlag</a></li> <li><a href="../TaskJuggler/LogicalFunction.html">TaskJuggler::LogicalFunction</a></li> <li><a href="../TaskJuggler/LogicalOperation.html">TaskJuggler::LogicalOperation</a></li> @@ -539,10 +545,12 @@ <li><a href="../TaskJuggler/VimSyntax.html">TaskJuggler::VimSyntax</a></li> <li><a href="../TaskJuggler/WebServer.html">TaskJuggler::WebServer</a></li> + <li><a href="../TaskJuggler/WelcomePage.html">TaskJuggler::WelcomePage</a></li> + <li><a href="../TaskJuggler/WorkingHours.html">TaskJuggler::WorkingHours</a></li> <li><a href="../TaskJuggler/WorkingHoursAttribute.html">TaskJuggler::WorkingHoursAttribute</a></li> <li><a href="../TaskJuggler/XMLBlob.html">TaskJuggler::XMLBlob</a></li> @@ -565,12 +573,10 @@ <li><a href="../RuntimeConfig.html">RuntimeConfig</a></li> <li><a href="../String.html">String</a></li> - <li><a href="../StringIO.html">StringIO</a></li> - </ul> <div id="no-class-search-results" style="display: none;">No matching classes.</div> </div> @@ -625,25 +631,29 @@ <div class="method-source-code" id="new-source"> <pre> - <span class="ruby-comment cmt"># File lib/reports/NikuReport.rb, line 55</span> -55: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">report</span>) -56: <span class="ruby-keyword kw">super</span>(<span class="ruby-identifier">report</span>) -57: -58: <span class="ruby-comment cmt"># A Hash to store NikuProject objects by id</span> -59: <span class="ruby-ivar">@projects</span> = {} -60: -61: <span class="ruby-comment cmt"># A Hash to map ClarityRID to Resource</span> -62: <span class="ruby-ivar">@resources</span> = {} -63: -64: <span class="ruby-comment cmt"># Resources total effort during the report period hashed by ClarityId</span> -65: <span class="ruby-ivar">@resourcesTotalEffort</span> = {} -66: -67: <span class="ruby-ivar">@scenarioIdx</span> = <span class="ruby-keyword kw">nil</span> -68: <span class="ruby-keyword kw">end</span></pre> + <span class="ruby-comment cmt"># File lib/reports/NikuReport.rb, line 56</span> +56: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">initialize</span>(<span class="ruby-identifier">report</span>) +57: <span class="ruby-keyword kw">super</span>(<span class="ruby-identifier">report</span>) +58: +59: <span class="ruby-comment cmt"># A Hash to store NikuProject objects by id</span> +60: <span class="ruby-ivar">@projects</span> = {} +61: +62: <span class="ruby-comment cmt"># A Hash to map ClarityRID to Resource</span> +63: <span class="ruby-ivar">@resources</span> = {} +64: +65: <span class="ruby-comment cmt"># Unallocated and vacation time during the report period for all</span> +66: <span class="ruby-comment cmt"># resources hashed by ClarityId. Values are in days.</span> +67: <span class="ruby-ivar">@resourcesFreeWork</span> = {} +68: +69: <span class="ruby-comment cmt"># Resources total effort during the report period hashed by ClarityId</span> +70: <span class="ruby-ivar">@resourcesTotalEffort</span> = {} +71: +72: <span class="ruby-ivar">@scenarioIdx</span> = <span class="ruby-keyword kw">nil</span> +73: <span class="ruby-keyword kw">end</span></pre> </div> </div> @@ -676,20 +686,20 @@ <div class="method-source-code" id="generate-ntermediate-ormat-source"> <pre> - <span class="ruby-comment cmt"># File lib/reports/NikuReport.rb, line 70</span> -70: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">generateIntermediateFormat</span> -71: <span class="ruby-keyword kw">super</span> -72: -73: <span class="ruby-ivar">@scenarioIdx</span> = <span class="ruby-identifier">a</span>(<span class="ruby-value str">'scenarios'</span>)[<span class="ruby-value">0</span>] -74: -75: <span class="ruby-identifier">computeResourceTotals</span> -76: <span class="ruby-identifier">collectProjects</span> -77: <span class="ruby-identifier">computeProjectAllocations</span> -78: <span class="ruby-keyword kw">end</span></pre> + <span class="ruby-comment cmt"># File lib/reports/NikuReport.rb, line 75</span> +75: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">generateIntermediateFormat</span> +76: <span class="ruby-keyword kw">super</span> +77: +78: <span class="ruby-ivar">@scenarioIdx</span> = <span class="ruby-identifier">a</span>(<span class="ruby-value str">'scenarios'</span>)[<span class="ruby-value">0</span>] +79: +80: <span class="ruby-identifier">computeResourceTotals</span> +81: <span class="ruby-identifier">collectProjects</span> +82: <span class="ruby-identifier">computeProjectAllocations</span> +83: <span class="ruby-keyword kw">end</span></pre> </div> </div> @@ -716,39 +726,40 @@ <div class="method-source-code" id="to-csv-source"> <pre> - <span class="ruby-comment cmt"># File lib/reports/NikuReport.rb, line 196</span> -196: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">to_csv</span> -197: <span class="ruby-identifier">table</span> = [] -198: <span class="ruby-comment cmt"># Header line with project names</span> -199: <span class="ruby-identifier">table</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">row</span> = []) -200: <span class="ruby-comment cmt"># First column is the resource name and ID.</span> -201: <span class="ruby-identifier">row</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value str">&quot;&quot;</span> -202: <span class="ruby-ivar">@projects</span>.<span class="ruby-identifier">each_key</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">projectId</span><span class="ruby-operator">|</span> -203: <span class="ruby-identifier">row</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-ivar">@projects</span>[<span class="ruby-identifier">projectId</span>].<span class="ruby-identifier">name</span> -204: <span class="ruby-keyword kw">end</span> -205: -206: <span class="ruby-comment cmt"># Header line with project IDs</span> -207: <span class="ruby-identifier">table</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">row</span> = []) -208: <span class="ruby-identifier">row</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value str">&quot;Resource&quot;</span> -209: <span class="ruby-ivar">@projects</span>.<span class="ruby-identifier">each_key</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">projectId</span><span class="ruby-operator">|</span> -210: <span class="ruby-identifier">row</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">projectId</span> -211: <span class="ruby-keyword kw">end</span> -212: -213: <span class="ruby-ivar">@resourcesTotalEffort</span>.<span class="ruby-identifier">each_key</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resourceId</span><span class="ruby-operator">|</span> -214: <span class="ruby-comment cmt"># Add one line per resource.</span> -215: <span class="ruby-identifier">table</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">row</span> = []) -216: <span class="ruby-identifier">row</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-node">&quot;#{@resources[resourceId].name} (#{resourceId})&quot;</span> -217: <span class="ruby-ivar">@projects</span>.<span class="ruby-identifier">each_key</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">projectId</span><span class="ruby-operator">|</span> -218: <span class="ruby-identifier">row</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">sum</span>(<span class="ruby-identifier">projectId</span>, <span class="ruby-identifier">resourceId</span>) -219: <span class="ruby-keyword kw">end</span> -220: <span class="ruby-keyword kw">end</span> -221: -222: <span class="ruby-identifier">table</span> -223: <span class="ruby-keyword kw">end</span></pre> + <span class="ruby-comment cmt"># File lib/reports/NikuReport.rb, line 200</span> +200: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">to_csv</span> +201: <span class="ruby-identifier">table</span> = [] +202: <span class="ruby-comment cmt"># Header line with project names</span> +203: <span class="ruby-identifier">table</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">row</span> = []) +204: <span class="ruby-comment cmt"># First column is the resource name and ID.</span> +205: <span class="ruby-identifier">row</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value str">&quot;&quot;</span> +206: <span class="ruby-identifier">projectIds</span> = <span class="ruby-ivar">@projects</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">sort</span> +207: <span class="ruby-identifier">projectIds</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">projectId</span><span class="ruby-operator">|</span> +208: <span class="ruby-identifier">row</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-ivar">@projects</span>[<span class="ruby-identifier">projectId</span>].<span class="ruby-identifier">name</span> +209: <span class="ruby-keyword kw">end</span> +210: +211: <span class="ruby-comment cmt"># Header line with project IDs</span> +212: <span class="ruby-identifier">table</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">row</span> = []) +213: <span class="ruby-identifier">row</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-value str">&quot;Resource&quot;</span> +214: <span class="ruby-identifier">projectIds</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">projectId</span><span class="ruby-operator">|</span> +215: <span class="ruby-identifier">row</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">projectId</span> +216: <span class="ruby-keyword kw">end</span> +217: +218: <span class="ruby-ivar">@resourcesTotalEffort</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">sort</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resourceId</span><span class="ruby-operator">|</span> +219: <span class="ruby-comment cmt"># Add one line per resource.</span> +220: <span class="ruby-identifier">table</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">row</span> = []) +221: <span class="ruby-identifier">row</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-node">&quot;#{@resources[resourceId].name} (#{resourceId})&quot;</span> +222: <span class="ruby-identifier">projectIds</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">projectId</span><span class="ruby-operator">|</span> +223: <span class="ruby-identifier">row</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">sum</span>(<span class="ruby-identifier">projectId</span>, <span class="ruby-identifier">resourceId</span>) +224: <span class="ruby-keyword kw">end</span> +225: <span class="ruby-keyword kw">end</span> +226: +227: <span class="ruby-identifier">table</span> +228: <span class="ruby-keyword kw">end</span></pre> </div> </div> @@ -775,72 +786,72 @@ <div class="method-source-code" id="to-html-source"> <pre> - <span class="ruby-comment cmt"># File lib/reports/NikuReport.rb, line 80</span> - 80: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">to_html</span> - 81: <span class="ruby-identifier">tableFrame</span> = <span class="ruby-identifier">generateHtmlTableFrame</span> - 82: - 83: <span class="ruby-identifier">tableFrame</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">tr</span> = <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'tr'</span>)) - 84: <span class="ruby-identifier">tr</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">td</span> = <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'td'</span>)) - 85: <span class="ruby-identifier">td</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">table</span> = <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'table'</span>, <span class="ruby-value str">'class'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'tj_table'</span>, - 86: <span class="ruby-value str">'cellspacing'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'1'</span>)) + <span class="ruby-comment cmt"># File lib/reports/NikuReport.rb, line 85</span> + 85: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">to_html</span> + 86: <span class="ruby-identifier">tableFrame</span> = <span class="ruby-identifier">generateHtmlTableFrame</span> 87: - 88: <span class="ruby-comment cmt"># Table Header with two rows. First the project name, then the ID.</span> - 89: <span class="ruby-identifier">table</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">thead</span> = <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'thead'</span>)) - 90: <span class="ruby-identifier">thead</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">tr</span> = <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'tr'</span>, <span class="ruby-value str">'class'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'tabline'</span>)) - 91: <span class="ruby-comment cmt"># First line</span> - 92: <span class="ruby-identifier">tr</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">htmlTabCell</span>(<span class="ruby-value str">'Project'</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-value str">'right'</span>) - 93: <span class="ruby-ivar">@projects</span>.<span class="ruby-identifier">each_key</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">projectId</span><span class="ruby-operator">|</span> - 94: <span class="ruby-comment cmt"># Don't include projects without allocations.</span> - 95: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">projectTotal</span>(<span class="ruby-identifier">projectId</span>) <span class="ruby-operator">&lt;=</span> <span class="ruby-value">0.0</span> - 96: <span class="ruby-identifier">name</span> = <span class="ruby-ivar">@projects</span>[<span class="ruby-identifier">projectId</span>].<span class="ruby-identifier">name</span> - 97: <span class="ruby-comment cmt"># To avoid exploding tables for long project names, we only show the</span> - 98: <span class="ruby-comment cmt"># last 15 characters for those. We expect the last characters to be</span> - 99: <span class="ruby-comment cmt"># more significant in those names than the first.</span> -100: <span class="ruby-identifier">name</span> = <span class="ruby-value str">'...'</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">name</span>[<span class="ruby-value">15</span><span class="ruby-operator">..</span><span class="ruby-value">1</span>] <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">name</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">15</span> -101: <span class="ruby-identifier">tr</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">htmlTabCell</span>(<span class="ruby-identifier">name</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-value str">'center'</span>) -102: <span class="ruby-keyword kw">end</span> -103: <span class="ruby-identifier">tr</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">htmlTabCell</span>(<span class="ruby-value str">''</span>, <span class="ruby-keyword kw">true</span>) -104: <span class="ruby-comment cmt"># Second line</span> -105: <span class="ruby-identifier">thead</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">tr</span> = <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'tr'</span>, <span class="ruby-value str">'class'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'tabline'</span>)) -106: <span class="ruby-identifier">tr</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">htmlTabCell</span>(<span class="ruby-value str">'Resource'</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-value str">'left'</span>) -107: <span class="ruby-ivar">@projects</span>.<span class="ruby-identifier">each_key</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">projectId</span><span class="ruby-operator">|</span> -108: <span class="ruby-comment cmt"># Don't include projects without allocations.</span> -109: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">projectTotal</span>(<span class="ruby-identifier">projectId</span>) <span class="ruby-operator">&lt;=</span> <span class="ruby-value">0.0</span> -110: <span class="ruby-identifier">tr</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">htmlTabCell</span>(<span class="ruby-identifier">projectId</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-value str">'center'</span>) -111: <span class="ruby-keyword kw">end</span> -112: <span class="ruby-identifier">tr</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">htmlTabCell</span>(<span class="ruby-value str">'Total'</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-value str">'center'</span>) -113: -114: <span class="ruby-comment cmt"># The actual content. One line per resource.</span> -115: <span class="ruby-identifier">table</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">tbody</span> = <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'tbody'</span>)) -116: <span class="ruby-ivar">@resourcesTotalEffort</span>.<span class="ruby-identifier">each_key</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resourceId</span><span class="ruby-operator">|</span> -117: <span class="ruby-identifier">tbody</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">tr</span> = <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'tr'</span>, <span class="ruby-value str">'class'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'tabline'</span>)) -118: <span class="ruby-identifier">tr</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">htmlTabCell</span>(<span class="ruby-node">&quot;#{@resources[resourceId].name} (#{resourceId})&quot;</span>, -119: <span class="ruby-keyword kw">true</span>, <span class="ruby-value str">'left'</span>) -120: -121: <span class="ruby-ivar">@projects</span>.<span class="ruby-identifier">each_key</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">projectId</span><span class="ruby-operator">|</span> -122: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">projectTotal</span>(<span class="ruby-identifier">projectId</span>) <span class="ruby-operator">&lt;=</span> <span class="ruby-value">0.0</span> -123: <span class="ruby-identifier">value</span> = <span class="ruby-identifier">sum</span>(<span class="ruby-identifier">projectId</span>, <span class="ruby-identifier">resourceId</span>) -124: <span class="ruby-identifier">tr</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">htmlTabCell</span>(<span class="ruby-identifier">value</span> <span class="ruby-operator">&gt;=</span> <span class="ruby-value">0.01</span> <span class="ruby-operator">?</span> <span class="ruby-identifier">format</span>(<span class="ruby-value str">&quot;%.2f&quot;</span>, <span class="ruby-identifier">value</span>) <span class="ruby-operator">:</span> <span class="ruby-value str">''</span>) -125: <span class="ruby-keyword kw">end</span> -126: -127: <span class="ruby-identifier">tr</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">htmlTabCell</span>(<span class="ruby-identifier">format</span>(<span class="ruby-value str">&quot;%.2f&quot;</span>, <span class="ruby-identifier">resourceTotal</span>(<span class="ruby-identifier">resourceId</span>)), <span class="ruby-keyword kw">true</span>) -128: <span class="ruby-keyword kw">end</span> -129: -130: <span class="ruby-comment cmt"># Project totals</span> -131: <span class="ruby-identifier">tbody</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">tr</span> = <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'tr'</span>, <span class="ruby-value str">'class'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'tabline'</span>)) -132: <span class="ruby-identifier">tr</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">htmlTabCell</span>(<span class="ruby-value str">'Total'</span>, <span class="ruby-value str">'true'</span>, <span class="ruby-value str">'left'</span>) -133: <span class="ruby-ivar">@projects</span>.<span class="ruby-identifier">each_key</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">projectId</span><span class="ruby-operator">|</span> -134: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">projectTotal</span>(<span class="ruby-identifier">projectId</span>) <span class="ruby-operator">&lt;=</span> <span class="ruby-value">0.0</span> -135: <span class="ruby-identifier">tr</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">htmlTabCell</span>(<span class="ruby-identifier">format</span>(<span class="ruby-value str">&quot;%.2f&quot;</span>, <span class="ruby-identifier">projectTotal</span>(<span class="ruby-identifier">projectId</span>)), <span class="ruby-keyword kw">true</span>, -136: <span class="ruby-value str">'right'</span>) -137: <span class="ruby-keyword kw">end</span> -138: <span class="ruby-identifier">tr</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">htmlTabCell</span>(<span class="ruby-identifier">format</span>(<span class="ruby-value str">&quot;%.2f&quot;</span>, <span class="ruby-identifier">total</span>()), <span class="ruby-keyword kw">true</span>, <span class="ruby-value str">'right'</span>) -139: <span class="ruby-identifier">tableFrame</span> -140: <span class="ruby-keyword kw">end</span></pre> + 88: <span class="ruby-identifier">tableFrame</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">tr</span> = <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'tr'</span>)) + 89: <span class="ruby-identifier">tr</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">td</span> = <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'td'</span>)) + 90: <span class="ruby-identifier">td</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">table</span> = <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'table'</span>, <span class="ruby-value str">'class'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'tj_table'</span>, + 91: <span class="ruby-value str">'cellspacing'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'1'</span>)) + 92: + 93: <span class="ruby-comment cmt"># Table Header with two rows. First the project name, then the ID.</span> + 94: <span class="ruby-identifier">table</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">thead</span> = <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'thead'</span>)) + 95: <span class="ruby-identifier">thead</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">tr</span> = <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'tr'</span>, <span class="ruby-value str">'class'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'tabline'</span>)) + 96: <span class="ruby-comment cmt"># First line</span> + 97: <span class="ruby-identifier">tr</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">htmlTabCell</span>(<span class="ruby-value str">'Project'</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-value str">'right'</span>) + 98: <span class="ruby-ivar">@projects</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">sort</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">projectId</span><span class="ruby-operator">|</span> + 99: <span class="ruby-comment cmt"># Don't include projects without allocations.</span> +100: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">projectTotal</span>(<span class="ruby-identifier">projectId</span>) <span class="ruby-operator">&lt;=</span> <span class="ruby-value">0.0</span> +101: <span class="ruby-identifier">name</span> = <span class="ruby-ivar">@projects</span>[<span class="ruby-identifier">projectId</span>].<span class="ruby-identifier">name</span> +102: <span class="ruby-comment cmt"># To avoid exploding tables for long project names, we only show the</span> +103: <span class="ruby-comment cmt"># last 15 characters for those. We expect the last characters to be</span> +104: <span class="ruby-comment cmt"># more significant in those names than the first.</span> +105: <span class="ruby-identifier">name</span> = <span class="ruby-value str">'...'</span> <span class="ruby-operator">+</span> <span class="ruby-identifier">name</span>[<span class="ruby-value">15</span><span class="ruby-operator">..</span><span class="ruby-value">1</span>] <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">name</span>.<span class="ruby-identifier">length</span> <span class="ruby-operator">&gt;</span> <span class="ruby-value">15</span> +106: <span class="ruby-identifier">tr</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">htmlTabCell</span>(<span class="ruby-identifier">name</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-value str">'center'</span>) +107: <span class="ruby-keyword kw">end</span> +108: <span class="ruby-identifier">tr</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">htmlTabCell</span>(<span class="ruby-value str">''</span>, <span class="ruby-keyword kw">true</span>) +109: <span class="ruby-comment cmt"># Second line</span> +110: <span class="ruby-identifier">thead</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">tr</span> = <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'tr'</span>, <span class="ruby-value str">'class'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'tabline'</span>)) +111: <span class="ruby-identifier">tr</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">htmlTabCell</span>(<span class="ruby-value str">'Resource'</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-value str">'left'</span>) +112: <span class="ruby-ivar">@projects</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">sort</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">projectId</span><span class="ruby-operator">|</span> +113: <span class="ruby-comment cmt"># Don't include projects without allocations.</span> +114: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">projectTotal</span>(<span class="ruby-identifier">projectId</span>) <span class="ruby-operator">&lt;=</span> <span class="ruby-value">0.0</span> +115: <span class="ruby-identifier">tr</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">htmlTabCell</span>(<span class="ruby-identifier">projectId</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-value str">'center'</span>) +116: <span class="ruby-keyword kw">end</span> +117: <span class="ruby-identifier">tr</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">htmlTabCell</span>(<span class="ruby-value str">'Total'</span>, <span class="ruby-keyword kw">true</span>, <span class="ruby-value str">'center'</span>) +118: +119: <span class="ruby-comment cmt"># The actual content. One line per resource.</span> +120: <span class="ruby-identifier">table</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">tbody</span> = <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'tbody'</span>)) +121: <span class="ruby-ivar">@resourcesTotalEffort</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">sort</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resourceId</span><span class="ruby-operator">|</span> +122: <span class="ruby-identifier">tbody</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">tr</span> = <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'tr'</span>, <span class="ruby-value str">'class'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'tabline'</span>)) +123: <span class="ruby-identifier">tr</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">htmlTabCell</span>(<span class="ruby-node">&quot;#{@resources[resourceId].name} (#{resourceId})&quot;</span>, +124: <span class="ruby-keyword kw">true</span>, <span class="ruby-value str">'left'</span>) +125: +126: <span class="ruby-ivar">@projects</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">sort</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">projectId</span><span class="ruby-operator">|</span> +127: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">projectTotal</span>(<span class="ruby-identifier">projectId</span>) <span class="ruby-operator">&lt;=</span> <span class="ruby-value">0.0</span> +128: <span class="ruby-identifier">value</span> = <span class="ruby-identifier">sum</span>(<span class="ruby-identifier">projectId</span>, <span class="ruby-identifier">resourceId</span>) +129: <span class="ruby-identifier">tr</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">htmlTabCell</span>(<span class="ruby-identifier">value</span> <span class="ruby-operator">&gt;=</span> <span class="ruby-value">0.01</span> <span class="ruby-operator">?</span> <span class="ruby-identifier">format</span>(<span class="ruby-value str">&quot;%.2f&quot;</span>, <span class="ruby-identifier">value</span>) <span class="ruby-operator">:</span> <span class="ruby-value str">''</span>) +130: <span class="ruby-keyword kw">end</span> +131: +132: <span class="ruby-identifier">tr</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">htmlTabCell</span>(<span class="ruby-identifier">format</span>(<span class="ruby-value str">&quot;%.2f&quot;</span>, <span class="ruby-identifier">resourceTotal</span>(<span class="ruby-identifier">resourceId</span>)), <span class="ruby-keyword kw">true</span>) +133: <span class="ruby-keyword kw">end</span> +134: +135: <span class="ruby-comment cmt"># Project totals</span> +136: <span class="ruby-identifier">tbody</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">tr</span> = <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'tr'</span>, <span class="ruby-value str">'class'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'tabline'</span>)) +137: <span class="ruby-identifier">tr</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">htmlTabCell</span>(<span class="ruby-value str">'Total'</span>, <span class="ruby-value str">'true'</span>, <span class="ruby-value str">'left'</span>) +138: <span class="ruby-ivar">@projects</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">sort</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">projectId</span><span class="ruby-operator">|</span> +139: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">projectTotal</span>(<span class="ruby-identifier">projectId</span>) <span class="ruby-operator">&lt;=</span> <span class="ruby-value">0.0</span> +140: <span class="ruby-identifier">tr</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">htmlTabCell</span>(<span class="ruby-identifier">format</span>(<span class="ruby-value str">&quot;%.2f&quot;</span>, <span class="ruby-identifier">projectTotal</span>(<span class="ruby-identifier">projectId</span>)), <span class="ruby-keyword kw">true</span>, +141: <span class="ruby-value str">'right'</span>) +142: <span class="ruby-keyword kw">end</span> +143: <span class="ruby-identifier">tr</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">htmlTabCell</span>(<span class="ruby-identifier">format</span>(<span class="ruby-value str">&quot;%.2f&quot;</span>, <span class="ruby-identifier">total</span>()), <span class="ruby-keyword kw">true</span>, <span class="ruby-value str">'right'</span>) +144: <span class="ruby-identifier">tableFrame</span> +145: <span class="ruby-keyword kw">end</span></pre> </div> </div> @@ -867,59 +878,58 @@ <div class="method-source-code" id="to-niku-source"> <pre> - <span class="ruby-comment cmt"># File lib/reports/NikuReport.rb, line 142</span> -142: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">to_niku</span> -143: <span class="ruby-identifier">xml</span> = <span class="ruby-constant">XMLDocument</span>.<span class="ruby-identifier">new</span> -144: <span class="ruby-identifier">xml</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">XMLComment</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">Generated by #{AppConfig.softwareName} v#{AppConfig.version} on #{TjTime.now}For more information about #{AppConfig.softwareName} see #{AppConfig.contact}.Project: #{@project['name']}Date: #{@project['now']}</span> -145: ) -146: <span class="ruby-identifier">xml</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">nikuDataBus</span> = -147: <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'NikuDataBus'</span>, -148: <span class="ruby-value str">'xmlns:xsi'</span> =<span class="ruby-operator">&gt;</span> -149: <span class="ruby-value str">'http://www.w3.org/2001/XMLSchema-instance'</span>, -150: <span class="ruby-value str">'xsi:noNamespaceSchemaLocation'</span> =<span class="ruby-operator">&gt;</span> -151: <span class="ruby-value str">'../xsd/nikuxog_project.xsd'</span>)) -152: <span class="ruby-identifier">nikuDataBus</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'Header'</span>, <span class="ruby-value str">'action'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'write'</span>, -153: <span class="ruby-value str">'externalSource'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'NIKU'</span>, -154: <span class="ruby-value str">'objectType'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'project'</span>, -155: <span class="ruby-value str">'version'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'7.5.0'</span>) -156: <span class="ruby-identifier">nikuDataBus</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">projects</span> = <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'Projects'</span>)) -157: -158: <span class="ruby-identifier">timeFormat</span> = <span class="ruby-value str">'%Y-%m-%dT%H:%M:%S'</span> -159: <span class="ruby-ivar">@projects</span>.<span class="ruby-identifier">each_value</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">prj</span><span class="ruby-operator">|</span> -160: <span class="ruby-comment cmt"># Don't include projects with 0 allocations</span> -161: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">projectTotal</span>(<span class="ruby-identifier">prj</span>.<span class="ruby-identifier">id</span>) <span class="ruby-operator">&lt;=</span> <span class="ruby-value">0.0</span> + <span class="ruby-comment cmt"># File lib/reports/NikuReport.rb, line 147</span> +147: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">to_niku</span> +148: <span class="ruby-identifier">xml</span> = <span class="ruby-constant">XMLDocument</span>.<span class="ruby-identifier">new</span> +149: <span class="ruby-identifier">xml</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">XMLComment</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">Generated by #{AppConfig.softwareName} v#{AppConfig.version} on #{TjTime.now}For more information about #{AppConfig.softwareName} see #{AppConfig.contact}.Project: #{@project['name']}Date: #{@project['now']}</span> +150: ) +151: <span class="ruby-identifier">xml</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">nikuDataBus</span> = +152: <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'NikuDataBus'</span>, +153: <span class="ruby-value str">'xmlns:xsi'</span> =<span class="ruby-operator">&gt;</span> +154: <span class="ruby-value str">'http://www.w3.org/2001/XMLSchema-instance'</span>, +155: <span class="ruby-value str">'xsi:noNamespaceSchemaLocation'</span> =<span class="ruby-operator">&gt;</span> +156: <span class="ruby-value str">'../xsd/nikuxog_project.xsd'</span>)) +157: <span class="ruby-identifier">nikuDataBus</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'Header'</span>, <span class="ruby-value str">'action'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'write'</span>, +158: <span class="ruby-value str">'externalSource'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'NIKU'</span>, +159: <span class="ruby-value str">'objectType'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'project'</span>, +160: <span class="ruby-value str">'version'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'7.5.0'</span>) +161: <span class="ruby-identifier">nikuDataBus</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">projects</span> = <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'Projects'</span>)) 162: -163: <span class="ruby-identifier">projects</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">project</span> = -164: <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'Project'</span>, -165: <span class="ruby-value str">'name'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">prj</span>.<span class="ruby-identifier">name</span>, -166: <span class="ruby-value str">'projectID'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">prj</span>.<span class="ruby-identifier">id</span>)) -167: <span class="ruby-identifier">project</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">resources</span> = <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'Resources'</span>)) -168: <span class="ruby-identifier">prj</span>.<span class="ruby-identifier">resources</span>.<span class="ruby-identifier">each_value</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">res</span><span class="ruby-operator">|</span> -169: <span class="ruby-identifier">resources</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">resource</span> = -170: <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'Resource'</span>, -171: <span class="ruby-value str">'resourceID'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">res</span>.<span class="ruby-identifier">id</span>, -172: <span class="ruby-value str">'defaultAllocation'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'0'</span>)) -173: <span class="ruby-identifier">resource</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">allocCurve</span> = <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'AllocCurve'</span>)) -174: <span class="ruby-identifier">allocCurve</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'Segment'</span>, -175: <span class="ruby-value str">'start'</span> =<span class="ruby-operator">&gt;</span> -176: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>).<span class="ruby-identifier">to_s</span>(<span class="ruby-identifier">timeFormat</span>), -177: <span class="ruby-value str">'finish'</span> =<span class="ruby-operator">&gt;</span> -178: (<span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>) <span class="ruby-operator">-</span> <span class="ruby-value">1</span>).<span class="ruby-identifier">to_s</span>(<span class="ruby-identifier">timeFormat</span>), -179: <span class="ruby-value str">'sum'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">sum</span>(<span class="ruby-identifier">prj</span>.<span class="ruby-identifier">id</span>, <span class="ruby-identifier">res</span>.<span class="ruby-identifier">id</span>).<span class="ruby-identifier">to_s</span>)) -180: <span class="ruby-keyword kw">end</span> -181: -182: <span class="ruby-comment cmt"># The custom information section usually contains Clarity installation</span> -183: <span class="ruby-comment cmt"># specific parts. They are identical for each project section, so we</span> -184: <span class="ruby-comment cmt"># mis-use the title attribute to insert them as an XML blob.</span> -185: <span class="ruby-identifier">project</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">XMLBlob</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">a</span>(<span class="ruby-value str">'title'</span>)) <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'title'</span>).<span class="ruby-identifier">empty?</span> -186: <span class="ruby-keyword kw">end</span> -187: -188: <span class="ruby-identifier">xml</span>.<span class="ruby-identifier">to_s</span> -189: <span class="ruby-keyword kw">end</span></pre> +163: <span class="ruby-identifier">timeFormat</span> = <span class="ruby-value str">'%Y-%m-%dT%H:%M:%S'</span> +164: <span class="ruby-ivar">@projects</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">sort</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">projectId</span><span class="ruby-operator">|</span> +165: <span class="ruby-identifier">prj</span> = <span class="ruby-ivar">@projects</span>[<span class="ruby-identifier">projectId</span>] +166: <span class="ruby-identifier">projects</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">project</span> = +167: <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'Project'</span>, +168: <span class="ruby-value str">'name'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">prj</span>.<span class="ruby-identifier">name</span>, +169: <span class="ruby-value str">'projectID'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">prj</span>.<span class="ruby-identifier">id</span>)) +170: <span class="ruby-identifier">project</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">resources</span> = <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'Resources'</span>)) +171: <span class="ruby-identifier">prj</span>.<span class="ruby-identifier">resources</span>.<span class="ruby-identifier">keys</span>.<span class="ruby-identifier">sort</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resourceId</span><span class="ruby-operator">|</span> +172: <span class="ruby-identifier">res</span> = <span class="ruby-identifier">prj</span>.<span class="ruby-identifier">resources</span>[<span class="ruby-identifier">resourceId</span>] +173: <span class="ruby-identifier">resources</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">resource</span> = +174: <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'Resource'</span>, +175: <span class="ruby-value str">'resourceID'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">res</span>.<span class="ruby-identifier">id</span>, +176: <span class="ruby-value str">'defaultAllocation'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value str">'0'</span>)) +177: <span class="ruby-identifier">resource</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-identifier">allocCurve</span> = <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'AllocCurve'</span>)) +178: <span class="ruby-identifier">allocCurve</span> <span class="ruby-operator">&lt;&lt;</span> (<span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'Segment'</span>, +179: <span class="ruby-value str">'start'</span> =<span class="ruby-operator">&gt;</span> +180: <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>).<span class="ruby-identifier">to_s</span>(<span class="ruby-identifier">timeFormat</span>), +181: <span class="ruby-value str">'finish'</span> =<span class="ruby-operator">&gt;</span> +182: (<span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>) <span class="ruby-operator">-</span> <span class="ruby-value">1</span>).<span class="ruby-identifier">to_s</span>(<span class="ruby-identifier">timeFormat</span>), +183: <span class="ruby-value str">'sum'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">sum</span>(<span class="ruby-identifier">prj</span>.<span class="ruby-identifier">id</span>, <span class="ruby-identifier">res</span>.<span class="ruby-identifier">id</span>).<span class="ruby-identifier">to_s</span>)) +184: <span class="ruby-keyword kw">end</span> +185: +186: <span class="ruby-comment cmt"># The custom information section usually contains Clarity installation</span> +187: <span class="ruby-comment cmt"># specific parts. They are identical for each project section, so we</span> +188: <span class="ruby-comment cmt"># mis-use the title attribute to insert them as an XML blob.</span> +189: <span class="ruby-identifier">project</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">XMLBlob</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">a</span>(<span class="ruby-value str">'title'</span>)) <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'title'</span>).<span class="ruby-identifier">empty?</span> +190: <span class="ruby-keyword kw">end</span> +191: +192: <span class="ruby-identifier">xml</span>.<span class="ruby-identifier">to_s</span> +193: <span class="ruby-keyword kw">end</span></pre> </div> </div> @@ -955,70 +965,81 @@ <div class="method-source-code" id="collect-rojects-source"> <pre> - <span class="ruby-comment cmt"># File lib/reports/NikuReport.rb, line 335</span> -335: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">collectProjects</span> -336: <span class="ruby-comment cmt"># Prepare the task list.</span> -337: <span class="ruby-identifier">taskList</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>) -338: <span class="ruby-identifier">taskList</span>.<span class="ruby-identifier">setSorting</span>(<span class="ruby-ivar">@report</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'sortTasks'</span>)) -339: <span class="ruby-identifier">taskList</span> = <span class="ruby-identifier">filterTaskList</span>(<span class="ruby-identifier">taskList</span>, <span class="ruby-keyword kw">nil</span>, <span class="ruby-ivar">@report</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'hideTask'</span>), -340: <span class="ruby-ivar">@report</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'rollupTask'</span>), <span class="ruby-ivar">@report</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'openNodes'</span>)) -341: -342: -343: <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> -344: <span class="ruby-comment cmt"># We only care about tasks that are leaf tasks and have resource</span> -345: <span class="ruby-comment cmt"># allocations.</span> -346: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">task</span>.<span class="ruby-identifier">leaf?</span> <span class="ruby-operator">||</span> -347: <span class="ruby-identifier">task</span>[<span class="ruby-value str">'assignedresources'</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">empty?</span> -348: -349: <span class="ruby-identifier">id</span> = <span class="ruby-identifier">task</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'ClarityPID'</span>) -350: <span class="ruby-comment cmt"># Ignore tasks without a ClarityPID attribute.</span> -351: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">id</span>.<span class="ruby-identifier">nil?</span> -352: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">id</span>.<span class="ruby-identifier">empty?</span> -353: <span class="ruby-identifier">raise</span> <span class="ruby-constant">TjException</span>.<span class="ruby-identifier">new</span>, -354: <span class="ruby-node">&quot;ClarityPID of task #{task.fullId} may not be empty&quot;</span> -355: <span class="ruby-keyword kw">end</span> -356: -357: <span class="ruby-identifier">name</span> = <span class="ruby-identifier">task</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'ClarityPName'</span>) -358: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">name</span>.<span class="ruby-identifier">nil?</span> -359: <span class="ruby-identifier">raise</span> <span class="ruby-constant">TjException</span>.<span class="ruby-identifier">new</span>, -360: <span class="ruby-node">&quot;ClarityPName of task #{task.fullId} has not been set!&quot;</span> -361: <span class="ruby-keyword kw">end</span> -362: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">name</span>.<span class="ruby-identifier">empty?</span> -363: <span class="ruby-identifier">raise</span> <span class="ruby-constant">TjException</span>.<span class="ruby-identifier">new</span>, -364: <span class="ruby-node">&quot;ClarityPName of task #{task.fullId} may not be empty!&quot;</span> -365: <span class="ruby-keyword kw">end</span> -366: -367: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">project</span> = <span class="ruby-ivar">@projects</span>[<span class="ruby-identifier">id</span>]).<span class="ruby-identifier">nil?</span> -368: <span class="ruby-comment cmt"># We don't have a record for the Clarity project yet, so we create a</span> -369: <span class="ruby-comment cmt"># new NikuProject object.</span> -370: <span class="ruby-identifier">project</span> = <span class="ruby-constant">NikuProject</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">id</span>, <span class="ruby-identifier">name</span>) -371: <span class="ruby-comment cmt"># And store it in the project list hashed by the ClarityPID.</span> -372: <span class="ruby-ivar">@projects</span>[<span class="ruby-identifier">id</span>] = <span class="ruby-identifier">project</span> -373: <span class="ruby-keyword kw">else</span> -374: <span class="ruby-comment cmt"># Due to a design flaw in the Niku file format, Clarity projects are</span> -375: <span class="ruby-comment cmt"># identified by a name and an ID. We have to check that those pairs</span> -376: <span class="ruby-comment cmt"># are always the same.</span> -377: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">fTask</span> = <span class="ruby-identifier">project</span>.<span class="ruby-identifier">tasks</span>.<span class="ruby-identifier">first</span>).<span class="ruby-identifier">get</span>(<span class="ruby-value str">'ClarityPName'</span>) <span class="ruby-operator">!=</span> <span class="ruby-identifier">name</span> -378: <span class="ruby-identifier">raise</span> <span class="ruby-constant">TjException</span>.<span class="ruby-identifier">new</span>, -379: <span class="ruby-node">&quot;Task #{task.fullId} and task #{fTask.fullId} &quot;</span> <span class="ruby-operator">+</span> -380: <span class="ruby-node">&quot;have same ClarityPID (#{id}) but different ClarityPName &quot;</span> <span class="ruby-operator">+</span> -381: <span class="ruby-node">&quot;(#{name}/#{fTask.get('ClarityPName')})&quot;</span> -382: <span class="ruby-keyword kw">end</span> -383: <span class="ruby-keyword kw">end</span> -384: <span class="ruby-comment cmt"># Append the Task to the task list of the Clarity project.</span> -385: <span class="ruby-identifier">project</span>.<span class="ruby-identifier">tasks</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">task</span> -386: <span class="ruby-keyword kw">end</span> -387: -388: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@projects</span>.<span class="ruby-identifier">empty?</span> -389: <span class="ruby-identifier">raise</span> <span class="ruby-constant">TjException</span>.<span class="ruby-identifier">new</span>, -390: <span class="ruby-value str">'No tasks with the custom attributes ClarityPID and ClarityPName '</span> <span class="ruby-operator">+</span> -391: <span class="ruby-value str">'were found!'</span> -392: <span class="ruby-keyword kw">end</span> -393: <span class="ruby-keyword kw">end</span></pre> + <span class="ruby-comment cmt"># File lib/reports/NikuReport.rb, line 351</span> +351: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">collectProjects</span> +352: <span class="ruby-comment cmt"># Prepare the task list.</span> +353: <span class="ruby-identifier">taskList</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>) +354: <span class="ruby-identifier">taskList</span>.<span class="ruby-identifier">setSorting</span>(<span class="ruby-ivar">@report</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'sortTasks'</span>)) +355: <span class="ruby-identifier">taskList</span> = <span class="ruby-identifier">filterTaskList</span>(<span class="ruby-identifier">taskList</span>, <span class="ruby-keyword kw">nil</span>, <span class="ruby-ivar">@report</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'hideTask'</span>), +356: <span class="ruby-ivar">@report</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'rollupTask'</span>), +357: <span class="ruby-ivar">@report</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'openNodes'</span>)) +358: +359: +360: <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> +361: <span class="ruby-comment cmt"># We only care about tasks that are leaf tasks and have resource</span> +362: <span class="ruby-comment cmt"># allocations.</span> +363: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">task</span>.<span class="ruby-identifier">leaf?</span> <span class="ruby-operator">||</span> +364: <span class="ruby-identifier">task</span>[<span class="ruby-value str">'assignedresources'</span>, <span class="ruby-ivar">@scenarioIdx</span>].<span class="ruby-identifier">empty?</span> +365: +366: <span class="ruby-identifier">id</span> = <span class="ruby-identifier">task</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'ClarityPID'</span>) +367: <span class="ruby-comment cmt"># Ignore tasks without a ClarityPID attribute.</span> +368: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">id</span>.<span class="ruby-identifier">nil?</span> +369: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">id</span>.<span class="ruby-identifier">empty?</span> +370: <span class="ruby-identifier">raise</span> <span class="ruby-constant">TjException</span>.<span class="ruby-identifier">new</span>, +371: <span class="ruby-node">&quot;ClarityPID of task #{task.fullId} may not be empty&quot;</span> +372: <span class="ruby-keyword kw">end</span> +373: +374: <span class="ruby-identifier">name</span> = <span class="ruby-identifier">task</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'ClarityPName'</span>) +375: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">name</span>.<span class="ruby-identifier">nil?</span> +376: <span class="ruby-identifier">raise</span> <span class="ruby-constant">TjException</span>.<span class="ruby-identifier">new</span>, +377: <span class="ruby-node">&quot;ClarityPName of task #{task.fullId} has not been set!&quot;</span> +378: <span class="ruby-keyword kw">end</span> +379: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">name</span>.<span class="ruby-identifier">empty?</span> +380: <span class="ruby-identifier">raise</span> <span class="ruby-constant">TjException</span>.<span class="ruby-identifier">new</span>, +381: <span class="ruby-node">&quot;ClarityPName of task #{task.fullId} may not be empty!&quot;</span> +382: <span class="ruby-keyword kw">end</span> +383: +384: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">project</span> = <span class="ruby-ivar">@projects</span>[<span class="ruby-identifier">id</span>]).<span class="ruby-identifier">nil?</span> +385: <span class="ruby-comment cmt"># We don't have a record for the Clarity project yet, so we create a</span> +386: <span class="ruby-comment cmt"># new NikuProject object.</span> +387: <span class="ruby-identifier">project</span> = <span class="ruby-constant">NikuProject</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">id</span>, <span class="ruby-identifier">name</span>) +388: <span class="ruby-comment cmt"># And store it in the project list hashed by the ClarityPID.</span> +389: <span class="ruby-ivar">@projects</span>[<span class="ruby-identifier">id</span>] = <span class="ruby-identifier">project</span> +390: <span class="ruby-keyword kw">else</span> +391: <span class="ruby-comment cmt"># Due to a design flaw in the Niku file format, Clarity projects are</span> +392: <span class="ruby-comment cmt"># identified by a name and an ID. We have to check that those pairs</span> +393: <span class="ruby-comment cmt"># are always the same.</span> +394: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">fTask</span> = <span class="ruby-identifier">project</span>.<span class="ruby-identifier">tasks</span>.<span class="ruby-identifier">first</span>).<span class="ruby-identifier">get</span>(<span class="ruby-value str">'ClarityPName'</span>) <span class="ruby-operator">!=</span> <span class="ruby-identifier">name</span> +395: <span class="ruby-identifier">raise</span> <span class="ruby-constant">TjException</span>.<span class="ruby-identifier">new</span>, +396: <span class="ruby-node">&quot;Task #{task.fullId} and task #{fTask.fullId} &quot;</span> <span class="ruby-operator">+</span> +397: <span class="ruby-node">&quot;have same ClarityPID (#{id}) but different ClarityPName &quot;</span> <span class="ruby-operator">+</span> +398: <span class="ruby-node">&quot;(#{name}/#{fTask.get('ClarityPName')})&quot;</span> +399: <span class="ruby-keyword kw">end</span> +400: <span class="ruby-keyword kw">end</span> +401: <span class="ruby-comment cmt"># Append the Task to the task list of the Clarity project.</span> +402: <span class="ruby-identifier">project</span>.<span class="ruby-identifier">tasks</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-identifier">task</span> +403: <span class="ruby-keyword kw">end</span> +404: +405: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@projects</span>.<span class="ruby-identifier">empty?</span> +406: <span class="ruby-identifier">raise</span> <span class="ruby-constant">TjException</span>.<span class="ruby-identifier">new</span>, +407: <span class="ruby-value str">'No tasks with the custom attributes ClarityPID and ClarityPName '</span> <span class="ruby-operator">+</span> +408: <span class="ruby-value str">'were found!'</span> +409: <span class="ruby-keyword kw">end</span> +410: +411: <span class="ruby-comment cmt"># If the user did specify a project ID and name to collect the vacation</span> +412: <span class="ruby-comment cmt"># time, we'll add this as a project as well.</span> +413: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">id</span> = <span class="ruby-ivar">@report</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'timeOffId'</span>)) <span class="ruby-operator">&amp;&amp;</span> (<span class="ruby-identifier">name</span> = <span class="ruby-ivar">@report</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'timeOffName'</span>)) +414: <span class="ruby-ivar">@projects</span>[<span class="ruby-identifier">id</span>] = <span class="ruby-identifier">project</span> = <span class="ruby-constant">NikuProject</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">id</span>, <span class="ruby-identifier">name</span>) +415: <span class="ruby-ivar">@resources</span>.<span class="ruby-identifier">each</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resourceId</span>, <span class="ruby-identifier">resource</span><span class="ruby-operator">|</span> +416: <span class="ruby-identifier">project</span>.<span class="ruby-identifier">resources</span>[<span class="ruby-identifier">resourceId</span>] = <span class="ruby-identifier">r</span> = <span class="ruby-constant">NikuResource</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">resourceId</span>) +417: <span class="ruby-identifier">r</span>.<span class="ruby-identifier">sum</span> = <span class="ruby-ivar">@resourcesFreeWork</span>[<span class="ruby-identifier">resourceId</span>] +418: <span class="ruby-keyword kw">end</span> +419: <span class="ruby-keyword kw">end</span> +420: <span class="ruby-keyword kw">end</span></pre> </div> </div> @@ -1049,54 +1070,57 @@ <div class="method-source-code" id="compute-roject-llocations-source"> <pre> - <span class="ruby-comment cmt"># File lib/reports/NikuReport.rb, line 397</span> -397: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">computeProjectAllocations</span> -398: <span class="ruby-ivar">@projects</span>.<span class="ruby-identifier">each_value</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">project</span><span class="ruby-operator">|</span> -399: <span class="ruby-identifier">project</span>.<span class="ruby-identifier">tasks</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> -400: <span class="ruby-identifier">task</span>[<span class="ruby-value str">'assignedresources'</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">resource</span><span class="ruby-operator">|</span> -401: <span class="ruby-comment cmt"># Only consider resources that are in the filtered resource list.</span> -402: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@resources</span>[<span class="ruby-identifier">resource</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'ClarityRID'</span>)] -403: -404: <span class="ruby-comment cmt"># Prepare a template for the Query we will use to get all the data.</span> -405: <span class="ruby-identifier">queryAttrs</span> = { <span class="ruby-value str">'project'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@project</span>, -406: <span class="ruby-value str">'property'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">task</span>, -407: <span class="ruby-value str">'scopeProperty'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">resource</span>, -408: <span class="ruby-value str">'scenarioIdx'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@scenarioIdx</span>, -409: <span class="ruby-value str">'loadUnit'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'loadUnit'</span>), -410: <span class="ruby-value str">'numberFormat'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'numberFormat'</span>), -411: <span class="ruby-value str">'timeFormat'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'timeFormat'</span>), -412: <span class="ruby-value str">'currencyFormat'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'currencyFormat'</span>), -413: <span class="ruby-value str">'start'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</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">'end'</span>), -414: <span class="ruby-value str">'costAccount'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'costAccount'</span>), -415: <span class="ruby-value str">'revenueAccount'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'revenueAccount'</span>) } -416: -417: <span class="ruby-identifier">query</span> = <span class="ruby-constant">Query</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">queryAttrs</span>) -418: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">attributeId</span> = <span class="ruby-value str">'effort'</span> -419: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">process</span> -420: <span class="ruby-identifier">work</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">to_num</span> -421: -422: <span class="ruby-comment cmt"># If the resource was not actually working on this task during the</span> -423: <span class="ruby-comment cmt"># report period, we don't create a record for it.</span> -424: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">work</span> <span class="ruby-operator">&lt;=</span> <span class="ruby-value">0.0</span> -425: -426: <span class="ruby-identifier">resourceId</span> = <span class="ruby-identifier">resource</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'ClarityRID'</span>) -427: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">resourceRecord</span> = <span class="ruby-identifier">project</span>.<span class="ruby-identifier">resources</span>[<span class="ruby-identifier">resourceId</span>]).<span class="ruby-identifier">nil?</span> -428: <span class="ruby-comment cmt"># If we don't already have a NikuResource object for the</span> -429: <span class="ruby-comment cmt"># Resource, we create a new one.</span> -430: <span class="ruby-identifier">resourceRecord</span> = <span class="ruby-constant">NikuResource</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">resourceId</span>) -431: <span class="ruby-comment cmt"># Store the new NikuResource in the resource list of the</span> -432: <span class="ruby-comment cmt"># NikuProject record.</span> -433: <span class="ruby-identifier">project</span>.<span class="ruby-identifier">resources</span>[<span class="ruby-identifier">resourceId</span>] = <span class="ruby-identifier">resourceRecord</span> -434: <span class="ruby-keyword kw">end</span> -435: <span class="ruby-identifier">resourceRecord</span>.<span class="ruby-identifier">sum</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">query</span>.<span class="ruby-identifier">to_num</span> -436: <span class="ruby-keyword kw">end</span> -437: <span class="ruby-keyword kw">end</span> -438: <span class="ruby-keyword kw">end</span> -439: <span class="ruby-keyword kw">end</span></pre> + <span class="ruby-comment cmt"># File lib/reports/NikuReport.rb, line 424</span> +424: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">computeProjectAllocations</span> +425: <span class="ruby-comment cmt"># Prepare a template for the Query we will use to get all the data.</span> +426: <span class="ruby-identifier">queryAttrs</span> = { <span class="ruby-value str">'project'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@project</span>, +427: <span class="ruby-value str">'scenarioIdx'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@scenarioIdx</span>, +428: <span class="ruby-value str">'loadUnit'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'loadUnit'</span>), +429: <span class="ruby-value str">'numberFormat'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'numberFormat'</span>), +430: <span class="ruby-value str">'timeFormat'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'timeFormat'</span>), +431: <span class="ruby-value str">'currencyFormat'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'currencyFormat'</span>), +432: <span class="ruby-value str">'start'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</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">'end'</span>), +433: <span class="ruby-value str">'costAccount'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'costAccount'</span>), +434: <span class="ruby-value str">'revenueAccount'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'revenueAccount'</span>) } +435: <span class="ruby-identifier">query</span> = <span class="ruby-constant">Query</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">queryAttrs</span>) +436: +437: <span class="ruby-identifier">timeOffId</span> = <span class="ruby-ivar">@report</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'timeOffId'</span>) +438: <span class="ruby-ivar">@projects</span>.<span class="ruby-identifier">each_value</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">project</span><span class="ruby-operator">|</span> +439: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">project</span>.<span class="ruby-identifier">id</span> <span class="ruby-operator">==</span> <span class="ruby-identifier">timeOffId</span> +440: <span class="ruby-identifier">project</span>.<span class="ruby-identifier">tasks</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> +441: <span class="ruby-identifier">task</span>[<span class="ruby-value str">'assignedresources'</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">resource</span><span class="ruby-operator">|</span> +442: <span class="ruby-comment cmt"># Only consider resources that are in the filtered resource list.</span> +443: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-ivar">@resources</span>[<span class="ruby-identifier">resource</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'ClarityRID'</span>)] +444: +445: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">property</span> = <span class="ruby-identifier">task</span> +446: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">scopeProperty</span> = <span class="ruby-identifier">resource</span> +447: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">attributeId</span> = <span class="ruby-value str">'effort'</span> +448: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">process</span> +449: +450: <span class="ruby-identifier">work</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">to_num</span> +451: +452: <span class="ruby-comment cmt"># If the resource was not actually working on this task during the</span> +453: <span class="ruby-comment cmt"># report period, we don't create a record for it.</span> +454: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">work</span> <span class="ruby-operator">&lt;=</span> <span class="ruby-value">0.0</span> +455: +456: <span class="ruby-identifier">resourceId</span> = <span class="ruby-identifier">resource</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'ClarityRID'</span>) +457: <span class="ruby-keyword kw">if</span> (<span class="ruby-identifier">resourceRecord</span> = <span class="ruby-identifier">project</span>.<span class="ruby-identifier">resources</span>[<span class="ruby-identifier">resourceId</span>]).<span class="ruby-identifier">nil?</span> +458: <span class="ruby-comment cmt"># If we don't already have a NikuResource object for the</span> +459: <span class="ruby-comment cmt"># Resource, we create a new one.</span> +460: <span class="ruby-identifier">resourceRecord</span> = <span class="ruby-constant">NikuResource</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">resourceId</span>) +461: <span class="ruby-comment cmt"># Store the new NikuResource in the resource list of the</span> +462: <span class="ruby-comment cmt"># NikuProject record.</span> +463: <span class="ruby-identifier">project</span>.<span class="ruby-identifier">resources</span>[<span class="ruby-identifier">resourceId</span>] = <span class="ruby-identifier">resourceRecord</span> +464: <span class="ruby-keyword kw">end</span> +465: <span class="ruby-identifier">resourceRecord</span>.<span class="ruby-identifier">sum</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">query</span>.<span class="ruby-identifier">to_num</span> +466: <span class="ruby-keyword kw">end</span> +467: <span class="ruby-keyword kw">end</span> +468: <span class="ruby-keyword kw">end</span> +469: <span class="ruby-keyword kw">end</span></pre> </div> </div> @@ -1128,67 +1152,78 @@ <div class="method-source-code" id="compute-esource-otals-source"> <pre> - <span class="ruby-comment cmt"># File lib/reports/NikuReport.rb, line 276</span> -276: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">computeResourceTotals</span> -277: <span class="ruby-comment cmt"># Prepare the resource list.</span> -278: <span class="ruby-identifier">resourceList</span> = <span class="ruby-constant">PropertyList</span>.<span class="ruby-identifier">new</span>(<span class="ruby-ivar">@project</span>.<span class="ruby-identifier">resources</span>) -279: <span class="ruby-identifier">resourceList</span>.<span class="ruby-identifier">setSorting</span>(<span class="ruby-ivar">@report</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'sortResources'</span>)) -280: <span class="ruby-identifier">resourceList</span> = <span class="ruby-identifier">filterResourceList</span>(<span class="ruby-identifier">resourceList</span>, <span class="ruby-keyword kw">nil</span>, -281: <span class="ruby-ivar">@report</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'hideResource'</span>), -282: <span class="ruby-ivar">@report</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'rollupResource'</span>), -283: <span class="ruby-ivar">@report</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'openNodes'</span>)) -284: -285: <span class="ruby-identifier">resourceList</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> -286: <span class="ruby-comment cmt"># We only care about leaf resources that have the custom attribute</span> -287: <span class="ruby-comment cmt"># 'ClarityRID' set.</span> -288: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">resource</span>.<span class="ruby-identifier">leaf?</span> <span class="ruby-operator">||</span> -289: (<span class="ruby-identifier">resourceId</span> = <span class="ruby-identifier">resource</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'ClarityRID'</span>)).<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> -290: <span class="ruby-identifier">resourceId</span>.<span class="ruby-identifier">empty?</span> -291: -292: <span class="ruby-comment cmt"># Prepare a template for the Query we will use to get all the data.</span> -293: <span class="ruby-identifier">queryAttrs</span> = { <span class="ruby-value str">'project'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@project</span>, -294: <span class="ruby-value str">'property'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">resource</span>, -295: <span class="ruby-value str">'scopeProperty'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword kw">nil</span>, -296: <span class="ruby-value str">'scenarioIdx'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@scenarioIdx</span>, -297: <span class="ruby-value str">'loadUnit'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'loadUnit'</span>), -298: <span class="ruby-value str">'numberFormat'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'numberFormat'</span>), -299: <span class="ruby-value str">'timeFormat'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'timeFormat'</span>), -300: <span class="ruby-value str">'currencyFormat'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'currencyFormat'</span>), -301: <span class="ruby-value str">'start'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</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">'end'</span>), -302: <span class="ruby-value str">'costAccount'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'costAccount'</span>), -303: <span class="ruby-value str">'revenueAccount'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'revenueAccount'</span>) } -304: -305: <span class="ruby-identifier">query</span> = <span class="ruby-constant">Query</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">queryAttrs</span>) -306: -307: <span class="ruby-comment cmt"># First get the allocated effort.</span> -308: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">attributeId</span> = <span class="ruby-value str">'effort'</span> -309: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">process</span> -310: <span class="ruby-identifier">total</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">to_num</span> -311: -312: <span class="ruby-comment cmt"># Then add the still available effort.</span> -313: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">attributeId</span> = <span class="ruby-value str">'freework'</span> -314: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">process</span> -315: <span class="ruby-identifier">total</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">query</span>.<span class="ruby-identifier">to_num</span> -316: -317: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">total</span> <span class="ruby-operator">&lt;=</span> <span class="ruby-value">0.0</span> -318: -319: <span class="ruby-ivar">@resources</span>[<span class="ruby-identifier">resourceId</span>] = <span class="ruby-identifier">resource</span> -320: -321: <span class="ruby-comment cmt"># This is the maximum possible work of this resource in the report</span> -322: <span class="ruby-comment cmt"># period.</span> -323: <span class="ruby-ivar">@resourcesTotalEffort</span>[<span class="ruby-identifier">resourceId</span>] = <span class="ruby-identifier">total</span> -324: <span class="ruby-keyword kw">end</span> -325: -326: <span class="ruby-comment cmt"># Make sure that we have at least one Resource with a ClarityRID.</span> -327: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@resourcesTotalEffort</span>.<span class="ruby-identifier">empty?</span> -328: <span class="ruby-identifier">raise</span> <span class="ruby-constant">TjException</span>.<span class="ruby-identifier">new</span>, -329: <span class="ruby-value str">'No resources with the custom attribute ClarityRID were found!'</span> -330: <span class="ruby-keyword kw">end</span> -331: <span class="ruby-keyword kw">end</span></pre> + <span class="ruby-comment cmt"># File lib/reports/NikuReport.rb, line 281</span> +281: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">computeResourceTotals</span> +282: <span class="ruby-comment cmt"># Prepare the resource list.</span> +283: <span class="ruby-identifier">resourceList</span> = <span class="ruby-constant">PropertyList</span>.<span class="ruby-identifier">new</span>(<span class="ruby-ivar">@project</span>.<span class="ruby-identifier">resources</span>) +284: <span class="ruby-identifier">resourceList</span>.<span class="ruby-identifier">setSorting</span>(<span class="ruby-ivar">@report</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'sortResources'</span>)) +285: <span class="ruby-identifier">resourceList</span> = <span class="ruby-identifier">filterResourceList</span>(<span class="ruby-identifier">resourceList</span>, <span class="ruby-keyword kw">nil</span>, +286: <span class="ruby-ivar">@report</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'hideResource'</span>), +287: <span class="ruby-ivar">@report</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'rollupResource'</span>), +288: <span class="ruby-ivar">@report</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'openNodes'</span>)) +289: +290: <span class="ruby-comment cmt"># Prepare a template for the Query we will use to get all the data.</span> +291: <span class="ruby-identifier">queryAttrs</span> = { <span class="ruby-value str">'project'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@project</span>, +292: <span class="ruby-value str">'scopeProperty'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-keyword kw">nil</span>, +293: <span class="ruby-value str">'scenarioIdx'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-ivar">@scenarioIdx</span>, +294: <span class="ruby-value str">'loadUnit'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'loadUnit'</span>), +295: <span class="ruby-value str">'numberFormat'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'numberFormat'</span>), +296: <span class="ruby-value str">'timeFormat'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'timeFormat'</span>), +297: <span class="ruby-value str">'currencyFormat'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'currencyFormat'</span>), +298: <span class="ruby-value str">'start'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</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">'end'</span>), +299: <span class="ruby-value str">'costAccount'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'costAccount'</span>), +300: <span class="ruby-value str">'revenueAccount'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">a</span>(<span class="ruby-value str">'revenueAccount'</span>) } +301: <span class="ruby-identifier">query</span> = <span class="ruby-constant">Query</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">queryAttrs</span>) +302: +303: <span class="ruby-comment cmt"># Calculate the number of working days in the report interval.</span> +304: <span class="ruby-identifier">workingDays</span> = <span class="ruby-ivar">@project</span>.<span class="ruby-identifier">workingDays</span>(<span class="ruby-constant">Interval</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">a</span>(<span class="ruby-value str">'start'</span>), <span class="ruby-identifier">a</span>(<span class="ruby-value str">'end'</span>))) +305: +306: <span class="ruby-identifier">resourceList</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> +307: <span class="ruby-comment cmt"># We only care about leaf resources that have the custom attribute</span> +308: <span class="ruby-comment cmt"># 'ClarityRID' set.</span> +309: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-operator">!</span><span class="ruby-identifier">resource</span>.<span class="ruby-identifier">leaf?</span> <span class="ruby-operator">||</span> +310: (<span class="ruby-identifier">resourceId</span> = <span class="ruby-identifier">resource</span>.<span class="ruby-identifier">get</span>(<span class="ruby-value str">'ClarityRID'</span>)).<span class="ruby-identifier">nil?</span> <span class="ruby-operator">||</span> +311: <span class="ruby-identifier">resourceId</span>.<span class="ruby-identifier">empty?</span> +312: +313: +314: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">property</span> = <span class="ruby-identifier">resource</span> +315: +316: <span class="ruby-comment cmt"># First get the allocated effort.</span> +317: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">attributeId</span> = <span class="ruby-value str">'effort'</span> +318: <span class="ruby-identifier">query</span>.<span class="ruby-identifier">process</span> +319: <span class="ruby-comment cmt"># Effort in resource days</span> +320: <span class="ruby-identifier">total</span> = <span class="ruby-identifier">query</span>.<span class="ruby-identifier">to_num</span> +321: +322: <span class="ruby-comment cmt"># Ignore resources that have no work allocations.</span> +323: <span class="ruby-keyword kw">next</span> <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">total</span> <span class="ruby-operator">&lt;=</span> <span class="ruby-value">0.0</span> +324: +325: <span class="ruby-comment cmt"># A fully allocated resource should always have a total of 1.0 per</span> +326: <span class="ruby-comment cmt"># working day. If the total is larger, we assume unpaid overtime. If</span> +327: <span class="ruby-comment cmt"># it's less, the resource was either not fully allocated or had less</span> +328: <span class="ruby-comment cmt"># working hours or was on vacation.</span> +329: <span class="ruby-keyword kw">if</span> <span class="ruby-identifier">total</span> <span class="ruby-operator">&gt;=</span> <span class="ruby-identifier">workingDays</span> +330: <span class="ruby-ivar">@resourcesFreeWork</span>[<span class="ruby-identifier">resourceId</span>] = <span class="ruby-value">0.0</span> +331: <span class="ruby-keyword kw">else</span> +332: <span class="ruby-ivar">@resourcesFreeWork</span>[<span class="ruby-identifier">resourceId</span>] = <span class="ruby-identifier">workingDays</span> <span class="ruby-operator">-</span> <span class="ruby-identifier">total</span> +333: <span class="ruby-identifier">total</span> = <span class="ruby-identifier">workingDays</span> +334: <span class="ruby-keyword kw">end</span> +335: <span class="ruby-ivar">@resources</span>[<span class="ruby-identifier">resourceId</span>] = <span class="ruby-identifier">resource</span> +336: +337: <span class="ruby-comment cmt"># This is the maximum possible work of this resource in the report</span> +338: <span class="ruby-comment cmt"># period.</span> +339: <span class="ruby-ivar">@resourcesTotalEffort</span>[<span class="ruby-identifier">resourceId</span>] = <span class="ruby-identifier">total</span> +340: <span class="ruby-keyword kw">end</span> +341: +342: <span class="ruby-comment cmt"># Make sure that we have at least one Resource with a ClarityRID.</span> +343: <span class="ruby-keyword kw">if</span> <span class="ruby-ivar">@resourcesTotalEffort</span>.<span class="ruby-identifier">empty?</span> +344: <span class="ruby-identifier">raise</span> <span class="ruby-constant">TjException</span>.<span class="ruby-identifier">new</span>, +345: <span class="ruby-value str">'No resources with the custom attribute ClarityRID were found!'</span> +346: <span class="ruby-keyword kw">end</span> +347: <span class="ruby-keyword kw">end</span></pre> </div> </div> @@ -1215,18 +1250,18 @@ <div class="method-source-code" id="html-ab-ell-source"> <pre> - <span class="ruby-comment cmt"># File lib/reports/NikuReport.rb, line 263</span> -263: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">htmlTabCell</span>(<span class="ruby-identifier">text</span>, <span class="ruby-identifier">headerCell</span> = <span class="ruby-keyword kw">false</span>, <span class="ruby-identifier">align</span> = <span class="ruby-value str">'right'</span>) -264: <span class="ruby-identifier">td</span> = <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'td'</span>, <span class="ruby-value str">'class'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">headerCell</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'tabhead'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'taskcell1'</span>) -265: <span class="ruby-identifier">td</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">XMLNamedText</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">text</span>, <span class="ruby-value str">'div'</span>, -266: <span class="ruby-value str">'class'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">headerCell</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'headercelldiv'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'celldiv'</span>, -267: <span class="ruby-value str">'style'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-node">&quot;text-align:#{align}&quot;</span>) -268: <span class="ruby-identifier">td</span> -269: <span class="ruby-keyword kw">end</span></pre> + <span class="ruby-comment cmt"># File lib/reports/NikuReport.rb, line 268</span> +268: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">htmlTabCell</span>(<span class="ruby-identifier">text</span>, <span class="ruby-identifier">headerCell</span> = <span class="ruby-keyword kw">false</span>, <span class="ruby-identifier">align</span> = <span class="ruby-value str">'right'</span>) +269: <span class="ruby-identifier">td</span> = <span class="ruby-constant">XMLElement</span>.<span class="ruby-identifier">new</span>(<span class="ruby-value str">'td'</span>, <span class="ruby-value str">'class'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">headerCell</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'tabhead'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'taskcell1'</span>) +270: <span class="ruby-identifier">td</span> <span class="ruby-operator">&lt;&lt;</span> <span class="ruby-constant">XMLNamedText</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">text</span>, <span class="ruby-value str">'div'</span>, +271: <span class="ruby-value str">'class'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-identifier">headerCell</span> <span class="ruby-operator">?</span> <span class="ruby-value str">'headercelldiv'</span> <span class="ruby-operator">:</span> <span class="ruby-value str">'celldiv'</span>, +272: <span class="ruby-value str">'style'</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-node">&quot;text-align:#{align}&quot;</span>) +273: <span class="ruby-identifier">td</span> +274: <span class="ruby-keyword kw">end</span></pre> </div> </div> @@ -1253,18 +1288,18 @@ <div class="method-source-code" id="project-otal-source"> <pre> - <span class="ruby-comment cmt"># File lib/reports/NikuReport.rb, line 245</span> -245: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">projectTotal</span>(<span class="ruby-identifier">projectId</span>) -246: <span class="ruby-identifier">total</span> = <span class="ruby-value">0.0</span> -247: <span class="ruby-ivar">@resources</span>.<span class="ruby-identifier">each_key</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resourceId</span><span class="ruby-operator">|</span> -248: <span class="ruby-identifier">total</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">sum</span>(<span class="ruby-identifier">projectId</span>, <span class="ruby-identifier">resourceId</span>) -249: <span class="ruby-keyword kw">end</span> -250: <span class="ruby-identifier">total</span> -251: <span class="ruby-keyword kw">end</span></pre> + <span class="ruby-comment cmt"># File lib/reports/NikuReport.rb, line 250</span> +250: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">projectTotal</span>(<span class="ruby-identifier">projectId</span>) +251: <span class="ruby-identifier">total</span> = <span class="ruby-value">0.0</span> +252: <span class="ruby-ivar">@resources</span>.<span class="ruby-identifier">each_key</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resourceId</span><span class="ruby-operator">|</span> +253: <span class="ruby-identifier">total</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">sum</span>(<span class="ruby-identifier">projectId</span>, <span class="ruby-identifier">resourceId</span>) +254: <span class="ruby-keyword kw">end</span> +255: <span class="ruby-identifier">total</span> +256: <span class="ruby-keyword kw">end</span></pre> </div> </div> @@ -1291,18 +1326,18 @@ <div class="method-source-code" id="resource-otal-source"> <pre> - <span class="ruby-comment cmt"># File lib/reports/NikuReport.rb, line 237</span> -237: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">resourceTotal</span>(<span class="ruby-identifier">resourceId</span>) -238: <span class="ruby-identifier">total</span> = <span class="ruby-value">0.0</span> -239: <span class="ruby-ivar">@projects</span>.<span class="ruby-identifier">each_key</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">projectId</span><span class="ruby-operator">|</span> -240: <span class="ruby-identifier">total</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">sum</span>(<span class="ruby-identifier">projectId</span>, <span class="ruby-identifier">resourceId</span>) -241: <span class="ruby-keyword kw">end</span> -242: <span class="ruby-identifier">total</span> -243: <span class="ruby-keyword kw">end</span></pre> + <span class="ruby-comment cmt"># File lib/reports/NikuReport.rb, line 242</span> +242: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">resourceTotal</span>(<span class="ruby-identifier">resourceId</span>) +243: <span class="ruby-identifier">total</span> = <span class="ruby-value">0.0</span> +244: <span class="ruby-ivar">@projects</span>.<span class="ruby-identifier">each_key</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">projectId</span><span class="ruby-operator">|</span> +245: <span class="ruby-identifier">total</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">sum</span>(<span class="ruby-identifier">projectId</span>, <span class="ruby-identifier">resourceId</span>) +246: <span class="ruby-keyword kw">end</span> +247: <span class="ruby-identifier">total</span> +248: <span class="ruby-keyword kw">end</span></pre> </div> </div> @@ -1329,20 +1364,20 @@ <div class="method-source-code" id="sum-source"> <pre> - <span class="ruby-comment cmt"># File lib/reports/NikuReport.rb, line 227</span> -227: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">sum</span>(<span class="ruby-identifier">projectId</span>, <span class="ruby-identifier">resourceId</span>) -228: <span class="ruby-identifier">project</span> = <span class="ruby-ivar">@projects</span>[<span class="ruby-identifier">projectId</span>] -229: <span class="ruby-keyword kw">return</span> <span class="ruby-value">0.0</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">project</span> -230: -231: <span class="ruby-identifier">resource</span> = <span class="ruby-identifier">project</span>.<span class="ruby-identifier">resources</span>[<span class="ruby-identifier">resourceId</span>] -232: <span class="ruby-keyword kw">return</span> <span class="ruby-value">0.0</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">resource</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-ivar">@resourcesTotalEffort</span>[<span class="ruby-identifier">resourceId</span>] -233: -234: <span class="ruby-identifier">resource</span>.<span class="ruby-identifier">sum</span> <span class="ruby-operator">/</span> <span class="ruby-ivar">@resourcesTotalEffort</span>[<span class="ruby-identifier">resourceId</span>] -235: <span class="ruby-keyword kw">end</span></pre> + <span class="ruby-comment cmt"># File lib/reports/NikuReport.rb, line 232</span> +232: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">sum</span>(<span class="ruby-identifier">projectId</span>, <span class="ruby-identifier">resourceId</span>) +233: <span class="ruby-identifier">project</span> = <span class="ruby-ivar">@projects</span>[<span class="ruby-identifier">projectId</span>] +234: <span class="ruby-keyword kw">return</span> <span class="ruby-value">0.0</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">project</span> +235: +236: <span class="ruby-identifier">resource</span> = <span class="ruby-identifier">project</span>.<span class="ruby-identifier">resources</span>[<span class="ruby-identifier">resourceId</span>] +237: <span class="ruby-keyword kw">return</span> <span class="ruby-value">0.0</span> <span class="ruby-keyword kw">unless</span> <span class="ruby-identifier">resource</span> <span class="ruby-operator">&amp;&amp;</span> <span class="ruby-ivar">@resourcesTotalEffort</span>[<span class="ruby-identifier">resourceId</span>] +238: +239: <span class="ruby-identifier">resource</span>.<span class="ruby-identifier">sum</span> <span class="ruby-operator">/</span> <span class="ruby-ivar">@resourcesTotalEffort</span>[<span class="ruby-identifier">resourceId</span>] +240: <span class="ruby-keyword kw">end</span></pre> </div> </div> @@ -1369,19 +1404,19 @@ <div class="method-source-code" id="total-source"> <pre> - <span class="ruby-comment cmt"># File lib/reports/NikuReport.rb, line 253</span> -253: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">total</span> -254: <span class="ruby-identifier">total</span> = <span class="ruby-value">0.0</span> -255: <span class="ruby-ivar">@projects</span>.<span class="ruby-identifier">each_key</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">projectId</span><span class="ruby-operator">|</span> -256: <span class="ruby-ivar">@resources</span>.<span class="ruby-identifier">each_key</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resourceId</span><span class="ruby-operator">|</span> -257: <span class="ruby-identifier">total</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">sum</span>(<span class="ruby-identifier">projectId</span>, <span class="ruby-identifier">resourceId</span>) -258: <span class="ruby-keyword kw">end</span> -259: <span class="ruby-keyword kw">end</span> -260: <span class="ruby-identifier">total</span> -261: <span class="ruby-keyword kw">end</span></pre> + <span class="ruby-comment cmt"># File lib/reports/NikuReport.rb, line 258</span> +258: <span class="ruby-keyword kw">def</span> <span class="ruby-identifier">total</span> +259: <span class="ruby-identifier">total</span> = <span class="ruby-value">0.0</span> +260: <span class="ruby-ivar">@projects</span>.<span class="ruby-identifier">each_key</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">projectId</span><span class="ruby-operator">|</span> +261: <span class="ruby-ivar">@resources</span>.<span class="ruby-identifier">each_key</span> <span class="ruby-keyword kw">do</span> <span class="ruby-operator">|</span><span class="ruby-identifier">resourceId</span><span class="ruby-operator">|</span> +262: <span class="ruby-identifier">total</span> <span class="ruby-operator">+=</span> <span class="ruby-identifier">sum</span>(<span class="ruby-identifier">projectId</span>, <span class="ruby-identifier">resourceId</span>) +263: <span class="ruby-keyword kw">end</span> +264: <span class="ruby-keyword kw">end</span> +265: <span class="ruby-identifier">total</span> +266: <span class="ruby-keyword kw">end</span></pre> </div> </div>