X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=blobdiff_plain;f=httemplate%2Fsearch%2Fcdr.html;h=702dc1bccb7c6f8c0c0aa64d64c34491213c0d56;hp=0facc7fab2ac9889d7c563bda7a14b0e88caeb02;hb=74a3083375ccc3a0dc8b74f9b39392989d088656;hpb=c648976f0b7975f2328ebd7ba8c711fad0ca4195 diff --git a/httemplate/search/cdr.html b/httemplate/search/cdr.html index 0facc7fab..702dc1bcc 100644 --- a/httemplate/search/cdr.html +++ b/httemplate/search/cdr.html @@ -1,15 +1,51 @@ <% include( 'elements/search.html', 'title' => $title, 'name' => 'call detail records', + 'query' => { 'table' => 'cdr', 'hashref' => $hashref, 'extra_sql' => $qsearch, 'order_by' => 'ORDER BY calldate', }, 'count_query' => $count_query, - 'header' => [ fields('cdr') ], #XXX fill in some nice names - 'fields' => [ fields('cdr') ], #XXX fill in some pretty-print - # processing, etc. + 'header' => [ + '', # checkbox column + @header, + ], + 'fields' => [ + sub { + return '' unless $edit_data; + $areboxes = 1; + my $cdr = shift; + my $acctid = $cdr->acctid; + qq!!; + }, + @fields, #XXX fill in some pretty-print + #processing, etc. + ], + 'links' => \@links, + + 'html_form' => qq!
!, + #false laziness w/queue.html + 'html_foot' => sub { + if ( $areboxes ) { + '
'. + ''. + qq!
!. + qq!
!. + ''; + } else { + ''; + } + }, + ) %> <%init> @@ -17,6 +53,12 @@ die "access denied" unless $FS::CurrentUser::CurrentUser->access_right('List rating data'); +my $edit_data = $FS::CurrentUser::CurrentUser->access_right('Edit rating data'); + +my $conf = new FS::Conf; + +my $areboxes = 0; + my $title = 'Call Detail Records'; my $hashref = {}; @@ -24,7 +66,28 @@ my $hashref = {}; # and fixup $count_query my @search = (); -my @qsearch = (); + +### +# dates +### + +my $str2time_sql = str2time_sql; +my $closing = str2time_sql_closing; + +my($beginning, $ending) = FS::UI::Web::parse_beginning_ending($cgi); +push @search, "$str2time_sql calldate $closing >= $beginning ", + "$str2time_sql calldate $closing <= $ending"; + +### +# duration / billsec +### + +push @search, FS::UI::Web::parse_lt_gt($cgi, 'duration'); +push @search, FS::UI::Web::parse_lt_gt($cgi, 'billsec'); + +#above here things just push @search +#below here things also have to define $hashref->{} or push @qsearch +my @qsearch = @search; ### # freesidestatus @@ -32,49 +95,156 @@ my @qsearch = (); if ( $cgi->param('freesidestatus') eq 'NULL' ) { - my $title = "Unprocessed $title"; + $title = "Unprocessed $title"; $hashref->{'freesidestatus'} = ''; # Record.pm will take care of it push @search, "( freesidestatus IS NULL OR freesidestatus = '' )"; } elsif ( $cgi->param('freesidestatus') =~ /^([\w ]+)$/ ) { - my $title = "Processed $title"; + $title = "Processed $title"; $hashref->{'freesidestatus'} = $1; push @search, "freesidestatus = '$1'"; } ### -# dates +# termpartNstatus ### -my $str2time_sql = str2time_sql; +foreach my $param ( grep /^termpart\d+status$/, $cgi->param ) { -my($beginning, $ending) = FS::UI::Web::parse_beginning_ending($cgi); -push @search, -my @dsearch = ( "$str2time_sql calldate) >= $beginning ", - "$str2time_sql calldate) <= $ending" - ); -push @search, @dsearch; -push @qsearch, @search; + my $status = $cgi->param($param); + + $param =~ /^termpart(\d+)status$/ or die 'guru meditation 54something'; + my $termpart = $1; + + my $search = ''; + if ( $status eq 'NULL' ) { + + #false lazienss w/cdr_termination.pm (i should be a part_termination method) + my $where_term = + "( cdr.acctid = cdr_termination.acctid AND termpart = $termpart ) "; + #my $join_term = "LEFT JOIN cdr_termination ON ( $where_term )"; + $search = + "NOT EXISTS ( SELECT 1 FROM cdr_termination WHERE $where_term )"; + + } elsif ( $status =~ /^([\w ]+)$/ ) { + + #false lazienss w/cdr_termination.pm (i should be a part_termination method) + my $where_term = + "( cdr.acctid = cdr_termination.acctid AND termpart = $termpart AND status = '$1' ) "; + #my $join_term = "LEFT JOIN cdr_termination ON ( $where_term )"; + $search = + "EXISTS ( SELECT 1 FROM cdr_termination WHERE $where_term )"; + } + + if ( $search ) { + push @search, $search; + push @qsearch, $search; + } + +} ### -# src/dest +# src/dest/charged_party ### -if ( $cgi->param('src') =~ /^\s*([\d\-\+\ ]+)\s*$/ ) { - ( my $src = $1 ) =~ s/\D//g; +my $phonenum = qr/^\s*([\d\-\+\ ]+)\s*$/; +my $x = qr/\D/; +if ( $conf->exists('svc_phone-allow_alpha_phonenum') ) { + $phonenum = qr/^\s*([\d\-\+\ A-Za-z]+)\s*$/; + $x = qr/[^\dA-Za-z]/; +} + +if ( $cgi->param('src') =~ $phonenum ) { + ( my $src = $1 ) =~ s/$x//g; $hashref->{'src'} = $src; push @search, "src = '$src'"; } -if ( $cgi->param('dst') =~ /^\s*([\d\-\+ ]+)\s*$/ ) { - ( my $dst = $1 ) =~ s/\D//g; +if ( $cgi->param('dst') =~ $phonenum ) { + ( my $dst = $1 ) =~ s/$x//g; $hashref->{'dst'} = $dst; 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') =~ $phonenum ) { + ( my $charged_party = $1 ) =~ s/$x//g; + #$hashref->{'charged_party'} = $charged_party; + #push @search, "charged_party = '$charged_party'"; + #XXX countrycode + + my $search = " ( charged_party IN ('$charged_party', '1$charged_party') )"; + + push @search, $search; + push @qsearch, $search; +} + +if ( $cgi->param('charged_party_or_src') =~ $phonenum ) { + ( my $charged_party = $1 ) =~ s/$x//g; + #$hashref->{'charged_party'} = $charged_party; + #push @search, "charged_party = '$charged_party'"; + #XXX countrycode + + my $search = " ( charged_party IN ('$charged_party', '1$charged_party') + OR src IN ('$charged_party', '1$charged_party') )"; + + push @search, $search; + push @qsearch, $search; +} + +### +# cdrbatchnum (or legacy cdrbatch) +### + +if ( $cgi->param('cdrbatch') ) { + + my $cdr_batch = + qsearchs('cdr_batch', { 'cdrbatch' => scalar($cgi->param('cdrbatch')) } ); + if ( $cdr_batch ) { + $hashref->{cdrbatchnum} = $cdr_batch->cdrbatchnum; + push @search, 'cdrbatchnum = '. $cdr_batch->cdrbatchnum; + } else { + die "unknown cdrbatch ". $cgi->param('cdrbatch'); + } + +} elsif ( $cgi->param('cdrbatchnum') ne '__ALL__' ) { + + if ( $cgi->param('cdrbatchnum') eq '' ) { + my $search = "( cdrbatchnum IS NULL )"; + push @qsearch, $search; + push @search, $search; + } elsif ( $cgi->param('cdrbatchnum') =~ /^(\d+)$/ ) { + $hashref->{cdrbatchnum} = $1; + push @search, "cdrbatchnum = $1"; + } + +} + +### +# acctid +### + +if ( $cgi->param('acctid') =~ /\d/ ) { + my $acctid = $cgi->param('acctid'); + $acctid =~ s/\r\n/\n/g; #browsers? + my @acctid = map { /^\s*(\d+)\s*$/ or die "guru meditation #4"; $1; } + grep { /^\s*(\d+)\s*$/ } + split(/\n/, $acctid); + if ( @acctid ) { + my $search = 'acctid IN ( '. join(',', @acctid). ' )'; + push @qsearch, $search; + push @search, $search; + } +} + ### # finish it up ### @@ -88,4 +258,53 @@ my $qsearch = join(' AND ', @qsearch); $qsearch = ( scalar(keys %$hashref) ? ' AND ' : ' WHERE ' ) . $qsearch if $qsearch; +### +# display fields +### + +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{$_}; + } else { + my $header = $_; + $header =~ s/\_/ /g; #//wtf + ucfirst($header); + } + } @fields; + +my $date_sub_factory = sub { + my $column = shift; + sub { + #my $cdr = shift; + my $date = shift->$column(); + $date ? time2str( '%Y-%m-%d %T', $date ) : ''; #config time2str format? + }; +}; + +my %fields = ( + #any other formatters? + map { $_ => &{ $date_sub_factory }($_) } qw( startdate answerdate enddate ) +); + +my %links = ( + 'svcnum' => + sub { $_[0]->svcnum ? [ $p.'view/svc_phone.cgi?', 'svcnum' ] : ''; }, +); + +@fields = map { exists($fields{$_}) ? $fields{$_} : $_ } @fields; + + #checkbox column +my @links = ( '', map { exists($links{$_}) ? $links{$_} : '' } @fields ); +