[freeside-commits] branch master updated. 9531335fb25595f8883967c21f9692d4331f54ce
Ivan
ivan at 420.am
Fri Jun 26 12:26:32 PDT 2015
The branch, master has been updated
via 9531335fb25595f8883967c21f9692d4331f54ce (commit)
from de608f008350898b465b87d0fb8c84a09824611c (commit)
Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.
- Log -----------------------------------------------------------------
commit 9531335fb25595f8883967c21f9692d4331f54ce
Author: Ivan Kohler <ivan at freeside.biz>
Date: Fri Jun 26 12:26:31 2015 -0700
support and unclassified time per customer for a date range
diff --git a/httemplate/elements/menu.html b/httemplate/elements/menu.html
index 4d0d979..a01530e 100644
--- a/httemplate/elements/menu.html
+++ b/httemplate/elements/menu.html
@@ -291,7 +291,8 @@ $report_rating{'Unrateable CDRs'} = [ $fsurl.'search/cdr.html?freesidestatus=fai
if $curuser->access_right("Usage: Unrateable CDRs");
if ( $curuser->access_right("Usage: Time worked") ) {
$report_rating{'Time worked'} = [ $fsurl.'search/report_rt_transaction.html', '' ];
- $report_rating{'Time worked summary'} = [ $fsurl.'search/report_rt_ticket.html', '' ];
+ $report_rating{'Time worked summary per ticket'} = [ $fsurl.'search/report_rt_ticket.html', '' ];
+ $report_rating{'Time worked summary per customer'} = [ $fsurl.'search/report_rt_cust.html', '' ];
}
tie my %report_ticketing_statistics, 'Tie::IxHash',
diff --git a/httemplate/search/report_rt_cust.html b/httemplate/search/report_rt_cust.html
new file mode 100644
index 0000000..07d497f
--- /dev/null
+++ b/httemplate/search/report_rt_cust.html
@@ -0,0 +1,40 @@
+<& /elements/header.html, 'Time worked per-customer summary' &>
+
+<FORM ACTION="rt_cust.html" METHOD="GET">
+
+<TABLE>
+
+ <& /elements/tr-select-cust_main-status.html,
+ 'label' => emt('Status'),
+ &>
+
+ <& /elements/tr-input-beginning_ending.html &>
+
+<!--
+ <& /elements/tr-select.html,
+ label => 'Time category:',
+ field => 'category',
+ options => [ '', 'development', 'support' ],
+ option_labels => { '' => 'all' },
+ curr_value => 'development',
+ &>
+
+ <& /elements/tr-select-otaker.html &>
+-->
+
+</TABLE>
+
+<BR>
+<INPUT TYPE="submit" VALUE="Search">
+
+</FORM>
+
+<& /elements/footer.html &>
+<%init>
+
+die "access denied"
+ unless $FS::CurrentUser::CurrentUser->access_right('List rating data');
+
+my $conf = new FS::Conf;
+
+</%init>
diff --git a/httemplate/search/rt_cust.html b/httemplate/search/rt_cust.html
new file mode 100644
index 0000000..7c31e97
--- /dev/null
+++ b/httemplate/search/rt_cust.html
@@ -0,0 +1,174 @@
+<& elements/search.html,
+ 'title' => 'Time worked per-customer summary',
+ 'name_singular' => 'customer',
+ 'query' => $sql_query,
+ 'count_query' => $count_query,
+ 'header' => [ FS::UI::Web::cust_header(
+ $cgi->param('cust_fields')
+ ),
+ @extra_headers,
+ 'Support time',
+ #'Development time',
+ 'Unclassified time',
+ ],
+ 'fields' => [
+ \&FS::UI::Web::cust_fields,
+ @extra_fields,
+ $support_time_sub,
+ $unclass_time_sub,
+ ],
+ 'color' => [ FS::UI::Web::cust_colors(),
+ map '', @extra_fields
+ ],
+ 'style' => [ FS::UI::Web::cust_styles(),
+ map '', @extra_fields
+ ],
+ 'align' => [ FS::UI::Web::cust_aligns(),
+ map '', @extra_fields
+ ],
+ 'links' => [ ( map { $_ ne 'Cust. Status' ? $link : '' }
+ FS::UI::Web::cust_header(
+ $cgi->param('cust_fields')
+ )
+ ),
+ map '', @extra_fields
+ ],
+
+&>
+<%init>
+
+die "access denied"
+ unless $FS::CurrentUser::CurrentUser->access_right('List rating data')
+;
+
+#false laziness w/cust_main.html (we're really only filtering on status for now)
+
+my %search_hash = ();
+
+#$search_hash{'query'} = $cgi->keywords;
+
+#scalars
+my @scalars = qw (
+ agentnum salesnum status address city county state zip country
+ invoice_terms
+ no_censustract with_geocode with_email tax no_tax POST no_POST
+ custbatch usernum
+ cancelled_pkgs
+ cust_fields flattened_pkgs
+ all_tags
+ all_pkg_classnums
+ any_pkg_status
+);
+
+for my $param ( @scalars ) {
+ $search_hash{$param} = scalar( $cgi->param($param) )
+ if length($cgi->param($param));
+}
+
+#lists
+for my $param (qw( classnum refnum tagnum pkg_classnum )) {
+ $search_hash{$param} = [ $cgi->param($param) ];
+}
+
+###
+# etc
+###
+
+my $sql_query = FS::cust_main::Search->search(\%search_hash);
+my $count_query = delete($sql_query->{'count_query'});
+my @extra_headers = @{ delete($sql_query->{'extra_headers'}) };
+my @extra_fields = @{ delete($sql_query->{'extra_fields'}) };
+
+my $link = [ "${p}view/cust_main.cgi?", 'custnum' ];
+
+#eofalse (cust_main.html)
+
+#false laziness / cribbed from search/rt_ticket.html
+
+my $twhere = "
+ WHERE Transactions.ObjectType = 'RT::Ticket'
+"; #AND Transactions.ObjectId = Tickets.Id
+
+my $transaction_time = "
+CASE transactions.type when 'Set'
+ THEN (to_number(newvalue,'999999')-to_number(oldvalue, '999999')) * 60
+ ELSE timetaken*60
+END";
+
+$twhere .= "
+ AND ( ( Transactions.Type = 'Set'
+ AND Transactions.Field = 'TimeWorked'
+ AND Transactions.NewValue != Transactions.OldValue )
+ OR ( Transactions.Type IN ( 'Create', 'Comment', 'Correspond', 'Touch' )
+ AND Transactions.TimeTaken > 0
+ )
+ )";
+
+my($beginning, $ending) = FS::UI::Web::parse_beginning_ending($cgi);
+# TIMESTAMP is Pg-specific... ?
+if ( $beginning > 0 ) {
+ $beginning = "TIMESTAMP '". time2str('%Y-%m-%d %X', $beginning). "'";
+ $twhere .= " AND Transactions.Created >= $beginning ";
+}
+if ( $ending < 4294967295 ) {
+ $ending = "TIMESTAMP '". time2str('%Y-%m-%d %X', $ending). "'";
+ $twhere .= " AND Transactions.Created <= $ending ";
+}
+
+my $transactions = "FROM Transactions $twhere";
+
+#eofalse (rt_ticket.html)
+
+my $support_time_sub = sub {
+ my $cust_main = shift;
+ my $sec = 0;
+ foreach my $ticket ($cust_main->tickets) {
+
+ my $TimeType = FS::Record->scalar_sql(
+ "SELECT Content FROM ObjectCustomFieldValues
+ JOIN CustomFields
+ ON (ObjectCustomFieldValues.CustomField = CustomFields.Id)
+ WHERE CustomFields.Name = 'TimeType'
+ AND ObjectCustomFieldValues.ObjectType = 'RT::Ticket'
+ AND ObjectCustomFieldValues.Disabled = 0
+ AND ObjectId = ". $ticket->{id}
+ );
+ next unless $TimeType eq 'support';
+
+ $sec += FS::Record->scalar_sql(
+ "SELECT SUM($transaction_time) $transactions ".
+ " AND Transactions.ObjectId = ". $ticket->{id}
+ );
+ }
+
+ (($sec < 0) ? '-' : '' ). int(abs($sec)/3600)."h".sprintf("%02d",(abs($sec)%3600)/60)."m";
+
+};
+
+my $unclass_time_sub = sub {
+ my $cust_main = shift;
+ my $sec = 0;
+ foreach my $ticket ($cust_main->tickets) {
+
+ my $TimeType = FS::Record->scalar_sql(
+ "SELECT Content FROM ObjectCustomFieldValues
+ JOIN CustomFields
+ ON (ObjectCustomFieldValues.CustomField = CustomFields.Id)
+ WHERE CustomFields.Name = 'TimeType'
+ AND ObjectCustomFieldValues.ObjectType = 'RT::Ticket'
+ AND ObjectCustomFieldValues.Disabled = 0
+ AND ObjectId = ". $ticket->{id}
+ );
+ next unless $TimeType eq '';
+
+ $sec += FS::Record->scalar_sql(
+ "SELECT SUM($transaction_time) $transactions ".
+ " AND Transactions.ObjectId = ". $ticket->{id}
+ );
+ }
+
+ (($sec < 0) ? '-' : '' ). int(abs($sec)/3600)."h".sprintf("%02d",(abs($sec)%3600)/60)."m";
+
+};
+
+</%init>
-----------------------------------------------------------------------
Summary of changes:
httemplate/elements/menu.html | 3 +-
httemplate/search/report_rt_cust.html | 40 ++++++++
httemplate/search/rt_cust.html | 174 +++++++++++++++++++++++++++++++++
3 files changed, 216 insertions(+), 1 deletion(-)
create mode 100644 httemplate/search/report_rt_cust.html
create mode 100644 httemplate/search/rt_cust.html
More information about the freeside-commits
mailing list