#order matters for removing dupes--only the first is preserved
$extra_sql .= ' ORDER BY acctid '
- if $conf->exists('cdr-skip_duplicate_rewrite');
+ if $conf->exists('cdr-skip_duplicate_rewrite')
+ || $conf->exists('cdr-skip_duplicate_rewrite-sipcallid');
my $found = 0;
my %skip = (); #used only by taqua
foreach my $cdr (
qsearch( {
'table' => 'cdr',
- 'extra_sql' => 'FOR UPDATE', #XXX overwritten by opt below...would fixing this break anything?
'hashref' => {},
'extra_sql' => 'WHERE freesidestatus IS NULL '.
' AND freesiderewritestatus IS NULL '.
$extra_sql.
- ' LIMIT 1024', #arbitrary, but don't eat too much memory
+ ' LIMIT 1024 FOR UPDATE', #arbitrary, but don't eat too much memory
} )
) {
if ($isdup) {
#we only act on this cdr, not touching previous dupes
#if a dupe somehow creeped in previously, too late to fix it
- $cdr->freesidestatus('done'); #prevent it from being billed
+ $cdr->freesidestatus('skipped'); #prevent it from being billed
push(@status,'duplicate');
}
}
+ if ($conf->exists('cdr-skip_duplicate_rewrite-sipcallid')) {
+ my $sth = dbh->prepare(
+ 'SELECT 1 FROM cdr WHERE sipcallid=? AND acctid < ? LIMIT 1'
+ ) or die dbh->errstr;
+ $sth->execute($cdr->sipcallid, $cdr->acctid) or die $sth->errstr;
+ my $isdup = $sth->fetchrow_hashref;
+ $sth->finish;
+ if ($isdup) {
+ #we only act on this cdr, not touching previous dupes
+ #if a dupe somehow creeped in previously, too late to fix it
+ $cdr->freesidestatus('skipped'); #prevent it from being billed
+ push(@status,'duplicate');
+ }
+ }
+
+
if ( $conf->exists('cdr-asterisk_forward_rewrite')
&& $cdr->dstchannel =~ /^Local\/(\d+)/i && $1 ne $cdr->dst
)
}
+ if ( $conf->exists('cdr-userfield_dnis_rewrite') and
+ $cdr->userfield =~ /DNIS=(\d+)/ ) {
+ $cdr->dst($1);
+ push @status, 'userfield_dnis';
+ }
+
if ( $conf->exists('cdr-intl_to_domestic_rewrite') and
$cdr->dst =~ /^(011)(\d{0,7})$/ ) {
$cdr->dst($2);
|| $conf->exists('cdr-taqua-accountcode_rewrite')
|| $conf->exists('cdr-taqua-callerid_rewrite')
|| $conf->exists('cdr-intl_to_domestic_rewrite')
+ || $conf->exists('cdr-userfield_dnis_rewrite')
|| $conf->exists('cdr-skip_duplicate_rewrite')
+ || $conf->exists('cdr-skip_duplicate_rewrite-sipcallid')
|| 0
;
}
=item cdr-skip_duplicate_rewrite
-Marks as 'done' (prevents billing for) any CDRs with
+Marks as 'skipped' (prevents billing for) any CDRs with
a src, dst and calldate identical to an existing CDR
+=item cdr-skip_duplicate_rewrite-sipcallid
+
+Marks as 'skipped' (prevents billing for) any CDRs with
+a sipcallid identical to an existing CDR
+
=item cdr-asterisk_australia_rewrite
Classifies Australian numbers as domestic, mobile, tollfree, international, or