CDR search by dcontext, charged_party, toggle of display fields, RT#4081
authorivan <ivan>
Sun, 5 Jul 2009 21:35:52 +0000 (21:35 +0000)
committerivan <ivan>
Sun, 5 Jul 2009 21:35:52 +0000 (21:35 +0000)
FS/FS/Schema.pm
FS/FS/cdr.pm
httemplate/elements/checkboxes.html
httemplate/search/cdr.html
httemplate/search/report_cdr.html

index 52e1190..67ef612 100644 (file)
@@ -2142,7 +2142,12 @@ sub tables_hashref {
       ],
       'primary_key' => 'acctid',
       'unique' => [],
-      'index' => [ [ 'calldate' ], [ 'src' ], [ 'dst' ], [ 'charged_party' ], [ 'accountcode' ], [ 'carrierid' ], [ 'freesidestatus' ], [ 'freesiderewritestatus' ], [ 'cdrbatch' ], ],
+      'index' => [ [ 'calldate' ],
+                   [ 'src' ], [ 'dst' ], [ 'dcontext' ], [ 'charged_party' ],
+                   [ 'accountcode' ], [ 'carrierid' ],
+                   [ 'freesidestatus' ], [ 'freesiderewritestatus' ],
+                   [ 'cdrbatch' ],
+                 ],
     },
 
     'cdr_termination' => {
index 7b1ee7a..96132ec 100644 (file)
@@ -153,6 +153,54 @@ points to.  You can ask the object for a copy with the I<hash> method.
 
 sub table { 'cdr'; }
 
+sub table_info {
+  {
+    'fields' => {
+#XXX fill in some (more) nice names
+        #'acctid'                => '',
+        'calldate'              => 'Call date',
+        'clid'                  => 'Caller ID',
+        'src'                   => 'Source',
+        'dst'                   => 'Destination',
+        'dcontext'              => 'Dest. context',
+        'channel'               => 'Channel',
+        'dstchannel'            => 'Destination channel',
+        #'lastapp'               => '',
+        #'lastdata'              => '',
+        'startdate'             => 'Start date',
+        'answerdate'            => 'Answer date',
+        'enddate'               => 'End date',
+        'duration'              => 'Duration',
+        'billsec'               => 'Billable seconds',
+        'disposition'           => 'Disposition',
+        'amaflags'              => 'AMA flags',
+        'accountcode'           => 'Account code',
+        #'uniqueid'              => '',
+        'userfield'             => 'User field',
+        #'cdrtypenum'            => '',
+        'charged_party'         => 'Charged party',
+        #'upstream_currency'     => '',
+        'upstream_price'        => 'Upstream price',
+        #'upstream_rateplanid'   => '',
+        #'ratedetailnum'         => '',
+        'rated_price'           => 'Rated price',
+        #'distance'              => '',
+        #'islocal'               => '',
+        #'calltypenum'           => '',
+        #'description'           => '',
+        #'quantity'              => '',
+        'carrierid'             => 'Carrier ID',
+        #'upstream_rateid'       => '',
+        'svcnum'                => 'Freeside service',
+        'freesidestatus'        => 'Freeside status',
+        'freesiderewritestatus' => 'Freeside rewrite status',
+        'cdrbatch'              => 'Batch',
+    },
+
+  };
+
+}
+
 =item insert
 
 Adds this record to the database.  If there is an error, returns the error,
index 1262245..b120ada 100644 (file)
@@ -10,8 +10,9 @@ Example:
    
     'names_list' => [ 'value',
                       'other value',
-                      [ 'complex value' => { 'desc' => "Add'l description",
-                                             'note' => '&nbsp;*',
+                      [ 'complex value' => { 'label' => 'Display value',
+                                             'desc'  => "Add'l description",
+                                             'note'  => '&nbsp;*',
                                            }
                       ],
                     ],
@@ -40,7 +41,10 @@ Example:
 % foreach my $item ( @{ $opt{'names_list'} } ) {
 %
 %     my $name = ref($item) ? $item->[0] : $item;
-%     ( my $display = $name ) =~ s/ /&nbsp;/g;
+%     my $display = ( ref($item) && $item->[1]{label} )
+%                     ? $item->[1]{label}
+%                     : $name;
+%     $display =~ s/ /&nbsp;/g;
 %     $display .= $item->[1]{note} if ref($item) && $item->[1]{note};
 %     my $desc = ref($item) && $item->[1]{desc} ? $item->[1]{desc} : '';
 %
index 26eac75..126c4fd 100644 (file)
@@ -158,6 +158,12 @@ if ( $cgi->param('dst') =~ /^\s*([\d\-\+ ]+)\s*$/ ) {
   push @search, "dst = '$dst'";
 }
 
+if ( $cgi->param('dcontext') =~ /^\s*(.+)\s*$/ ) {
+  my $dcontext = $1;
+  $hashref->{'dcontext'} = $dcontext;
+  push @search, "dcontext = '$dcontext'";
+}
+
 if ( $cgi->param('charged_party') =~ /^\s*([\d\-\+\ ]+)\s*$/ ) {
   ( my $charged_party = $1 ) =~ s/\D//g;
   #$hashref->{'charged_party'} = $charged_party;
@@ -203,24 +209,17 @@ $qsearch = ( scalar(keys %$hashref) ? ' AND ' : ' WHERE ' ) . $qsearch
 # display fields
 ###
 
-#XXX fill in some (more) nice names
-my %header = (
-  'calldate'       => 'Call Date',
-  'clid'           => 'Caller ID',
-  'charged_party'  => 'Charged party',
-  'src'            => 'Source',
-  'dst'            => 'Destination',
-  'dcontext'       => 'Destination Context',
-  'channel'        => 'Channel',
-  'dstchannel'     => 'Destination Channel',
-  'freesidestatus' => 'Freeside status',
-);
+my %header = %{ FS::cdr->table_info->{'fields'} };
 
 my @first = qw( acctid calldate clid charged_party src dst dcontext );
 my %first = map { $_=>1 } @first;
 
 my @fields = ( @first, grep !$first{$_}, fields('cdr') );
 
+if ( $cgi->param('show') ) {
+  @fields = grep $cgi->param("show_$_"), @fields;
+}
+
 my @header = map {
                    if ( exists($header{$_}) ) {
                      $header{$_};
index 6a0b89b..c5f728c 100644 (file)
@@ -5,6 +5,12 @@
 <TABLE BGCOLOR="#cccccc" CELLSPACING=0>
 
   <TR>
+    <TH BGCOLOR="#e8e8e8" COLSPAN=2 ALIGN="left">
+      <FONT SIZE="+1">Search options</FONT>
+    </TH>
+  </TR>
+
+  <TR>
     <TD ALIGN="right">Status: </TD>
     <TD>
       <SELECT NAME="freesidestatus">
     </TD>
   </TR>
 
+  <TR>
+    <TD ALIGN="right">Destination Context: </TD>
+    <TD>
+      <INPUT TYPE="text" NAME="dcontext">
+    </TD>
+  </TR>
+
+
+  <TR>
+    <TD ALIGN="right">Charged Party #: </TD>
+    <TD>
+      <INPUT TYPE="text" NAME="charged_party">
+    </TD>
+  </TR>
+
   <% include( '/elements/tr-input-lessthan_greaterthan.html',
                 'label' => 'Duration (sec)',
                 'field' => 'duration',
 
   <% include( '/elements/tr-select-cdrbatch.html' ) %>
 
+  <TR>
+    <TH BGCOLOR="#e8e8e8" COLSPAN=2>&nbsp;</TH>
+  </TR>
+
+  <TR>
+    <TH BGCOLOR="#e8e8e8" COLSPAN=2 ALIGN="left"><FONT SIZE="+1">Display options</FONT></TH>
+  </TR>
+
+  <INPUT TYPE="hidden" NAME="show" VALUE="1">
+
+  <TR>
+    <TD COLSPAN=2>
+      <% include('/elements/checkboxes.html',
+                   'names_list'          => $names_list,
+                   'element_name_prefix' => 'show_',
+                   'checked_callback'    => sub { $show_default{$_[1]} },
+                                                  # my($cgi, $name) = @_;
+                )
+      %>
+    </TD>
+  </TR>
+
 </TABLE>
 
 <BR>
 die "access denied"
   unless $FS::CurrentUser::CurrentUser->access_right('List rating data');
 
+my @fields = fields('cdr');
+my $labels = FS::cdr->table_info->{'fields'};
+
+#XXX config
+my @show_default = qw(
+  calldate clid src dst dcontext charged_party
+  startdate answerdate enddate duration billsec
+  disposition amaflags accountcode userfield
+  rated_price upstream_price carrierid 
+  svcnum freesidestatus freesiderewritestatus cdrbatch
+);
+my %show_default = map { $_=>1 } @show_default;
+
+my $names_list = [ map {
+                         [ $_ => {
+                                   'label' => 'Show '. ( $labels->{$_} || $_ )
+                                 }
+                         ]
+                       } 
+                   @fields
+                 ];
+
 </%init>