diff options
Diffstat (limited to 'rt/html/RTx/Statistics/CallsQueueDay')
-rwxr-xr-x | rt/html/RTx/Statistics/CallsQueueDay/Elements/Chart | 29 | ||||
-rw-r--r-- | rt/html/RTx/Statistics/CallsQueueDay/Results.tsv | 191 | ||||
-rwxr-xr-x | rt/html/RTx/Statistics/CallsQueueDay/index.html | 275 |
3 files changed, 495 insertions, 0 deletions
diff --git a/rt/html/RTx/Statistics/CallsQueueDay/Elements/Chart b/rt/html/RTx/Statistics/CallsQueueDay/Elements/Chart new file mode 100755 index 000000000..9a3a50574 --- /dev/null +++ b/rt/html/RTx/Statistics/CallsQueueDay/Elements/Chart @@ -0,0 +1,29 @@ +<%perl> +$r->content_type("image/$format"); +print $graph->plot(\@data)->$format(); +$m->abort(); +print $#data+1 . " Elements:<p>"; +for (0..$#data) { +print $data[$_]; +print "<p>"; +} +</%perl> +<%INIT> +use GD::Graph::lines; + +my @data; +my $graph = GD::Graph::lines->new($Statistics::GraphWidth,$Statistics::GraphHeight); +$graph->set(export_format => "png", + x_label => 'Day of Week', + y_label => 'Tickets per Day', + x_labels_vertical => 1, + ); +my $format = $graph->export_format; +$graph->set_legend(split /,/ , $ARGS{set_legend}); +push @data, [split /,/ , $ARGS{x_labels}]; +push @data, [split /,/ , $ARGS{data1}]; +push @data, [split /,/ , $ARGS{data2}]; +push @data, [split /,/ , $ARGS{data3}]; +</%INIT> +<%ARGS> +</%ARGS> diff --git a/rt/html/RTx/Statistics/CallsQueueDay/Results.tsv b/rt/html/RTx/Statistics/CallsQueueDay/Results.tsv new file mode 100644 index 000000000..23f0c699c --- /dev/null +++ b/rt/html/RTx/Statistics/CallsQueueDay/Results.tsv @@ -0,0 +1,191 @@ +%# BEGIN BPS TAGGED BLOCK {{{ +%# +%# COPYRIGHT: +%# +%# This software is Copyright (c) 1996-2005 Best Practical Solutions, LLC +%# <jesse@bestpractical.com> +%# +%# (Except where explicitly superseded by other copyright notices) +%# +%# +%# LICENSE: +%# +%# This work is made available to you under the terms of Version 2 of +%# the GNU General Public License. A copy of that license should have +%# been provided with this software, but in any event can be snarfed +%# from www.gnu.org. +%# +%# This work is distributed in the hope that it will be useful, but +%# WITHOUT ANY WARRANTY; without even the implied warranty of +%# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +%# General Public License for more details. +%# +%# You should have received a copy of the GNU General Public License +%# along with this program; if not, write to the Free Software +%# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +%# +%# +%# CONTRIBUTION SUBMISSION POLICY: +%# +%# (The following paragraph is not intended to limit the rights granted +%# to you to modify and distribute this software under the terms of +%# the GNU General Public License and is only of importance to you if +%# you choose to contribute your changes and enhancements to the +%# community by submitting them to Best Practical Solutions, LLC.) +%# +%# By intentionally submitting any modifications, corrections or +%# derivatives to this work, or any other work intended for use with +%# Request Tracker, to Best Practical Solutions, LLC, you confirm that +%# you are the copyright holder for those contributions and you grant +%# Best Practical Solutions, LLC a nonexclusive, worldwide, irrevocable, +%# royalty-free, perpetual, license to use, copy, create derivative +%# works based on those contributions, and sublicense and distribute +%# those contributions and any derivatives thereof. +%# +%# END BPS TAGGED BLOCK }}} +<%ARGS> +$Queue => undef +$weekends => $Statistics::PerDayWeekends; +$sMonth=>undef +$sDay=>undef +$sYear=>undef +$eMonth=>undef +$eDay=>undef +$eYear=>undef +$days=>undef +$currentMonth=>undef +</%ARGS> + +<%INIT> +use RTx::Statistics; +use Time::Local; +my @dates; +my $n = 0; +my %Totals; +my $now = new RT::Date($session{CurrentUser}); +my $sEpoch; +my $eEpoch; + +if (!defined $Queue) { + $Queue = $Statistics::PerDayQueue; +} + +if ($sDay > $Statistics::monthsMaxDay{$sMonth}) { + $sDay = $Statistics::monthsMaxDay{$sMonth}; +} + +if ($eDay > $Statistics::monthsMaxDay{$eMonth}) { + $eDay = $Statistics::monthsMaxDay{$eMonth}; +} + +if ($sYear){ + $sEpoch = timelocal(0, 0, 0, $sDay, $sMonth, $sYear-1900); +} +if ($eYear){ +Statistics::DebugLog("eMonth = " . $eMonth . "\n"); + $eEpoch = timelocal(0, 0, 0, $eDay, $eMonth, $eYear-1900); +} else { + # This case happens when the page is first loaded + my @local = localtime(time); + ($eDay, $eMonth, $eYear) = ($local[3], $local[4], $local[5]); + $eYear += 1900; + $eEpoch = timelocal(0, 0, 0, $local[3], $local[4], $local[5], $local[6], $local[7], $local[8]); +Statistics::DebugLog("Setting eEpoch=$eEpoch from current time.\n"); +} + +if (($eEpoch < $sEpoch) || ($sEpoch == 0)) { + # We have an end, but not a start, or, overlapping. + + # if $currentMonth is set, just set the day to 1 + if($currentMonth) { + # set start vars from end, but with day set to 1 + (undef, undef, undef, $sDay, $sMonth, $sYear) = localtime($eEpoch); + $sDay=1; + $sEpoch = timelocal(0, 0, 0, $sDay, $sMonth, $sYear); + } else { + # If the user has specified how many days back to go, use that, + # If not, set start to configured default period before end + if(defined $days) { + $sEpoch = $eEpoch - ($days * $Statistics::secsPerDay); + } else { + $sEpoch = $eEpoch - ($Statistics::PerDayPeriod * $Statistics::secsPerDay); + } + (undef, undef, undef, $sDay, $sMonth, $sYear) = localtime($sEpoch); + } + $sYear += 1900; +} + +# set content type +$r->content_type('application/vnd.ms-excel'); + +# Put out some data about the generation of this file +$m->out("Tickets per day for Queue:\t" . $Queue . "\tGenerated at:\t" . Statistics::FormatDate("%x %X", $now). "\n\n"); + + +# Compute days to chart. +# The +1 is because we need to generate one more date. If the user +# selected a 10 day range, we need to generate 11 days. +my $diff = int(($eEpoch - $sEpoch + $Statistics::secsPerDay - 1) / $Statistics::secsPerDay)+1; + +# Build array of dates +my $endRange = $eEpoch + $Statistics::secsPerDay; +my $QueueObj = new RT::Queue($session{'CurrentUser'}); +$QueueObj->Load($Queue); +until ($#dates == $diff) { + my $date = new RT::Date($session{CurrentUser}); + $date->Set(Value=>$endRange - $n, Format => 'unix'); + # Note: we used to adjust the time to local midnight, but + # none of the other date entry fields in RT seem to adjust, so we've stopped. + #Statistics::DebugLog("Before adjust to midnight date " . Statistics::FormatDate("%c", $date) . "\n"); + $n+= $Statistics::secsPerDay; + # If we aren't showing weekends and this is one, decrement the number + # of days to show and skip to the next date. + if(!$weekends and Statistics::RTDateIsWeekend($date)) {$diff--; next;} + unshift @dates, $date; +} + +# Output header row +$m->out("Date\tcreate\tresolved\tdeleted\n"); + + +LINE: for my $d (0..$#dates) { + if ($d == $#dates){ + next LINE; + } + my $x = 1; + # Output the date for this row + $m->out(Statistics::FormatDate($Statistics::PerDayDateFormat, $dates[$d])); + + # output the 3 columns for this row + for my $status (qw(created resolved deleted)) { + my $tix = new RT::Tickets($session{'CurrentUser'}); + if ($status eq "created") { + $tix->LimitCreated(VALUE => $dates[$d]->ISO, OPERATOR => ">="); + if ($dates[$d+1]) { + $tix->LimitCreated(VALUE => $dates[$d+1]->ISO, OPERATOR => "<="); + } + } elsif ($status eq "resolved") { + $tix->LimitStatus(VALUE => $status); + $tix->LimitResolved(VALUE => $dates[$d]->ISO, OPERATOR => ">="); + if ($dates[$d+1]) { + $tix->LimitResolved(VALUE => $dates[$d+1]->ISO, OPERATOR => "<="); + } + } elsif ($status eq "deleted") { + $tix->LimitStatus(VALUE => $status); + $tix->LimitLastUpdated(VALUE => $dates[$d]->ISO, OPERATOR => ">="); + if ($dates[$d+1]) { + $tix->LimitLastUpdated(VALUE => $dates[$d+1]->ISO, OPERATOR => "<="); + } + } + $tix->LimitQueue (VALUE => $Queue); + $m->out( "\t" . $tix->Count ); + $Totals{$status} += $tix->Count; + } + $m->out("\n"); +} + +# Output the totals +$m->out("Totals\t$Totals{created}\t$Totals{resolved}\t$Totals{deleted}\n"); + +$m->abort(); +</%INIT> diff --git a/rt/html/RTx/Statistics/CallsQueueDay/index.html b/rt/html/RTx/Statistics/CallsQueueDay/index.html new file mode 100755 index 000000000..06fc484d1 --- /dev/null +++ b/rt/html/RTx/Statistics/CallsQueueDay/index.html @@ -0,0 +1,275 @@ +<& /Elements/Header, Title => loc("Tickets per day in Queue:" . $QueueObj->Name()) &> +<& /RTx/Statistics/Elements/Tabs, Title => loc("Tickets by status per day in Queue:" . $QueueObj->Name()) &> + +<h3>Description</h3> +<p>This page displays details about tickets in the selected queue over the date range chosen. It shows how many tickets were created on +each day in the chosen range, and how many of those were either Resolved or Deleted.</p> +<p>To always show the current month to date, bookmark this <a href="<%$RT::WebPath%>/RTx/Statistics/CallsQueueDay/index.html?currentMonth=1">link</a>, or +for a spreadsheet, use this <a href="<%$RT::WebPath%>/RTx/Statistics/CallsQueueDay/Results.tsv?currentMonth=1">link</a>.</p> + +<form method="POST" action="index.html"> + +% Statistics::DebugLog("queue name=" . $QueueObj->Name() . "\n"); + +%my $title = "Ticket counts in " . $QueueObj->Name() . " by status per day from " . +% Statistics::FormatDate($Statistics::PerDayDateFormat, $dates[0]) . " through " . +% Statistics::FormatDate($Statistics::PerDayDateFormat, $dates[$#dates-1]); +<&|/Elements/TitleBox, + title => $title, + title_href => "/RTx/Statistics/CallsQueueDay/index.html?$QueryString" &> +<TABLE BORDER=0 cellspacing=0 cellpadding=1 WIDTH=100%> +% if ($ShowHeader) { +<& /RTx/Statistics/Elements/CollectionAsTable/Header, + Format => \@Format, + FormatString => $Format, + AllowSorting => $AllowSorting, + Order => $Order, + Query => undef, + Rows => $Rows, + Page => $Page, + OrderBy => $OrderBy , + BaseURL => $BaseURL, + maxitems => $maxitems &> +% } +% my $line = 1; +% LINE: for my $d (0..$#dates) { +% if ($d == $#dates){ +% next LINE; +% } +% my $x = 1; +% $values{Statistics_Date} = Statistics::FormatDate($Statistics::PerDayDateFormat, $dates[$d]); +%# NOTE need to handle all status values here.... +% for my $status (qw(created resolved deleted)) { +% my $tix = new RT::Tickets($session{'CurrentUser'}); +% $tix->LimitQueue (VALUE => $Queue); +% if ($status eq "created") { +% $tix->LimitCreated(VALUE => $dates[$d]->ISO, OPERATOR => ">="); +% if ($dates[$d+1]) { +% $tix->LimitCreated(VALUE => $dates[$d+1]->ISO, OPERATOR => "<="); +% } +% $values{Statistics_Created_Count} = $tix->Count; +% $Totals{Statistics_Created_Count} += $tix->Count; +% } +% elsif ($status eq "resolved") { +% $tix->LimitStatus(VALUE => $status); +% $tix->LimitResolved(VALUE => $dates[$d]->ISO, OPERATOR => ">="); +% if ($dates[$d+1]) { +% $tix->LimitResolved(VALUE => $dates[$d+1]->ISO, OPERATOR => "<="); +% } +% $values{Statistics_Resolved_Count} = $tix->Count; +% $Totals{Statistics_Resolved_Count} += $tix->Count; +% } +% elsif ($status eq "deleted") { +% $tix->LimitStatus(VALUE => $status); +% $tix->LimitLastUpdated(VALUE => $dates[$d]->ISO, OPERATOR => ">="); +% if ($dates[$d+1]) { +% $tix->LimitLastUpdated(VALUE => $dates[$d+1]->ISO, OPERATOR => "<="); +% } +% $values{Statistics_Deleted_Count} = $tix->Count; +% $Totals{Statistics_Deleted_Count} += $tix->Count; +% } +% $data[$x++][$d] = $tix->Count; +% } +<& /RTx/Statistics/Elements/CollectionAsTable/Row, Format => \@Format, i => $line, record => $record, maxitems => $maxitems &> +% $line++; +% } +% $values {Statistics_Date} = "Totals"; +% $values {Statistics_Created_Count} = $Totals{Statistics_Created_Count}; +% $values {Statistics_Resolved_Count} = $Totals{Statistics_Resolved_Count}; +% $values {Statistics_Deleted_Count} = $Totals{Statistics_Deleted_Count}; +<& /RTx/Statistics/Elements/CollectionAsTable/Row, Format => \@BoldFormat, i => $line, record => $record, maxitems => $maxitems &> +</table> +</&> + +<hr> + +<BR /> +<BR /> + +<%perl> +# Create the graph URL +my $url= 'Elements/Chart?x_labels='; +for (1..$diff) { + $url .= $data[0][$_] . ","; +} +chop $url; +$url .= "&"; +shift @data; +for (0..$#data) { + $url .= "data".(1+$_)."=".(join ",", @{$data[$_]})."&"; +} +chop $url; +$url .= "&set_legend=Created,Resolved,Deleted"; +</%perl> + +<& /RTx/Statistics/Elements/GraphBox, GraphURL => $url &> + +<& /RTx/Statistics/Elements/ControlsAsTable/ControlBox, + Title => "Change Queue or Dates", + ShowDates => 1, sMonth => \$sMonth, sDay => \$sDay, sYear => \$sYear, + eMonth => \$eMonth, eDay => \$eDay, eYear => \$eYear, + weekends => $weekends, + ShowSingleQueue => 1, Queue => $Queue + &> + +</form> + +<a href="<%$RT::WebPath%>/RTx/Statistics/CallsQueueDay/index.html?<% $QueryString %>"><&|/l&>Bookmarkable link</&></a> | +<a href="<%$RT::WebPath%>/RTx/Statistics/CallsQueueDay/Results.tsv?<%$QueryString%>"><&|/l&>spreadsheet</&></a> +<BR> +<BR> + + +% Statistics::DebugLog("ref of eMonth is " . ref($eMonth) . "\n"); +% Statistics::DebugInit( $m ); + +<%ARGS> +$Queue => undef +$weekends => $Statistics::PerDayWeekends; +$sMonth=>undef +$sDay=>undef +$sYear=>undef +$eMonth=>undef +$eDay=>undef +$eYear=>undef +$days=>undef +$currentMonth=>undef + +$AllowSorting => undef +$Order => undef +$OrderBy => undef +$ShowNavigation => 1 +$ShowHeader => 1 +$Rows => 50 +$Page => 1 +$BaseURL => undef +</%ARGS> + +<%INIT> +use RTx::Statistics; +use Time::Local; +my $selected; +my $n = 0; +my @data = ([]); +my @dates; +my @msgs; +my $diff; +my $sEpoch=0; +my $eEpoch=0; +my %Totals; +my $QueryString; +my $maxitems = 4; +my %record; +my %values; +my $record = \%record; + +$record{values} = \%values; + + +# If debugging, set things up and display all the args +Statistics::DebugClear(); +Statistics::DebugLog("CallsQueueDay/index.html ARGS:\n"); +for my $key (keys %ARGS) { + Statistics::DebugLog("ARG{ $key }=" . $ARGS{$key} . "\n"); +} + +my $Format = qq{ Statistics_Date, + '__Statistics_Created_Count__/STYLE:text-align:right;', + '__Statistics_Resolved_Count__/STYLE:text-align:right;', + '__Statistics_Deleted_Count__/STYLE:text-align:right;' }; +my $BoldFormat = qq{ '<B>__Statistics_Date__</B>', + '<B>__Statistics_Created_Count__</B>/STYLE:text-align:right;', + '<B>__Statistics_Resolved_Count__</B>/STYLE:text-align:right;', + '<B>__Statistics_Deleted_Count__</B>/STYLE:text-align:right;' }; +my (@Format) = $m->comp('/RTx/Statistics/Elements/CollectionAsTable/ParseFormat', Format => $Format); +my (@BoldFormat) = $m->comp('/RTx/Statistics/Elements/CollectionAsTable/ParseFormat', Format => $BoldFormat); +Statistics::DebugLog("CallsQueueDay/index.html Format array=" . join(',', @Format) . "\n"); + +if (!defined $Queue) { + my $QueueObj = new RT::Queue($session{'CurrentUser'}); + $QueueObj->Load($Statistics::PerDayQueue); + $Queue = $QueueObj->Id(); +} + +if ($sDay > $Statistics::monthsMaxDay{$sMonth}) { + $sDay = $Statistics::monthsMaxDay{$sMonth}; +} + +if ($eDay > $Statistics::monthsMaxDay{$eMonth}) { + $eDay = $Statistics::monthsMaxDay{$eMonth}; +} + +if ($sYear){ + $sEpoch = timelocal(0, 0, 0, $sDay, $sMonth, $sYear-1900); +} +if ($eYear){ +Statistics::DebugLog("eMonth = " . $eMonth . "\n"); + $eEpoch = timelocal(0, 0, 0, $eDay, $eMonth, $eYear-1900); +} else { + # This case happens when the page is first loaded + my @local = localtime(time); + ($eDay, $eMonth, $eYear) = ($local[3], $local[4], $local[5]); + $eYear += 1900; + $eEpoch = timelocal(0, 0, 0, $local[3], $local[4], $local[5], $local[6], $local[7], $local[8]); +Statistics::DebugLog("Setting eEpoch=$eEpoch from current time.\n"); +} + +if (($eEpoch < $sEpoch) || ($sEpoch == 0)) { + # We have an end, but not a start, or, overlapping. + + # if $currentMonth is set, just set the day to 1 + if($currentMonth) { + # set start vars from end, but with day set to 1 + (undef, undef, undef, $sDay, $sMonth, $sYear) = localtime($eEpoch); + $sDay=1; + $sEpoch = timelocal(0, 0, 0, $sDay, $sMonth, $sYear); + } else { + # If the user has specified how many days back to go, use that, + # If not, set start to configured default period before end + if(defined $days) { + $sEpoch = $eEpoch - ($days * $Statistics::secsPerDay); + } else { + $sEpoch = $eEpoch - ($Statistics::PerDayPeriod * $Statistics::secsPerDay); + } + (undef, undef, undef, $sDay, $sMonth, $sYear) = localtime($sEpoch); + } + $sYear += 1900; +} + +# Compute days to chart. +# The +1 is because we need to generate one more date. If the user +# selected a 10 day range, we need to generate 11 days. +$diff = int(($eEpoch - $sEpoch + $Statistics::secsPerDay - 1) / $Statistics::secsPerDay)+1; +Statistics::DebugLog("Setting diff=$diff\n"); + +Statistics::DebugLog("sEpoch=$sEpoch, components=" . join(',', localtime($sEpoch)) . "\n"); +Statistics::DebugLog("eEpoch=$eEpoch, components=" . join(',', localtime($eEpoch)) . "\n"); + +# Set up the string for the current query for bookmarkable link +$QueryString = "sDay=$sDay&sMonth=$sMonth&sYear=$sYear&eDay=$eDay&eMonth=$eMonth&eYear=$eYear&weekends=$weekends&Queue=$Queue"; + +# Set up the end date to be midnight(morning) of the date after the one the user wanted. +my $endRange = $eEpoch + $Statistics::secsPerDay; +my $QueueObj = new RT::Queue($session{'CurrentUser'}); +$QueueObj->Load($Queue); +$n = 0; +until ($#dates == $diff) { + my $date = new RT::Date($session{CurrentUser}); + $date->Set(Value=>$endRange - $n, Format => 'unix'); + # Note: we used to adjust the time to local midnight, but + # none of the other date entry fields in RT seem to adjust, so we've stopped. + #Statistics::DebugLog("Before adjust to midnight date " . Statistics::FormatDate("%c", $date) . "\n"); + $n+= $Statistics::secsPerDay; + # If we aren't showing weekends and this is one, decrement the number + # of days to show and skip to the next date. + if(!$weekends and Statistics::RTDateIsWeekend($date)) {$diff--; next;} + unshift @dates, $date; +Statistics::DebugLog("pushing date " . Statistics::FormatDate("%c", $date) . "\n"); + unshift @{ $data[0] }, Statistics::FormatDate($Statistics::PerDayLabelDateFormat, $date); +} + +# We put an extra day into the lists to cover up till midnight of the next day, +# But we don't want that to appear in the labels, so pop it off. +pop( @{ $data[0] } ); + +</%INIT> |