+if ( $cgi->param('dst') ) {
+
+ my @d = map { $_, "1$_" } split(/\s*,\s*/, $cgi->param('dst') );
+
+ my $search = 'dst IN ('. join(',', map dbh->quote($_), @d). ')';
+
+ push @search, $search;
+ push @qsearch, $search;
+
+}
+
+if ( $cgi->param('dcontext') =~ /^\s*(.+)\s*$/ ) {
+ my $dcontext = $1;
+ $hashref->{'dcontext'} = $dcontext;
+ push @search, 'dcontext = '. dbh->quote($dcontext);
+}
+
+if ( $cgi->param('charged_party') ) {
+
+ my @cp = map { $_, "1$_" }
+ split(/\s*,\s*/, $cgi->param('charged_party') );
+
+ my $search = 'charged_party IN ('. join(',', map dbh->quote($_), @cp). ')';
+
+ push @search, $search;
+ push @qsearch, $search;
+}
+
+if ( $cgi->param('charged_party_or_src') ) {
+
+ my @cp = map { $_, "1$_" }
+ split(/\s*,\s*/, $cgi->param('charged_party_or_src') );
+ my $in = join(',', map dbh->quote($_), @cp);
+
+ my $search = "( charged_party IN ($in) OR src IN ($in) )";
+
+ push @search, $search;
+ push @qsearch, $search;
+}
+
+if ( $cgi->param('lastapp') =~ /^\s*(.+)\s*$/ ) {
+ my $lastapp = $1;
+ $hashref->{'lastapp'} = $lastapp;
+ push @search, 'lastapp = '. dbh->quote($lastapp);
+}
+
+if ( $cgi->param('svcnum') =~ /^([\d, ]+)$/ ) {
+ my $svcnum = $1;
+ my $search = "svcnum IN ($svcnum)";
+ push @search, $search;
+ push @qsearch, $search;
+}
+
+###
+# src/dst_ip_addr
+###
+foreach my $field ('src_ip_addr','dst_ip_addr') {
+ if ( $cgi->param($field) ) {
+ my $search = FS::cdr->ip_addr_sql($field, $cgi->param($field));
+ 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;
+ }
+}
+
+###
+# accountcode
+###
+
+if ( $cgi->param('accountcode') =~ /\S/ ) {
+ my $accountcode = $cgi->param('accountcode');
+ my @accountcode = map {
+ ( my $v = $_ ) =~ s/^\s+|\s+$//g; # trim margin whitespace
+ length $v ? dbh->quote($v) : ()
+ } grep /\S/, split /\R/, $accountcode; # collect non-trivial lines
+ if (@accountcode) {
+ my $search = 'accountcode IN ( ' . join( ',', @accountcode ) . ' )';
+ push @qsearch, $search;
+ push @search, $search;
+ }