blob: 9613eebf14d6447e7088b8c132f99537d07ce6d5 [file] [log] [blame]
[%# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This Source Code Form is "Incompatible With Secondary Licenses", as
# defined by the Mozilla Public License, v. 2.0.
#%]
[% 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/buglist.css']
doc_section = "using/editing.html#time-tracking"
yui = ['calendar']
javascript_urls = [ "js/util.js", "js/field.js" ]
%]
[% 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 %]
<h4>
[% 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>
[% IF group_by == "number" %]
[% INCLUDE number_report %]
[% ELSE %]
[% INCLUDE owner_report %]
[% END %]
[% END %]
[% IF detailed %]
<h4>
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>Total of [% global.grand_total FILTER format("%.2f") %] hours worked</h4>
<hr>
[% END %]
[% IF null.size > 0 %]
[% INCLUDE inactive_report %]
<h4>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 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>
<th colspan="4" class="right">Total:</th>
<td class="subtotal">[% subtotal FILTER format("%.2f") %]</td>
</tr>
[% global.total = global.total + subtotal %]
[% END %]
[%#
#
# Bug Number reporting
#
#%]
[% BLOCK number_report %]
[% global.total = 0 global.owner_count = {} global.bug_count = {} %]
<table 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>&nbsp;</td>
<td colspan="2"><b>[% login_name FILTER html %]</b></td>
<td class="right">
[% work_time FILTER format("%.2f") %]</td>
</tr>
[% END %]
[% END %]
<tr>
<th colspan="3" class="right">Total:</th>
<td class="subtotal">[% subtotal FILTER format("%.2f") %]</td>
</tr>
[% global.total = global.total + subtotal %]
[% END %]
[% BLOCK bug_header %]
<tr class="bug_header[% '2' IF cid % 2 %]">
<th class="bug_id">[% "$terms.Bug $id" FILTER bug_link(id) FILTER none %]</th>
<th class="bug_status">
[% display_value("bug_status", bugs.$id.bug_status) FILTER html %]
</th>
<td colspan="2">[% bugs.$id.short_desc FILTER html %]</td>
[% IF extra %]
<td class="right">[% bugdata.total_time FILTER html %]</td>
[% END %]
</tr>
[% IF detailed %]
<tr class="bug_header[% '2' IF cid % 2 %]">
<td>&nbsp;</td>
<td colspan="3">
<span class="time_info">
Estimated: [% bugs.$id.estimated_time FILTER format("%.2f") %]h
</span>
<span class="time_info">
Remaining: [% bugs.$id.remaining_time FILTER format("%.2f") %]h
</span>
<span class="time_info">
Deadline: [% bugs.$id.deadline || "<b>Not set</b>" %]
</span>
</td>
[% IF extra %]
<td>&nbsp;</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 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>
<th colspan="[% colspan FILTER html %]" class="right">[% additional FILTER html %]</th>
<th class="right">[% global.total FILTER format("%.2f") %]</th>
</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>
<form method="post" name="summary" 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 %]
<p class="warning_swapped_data">
The end date specified occurs before the start date, which doesn't
make sense; the dates below have therefore been swapped.
</p>
[% END %]
<table>
<tr>
<th>
<label accesskey="s" for="start_date">Period <u>s</u>tarting</label>:
</th>
<td>
<input id="start_date" name="start_date" size="10" autofocus
value="[% start_date FILTER html %]" maxlength="10"
onchange="updateCalendarFromField(this)">
<button type="button" class="calendar_button" id="button_calendar_start_date"
onclick="showCalendar('start_date')"><span>Calendar</span>
</button>
<div id="con_calendar_start_date"></div>
<span class="label">
and <label accesskey="e" for="end_date"><u>e</u>nding</label>:
</span>
<input type="text" name="end_date" size="10" id="end_date"
value ="[% end_date FILTER html %]" maxlength="10"
onchange="updateCalendarFromField(this)">
<button type="button" class="calendar_button" id="button_calendar_end_date"
onclick="showCalendar('end_date')"><span>Calendar</span>
</button>
<div id="con_calendar_end_date"></div>
<br>
<span class="bz_info">(Dates are optional, and in YYYY-MM-DD format)</span>
</td>
<th><input type="submit" id="summarize" value="Summarize"></th>
</tr>
<tr>
<th>Group by:</th>
<td>
<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>
<th>
<label for="ctype">Format</label>:
<select name="ctype" id="ctype">
<option value="html">HTML Report</option>
</select>
</th>
</tr>
<tr>
<th>&nbsp;</th>
<td colspan="2">
<input type="checkbox" name="monthly" id="monthly"
[% 'checked="checked"' IF monthly %]>
<label for="monthly" accesskey="m">Split by <u>m</u>onth</label>
[%# XXX: allow splitting by other intervals %]
<input type="checkbox" name="detailed" id="detailed"
[% 'checked="checked"' IF detailed %]>
<label for="detailed" accesskey="t">De<u>t</u>ailed summaries</label>
<input type="checkbox" name="inactive" id="inactive"
[% 'checked="checked"' IF inactive %]>
<label for="inactive" accesskey="i">Also show <u>i</u>nactive
[%+ terms.bugs %]</label>
</td>
</tr>
</table>
</form>
<script type="text/javascript">
<!--
[%+ PROCESS "global/calendar.js.tmpl" id = 'start_date' %]
[% PROCESS "global/calendar.js.tmpl" id = 'end_date' %]
//-->
</script>
<hr>
[% END %]