X-Git-Url: http://git.freeside.biz/gitweb/?a=blobdiff_plain;f=FS%2Fbin%2Ffreeside-cdrrewrited;h=bcc76153b9161fa2090dc77eb23b7ce666834178;hb=HEAD;hp=34a20684949702ec88a2c78186e51fbe8e11e2a7;hpb=92713b3eb2e1511b71e850af3e47296cbf5bc24f;p=freeside.git diff --git a/FS/bin/freeside-cdrrewrited b/FS/bin/freeside-cdrrewrited old mode 100644 new mode 100755 index 34a206849..bcc76153b --- a/FS/bin/freeside-cdrrewrited +++ b/FS/bin/freeside-cdrrewrited @@ -54,7 +54,8 @@ while (1) { #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 @@ -63,12 +64,11 @@ while (1) { 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 } ) ) { @@ -88,11 +88,27 @@ while (1) { 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 ) @@ -269,6 +285,7 @@ sub _shouldrun { || $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 ; } @@ -294,9 +311,14 @@ of the following config options are enabled: =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