[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