337 lines
11 KiB
Cheetah
337 lines
11 KiB
Cheetah
[%# The contents of this file are subject to the Mozilla Public
|
|
# License Version 1.1 (the "License"); you may not use this file
|
|
# except in compliance with the License. You may obtain a copy of
|
|
# the License at http://www.mozilla.org/MPL/
|
|
#
|
|
# Software distributed under the License is distributed on an "AS
|
|
# IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
|
|
# implied. See the License for the specific language governing
|
|
# rights and limitations under the License.
|
|
#
|
|
# The Original Code is the Bugzilla Bug Tracking System.
|
|
#
|
|
# Contributor(s): Christian Reis <kiko@async.com.br>
|
|
# Frédéric Buclin <LpSolit@gmail.com>
|
|
#%]
|
|
|
|
[% title = "Time Summary " %]
|
|
[% IF do_depends %]
|
|
[% title = title _ "for " %]
|
|
[% header = "$terms.Bug $ids.0" FILTER bug_link(ids.0) FILTER none %]
|
|
[% header = title _ header _ " (and $terms.bugs blocking it)" %]
|
|
[% title = title _ "$terms.Bug $ids.0" %]
|
|
[% ELSE %]
|
|
[% title = title _ "($ids.size $terms.bugs selected)" %]
|
|
[% header = title %]
|
|
[% END %]
|
|
|
|
[% PROCESS global/header.html.tmpl
|
|
title = title
|
|
header = header
|
|
style_urls = ["skins/standard/summarize-time.css"]
|
|
doc_section = "timetracking.html"
|
|
%]
|
|
|
|
[% INCLUDE query_form %]
|
|
|
|
[% IF do_report %]
|
|
|
|
[% global.grand_total = 0 global.estimated = 0 global.remaining = 0 %]
|
|
|
|
[% FOREACH workdata = part_list %]
|
|
[%# parts contains date ranges (from, to). %]
|
|
[% part = parts.shift %]
|
|
<div align="right">
|
|
<h4 style="padding-right: 2em; margin: 0;">
|
|
[% IF part.0 or part.1 %]
|
|
[% part.0 OR "Up" FILTER html %] to [% part.1 OR "now" FILTER html %]
|
|
[% ELSE %]
|
|
Full summary (no period specified)
|
|
[% END %]
|
|
</h4>
|
|
</div>
|
|
[% IF group_by == "number" %]
|
|
[% INCLUDE number_report %]
|
|
[% ELSE %]
|
|
[% INCLUDE owner_report %]
|
|
[% END %]
|
|
[% END %]
|
|
|
|
[% IF detailed %]
|
|
<h4 style="margin: 0">
|
|
Total of [% global.remaining FILTER format("%.2f") %]h remains from
|
|
original estimate of [% global.estimated FILTER format("%.2f") %]h
|
|
[% IF global.deadline %]
|
|
(deadline [% global.deadline FILTER html %])
|
|
[% END %]
|
|
</h4>
|
|
[% END %]
|
|
|
|
[% IF monthly %]
|
|
<h4 style="margin: 0">Total of [% global.grand_total FILTER format("%.2f") %] hours worked</h4>
|
|
<hr noshade size="1">
|
|
[% END %]
|
|
|
|
[% IF null.size > 0 %]
|
|
[% INCLUDE inactive_report %]
|
|
<h4 style="margin: 0">Total of [% null.size %] inactive [% terms.bugs %]</h4>
|
|
[% END %]
|
|
|
|
[% END %]
|
|
|
|
[% PROCESS global/footer.html.tmpl %]
|
|
|
|
[%#
|
|
#
|
|
# Developer reporting
|
|
#
|
|
#%]
|
|
|
|
[% BLOCK owner_report %]
|
|
[% global.total = 0 global.bug_count = {} global.owner_count = {} %]
|
|
<table cellpadding="4" cellspacing="0" width="90%" class="realitems owner">
|
|
[% FOREACH owner = workdata.keys.sort %]
|
|
[% INCLUDE do_one_owner owner=owner ownerdata=workdata.$owner
|
|
detailed=detailed %]
|
|
[% END %]
|
|
|
|
[% additional = "$global.owner_count.size developers @
|
|
$global.bug_count.size $terms.bugs" %]
|
|
[% INCLUDE section_total colspan=3 additional=additional %]
|
|
</table>
|
|
[% END %]
|
|
|
|
[% BLOCK do_one_owner %]
|
|
[% global.owner_count.$owner = 1 %]
|
|
<tr><td colspan="5" class="owner_header">
|
|
<b>[% owner FILTER html %]</b>
|
|
</td></tr>
|
|
[% col = 0 subtotal = 0%]
|
|
[% FOREACH bugdata=ownerdata.nsort("bug_id") %]
|
|
[% bug_id = bugdata.bug_id %]
|
|
[% INCLUDE calc_bug_total id=bug_id %]
|
|
[% global.bug_count.$bug_id = 1 %]
|
|
[% IF detailed %]
|
|
[% INCLUDE bug_header cid=col id=bug_id bugdata=bugdata extra=1 %]
|
|
[% col = col + 1 %]
|
|
[% END %]
|
|
[% subtotal = subtotal + bugdata.total_time %]
|
|
[% END %]
|
|
<tr>
|
|
<td colspan="4" align="right"><b>Total</b>:</td>
|
|
<td align="right" class="subtotal" width="100">
|
|
<b>[% subtotal FILTER format("%.2f") %]</b></td>
|
|
[% global.total = global.total + subtotal %]
|
|
</tr>
|
|
[% END %]
|
|
|
|
[%#
|
|
#
|
|
# Bug Number reporting
|
|
#
|
|
#%]
|
|
|
|
[% BLOCK number_report %]
|
|
[% global.total = 0 global.owner_count = {} global.bug_count = {} %]
|
|
|
|
<table cellpadding="4" cellspacing="0" width="90%" class="realitems number">
|
|
[% FOREACH bug = workdata.keys.nsort %]
|
|
[% INCLUDE do_one_bug id=bug bugdata=workdata.$bug
|
|
detailed=detailed %]
|
|
[% END %]
|
|
|
|
[% additional = "$global.bug_count.size $terms.bugs &
|
|
$global.owner_count.size developers" %]
|
|
[% INCLUDE section_total additional=additional colspan=2 %]
|
|
</table>
|
|
[% END %]
|
|
|
|
[% BLOCK do_one_bug %]
|
|
[% subtotal = 0.00 cid = 0 %]
|
|
[% INCLUDE calc_bug_total id=id %]
|
|
[% global.bug_count.$id = 1 %]
|
|
[% INCLUDE bug_header id=id %]
|
|
|
|
[% FOREACH owner = bugdata.sort("login_name") %]
|
|
[% work_time = owner.total_time %]
|
|
[% subtotal = subtotal + work_time %]
|
|
[% login_name = owner.login_name %]
|
|
[% global.owner_count.$login_name = 1 %]
|
|
[% IF detailed %]
|
|
[% cid = cid + 1 %]
|
|
<tr class="owner_header[% 2 FILTER none IF cid % 2 %]">
|
|
<td> </td>
|
|
<td colspan="2"><b>[% login_name FILTER html %]</b></td>
|
|
<td align="right">
|
|
[% work_time FILTER format("%.2f") %]</td>
|
|
</tr>
|
|
[% END %]
|
|
[% END %]
|
|
<tr>
|
|
<td colspan="2"> </td>
|
|
<td align="right">
|
|
<b>Total</b>:
|
|
</td>
|
|
<td align="right" class="subtotal" width="100">
|
|
<b>[% subtotal FILTER format("%.2f") %]</b>
|
|
</td>
|
|
</tr>
|
|
[% global.total = global.total + subtotal %]
|
|
[% END %]
|
|
|
|
[% BLOCK bug_header %]
|
|
<tr class="bug_header[% '2' IF cid % 2 %]">
|
|
<td width="80" valign="top">
|
|
<b>[% "$terms.Bug $id" FILTER bug_link(id) FILTER none %]</b>
|
|
</td>
|
|
<td width="100"><b>[% bugs.$id.bug_status_obj.name FILTER html %]</b></td>
|
|
<td colspan="2">[% bugs.$id.short_desc FILTER html %]</td>
|
|
[% IF extra %]
|
|
<td align="right" valign="top">[% bugdata.total_time FILTER html %]</td>
|
|
[% END %]
|
|
</tr>
|
|
[% IF detailed %]
|
|
<tr class="bug_header[% '2' IF cid % 2 %]">
|
|
<td> </td>
|
|
<td colspan="3">
|
|
<table width="100%" cellpadding="0" cellspacing="0">
|
|
<tr>
|
|
<td width="33%">
|
|
Estimated: [% bugs.$id.estimated_time FILTER format("%.2f") %]h
|
|
</td>
|
|
<td width="33%">
|
|
Remaining: [% bugs.$id.remaining_time FILTER format("%.2f") %]h
|
|
</td>
|
|
<td width="33%">
|
|
Deadline: [% bugs.$id.deadline || "<b>Not set</b>" %]
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
</td>
|
|
[% IF extra %]
|
|
<td> </td>
|
|
[% END %]
|
|
</tr>
|
|
[% END %]
|
|
[% END %]
|
|
|
|
[% BLOCK calc_bug_total %]
|
|
[% IF !global.bug_count.$id %]
|
|
[% global.estimated = global.estimated + bugs.$id.estimated_time %]
|
|
[% global.remaining = global.remaining + bugs.$id.remaining_time %]
|
|
[% IF !global.deadline || bugs.$id.deadline &&
|
|
global.deadline.replace("-", "") < bugs.$id.deadline.replace("-", "") %]
|
|
[% SET global.deadline = bugs.$id.deadline %]
|
|
[% END %]
|
|
[% END %]
|
|
[% END %]
|
|
|
|
[% BLOCK inactive_report %]
|
|
<h3>Inactive [% terms.bugs %]</h3>
|
|
<table cellpadding="4" cellspacing="0" width="90%" class="zeroitems">
|
|
[% cid = 0 %]
|
|
[% FOREACH bug_id = null.nsort %]
|
|
[% INCLUDE bug_header id=bug_id cid=cid %]
|
|
[% cid = cid + 1 %]
|
|
[% END %]
|
|
</table>
|
|
[% END %]
|
|
|
|
|
|
[% BLOCK section_total %]
|
|
[% IF global.total > 0 %]
|
|
<tr class="section_total">
|
|
<td><b>Totals</b></td>
|
|
<td colspan="[% colspan FILTER html %]" align="right"><b>[% additional FILTER html %]</b></td>
|
|
<td align="right"><b>[% global.total FILTER format("%.2f") %]</b></td>
|
|
</tr>
|
|
[% ELSE %]
|
|
<tr>
|
|
<td>No time allocated during the specified period.</td>
|
|
</tr>
|
|
[% END %]
|
|
[% global.grand_total = global.grand_total + global.total %]
|
|
[% END %]
|
|
|
|
[%#
|
|
#
|
|
# The query form
|
|
#
|
|
#%]
|
|
|
|
[% BLOCK query_form %]
|
|
<hr noshade size=1>
|
|
<form method="GET" name="summary" style="display: inline" action="summarize_time.cgi">
|
|
<input type="hidden" name="do_depends" value="[% do_depends FILTER html %]" />
|
|
<input type="hidden" name="id" value="[% ids.join(",") FILTER html %]" />
|
|
<input type="hidden" name="do_report" value="1" />
|
|
|
|
[% IF warn_swap_dates %]
|
|
<h4 style="border: 1px solid red; margin: 1em; padding: 0.5em">The
|
|
end date specified occurs before the start date, which doesn't
|
|
make sense; the dates below have therefore been swapped.</h4>
|
|
[% END %]
|
|
|
|
<table>
|
|
<tr>
|
|
<td align="right">
|
|
<b><label accesskey="s"
|
|
for="start_date">Period <u>s</u>tarting</label></b>:
|
|
</td><td colspan="3">
|
|
<input type="text" id="start_date" name="start_date" size="11"
|
|
align="right" value="[% start_date FILTER html %]" maxlength="10" />
|
|
|
|
<b>and <label accesskey="e" for="end_date"><u>e</u>nding</label></b>:
|
|
<input type="text" name="end_date" size="11" id="end_date"
|
|
align="right" value ="[% end_date FILTER html %]" maxlength="10" />
|
|
</td><td align="right">
|
|
<input type="submit" id="summarize" value="Summarize" />
|
|
</td></tr>
|
|
<tr>
|
|
<td> </td><td colspan="4">
|
|
<small>(Dates are optional, and in YYYY-MM-DD format)</small>
|
|
</td>
|
|
<tr><td align="right">
|
|
<b>Group by</b>:
|
|
</td><td colspan="2">
|
|
<input type="radio" name="group_by" id="number" value="number" [%+
|
|
'checked="checked"' IF group_by == "number"
|
|
%] /><label
|
|
for="number" accesskey="n">[% terms.Bug %] <u>N</u>umber</label>
|
|
<input type="radio" name="group_by" id="owner" value="owner" [%+
|
|
'checked="checked"' IF group_by == "owner"
|
|
%] /><label
|
|
for="owner" accesskey="d"><u>D</u>eveloper</label>
|
|
</td><td colspan="2">
|
|
<label for="ctype"><b>Format</b></label>: <select name="ctype" id="ctype">
|
|
<option value="html">HTML Report</option>
|
|
</select>
|
|
</td></tr><tr>
|
|
<td> </td><td colspan="4">
|
|
<input type="checkbox" name="monthly" [% 'checked="checked"' IF
|
|
monthly %] id="monthly" />
|
|
<label for="monthly" accesskey="m">Split by <u>m</u>onth</label>
|
|
[%# XXX: allow splitting by other intervals %]
|
|
|
|
<input type="checkbox" name="detailed" [% 'checked="checked"' IF
|
|
detailed %] id="detailed" />
|
|
<label for="detailed" accesskey="t">De<u>t</u>ailed summaries</label>
|
|
|
|
<input type="checkbox" name="inactive" [% 'checked="checked"' IF
|
|
inactive %] id="inactive" />
|
|
<label for="inactive" accesskey="i">Also show <u>i</u>nactive
|
|
[%+ terms.bugs %]</label>
|
|
<input type="checkbox" name="my_activity" [% 'checked="checked"' IF
|
|
my_activity %] id="my_activity" />
|
|
<label for="my_activity" accesskey="a">Use my <u>a</u>ctivity</label>
|
|
</td>
|
|
</tr></table>
|
|
|
|
</form>
|
|
<script type="text/javascript">
|
|
<!--
|
|
document.forms['summary'].start_date.focus()
|
|
//--></script>
|
|
<hr noshade size=1>
|
|
[% END %]
|