[freeside-commits] branch FREESIDE_4_BRANCH updated. 191ed671d297c587f8e3eea638a8d0a54494b845

Jonathan Prykop jonathan at 420.am
Wed Oct 5 13:52:32 PDT 2016


The branch, FREESIDE_4_BRANCH has been updated
       via  191ed671d297c587f8e3eea638a8d0a54494b845 (commit)
       via  bee59d635b820a548b0c56ee2e342424eadc22dd (commit)
       via  19ddcfe7eb72ec1246547a45c3313f79b2a4b06c (commit)
      from  4075410bf6ab31746b0a49cc610a0a68059c0127 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.

- Log -----------------------------------------------------------------
commit 191ed671d297c587f8e3eea638a8d0a54494b845
Author: Jonathan Prykop <jonathan at freeside.biz>
Date:   Tue Oct 4 21:29:39 2016 -0500

    38278: Removing duplicate CDR entries prior to billing [FOR UPDATE fix, v4+]

diff --git a/FS/bin/freeside-cdrrewrited b/FS/bin/freeside-cdrrewrited
index bb16059..d117f56 100644
--- a/FS/bin/freeside-cdrrewrited
+++ b/FS/bin/freeside-cdrrewrited
@@ -63,12 +63,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
     } )
   ) {
 

commit bee59d635b820a548b0c56ee2e342424eadc22dd
Author: Jonathan Prykop <jonathan at freeside.biz>
Date:   Tue Oct 4 15:32:18 2016 -0500

    38278: Removing duplicate CDR entries prior to billing [changed status to skipped]

diff --git a/FS/bin/freeside-cdrrewrited b/FS/bin/freeside-cdrrewrited
index 34a2068..bb16059 100644
--- a/FS/bin/freeside-cdrrewrited
+++ b/FS/bin/freeside-cdrrewrited
@@ -88,7 +88,7 @@ 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');
       }
     }
@@ -294,7 +294,7 @@ 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-asterisk_australia_rewrite

commit 19ddcfe7eb72ec1246547a45c3313f79b2a4b06c
Author: Jonathan Prykop <jonathan at freeside.biz>
Date:   Fri Jul 29 15:54:26 2016 -0500

    RT#38278: Removing duplicate CDR entries prior to billing [v4 reconcile]

diff --git a/FS/FS/Conf.pm b/FS/FS/Conf.pm
index 128c30f..1c4690d 100644
--- a/FS/FS/Conf.pm
+++ b/FS/FS/Conf.pm
@@ -5026,6 +5026,13 @@ and customer address. Include units.',
 #  },
 
   {
+    'key'         => 'cdr-skip_duplicate_rewrite',
+    'section'     => 'telephony',
+    'description' => 'Use the freeside-cdrrewrited daemon to prevent billing CDRs with a src, dst and calldate identical to an existing CDR',
+    'type'        => 'checkbox',
+  },
+
+  {
     'key'         => 'cdr-charged_party_rewrite',
     'section'     => 'telephony',
     'description' => 'Do charged party rewriting in the freeside-cdrrewrited daemon; useful if CDRs are being dropped off directly in the database and require special charged_party processing such as cdr-charged_party-accountcode or cdr-charged_party-truncate*.',
diff --git a/FS/bin/freeside-cdrrewrited b/FS/bin/freeside-cdrrewrited
index f9d97af..34a2068 100644
--- a/FS/bin/freeside-cdrrewrited
+++ b/FS/bin/freeside-cdrrewrited
@@ -4,7 +4,7 @@ use strict;
 use vars qw( $conf );
 use FS::Daemon ':all'; #daemonize1 drop_root daemonize2 myexit logfile sig*
 use FS::UID qw( adminsuidsetup );
-use FS::Record qw( qsearch qsearchs );
+use FS::Record qw( qsearch qsearchs dbh );
 #use FS::cdr;
 #use FS::cust_pkg;
 #use FS::queue;
@@ -24,12 +24,12 @@ daemonize2();
 
 $conf = new FS::Conf;
 
-die "not running; cdr-asterisk_forward_rewrite, cdr-charged_party_rewrite ".
-    " and cdr-taqua-accountcode_rewrite conf options are all off\n"
+die "not running; relevant conf options are all off\n"
   unless _shouldrun();
 
 #--
 
+#used for taqua
 my %sessionnum_unmatch = ();
 my $sessionnum_retry = 4 * 60 * 60; # 4 hours
 my $sessionnum_giveup = 4 * 24 * 60 * 60; # 4 days
@@ -45,20 +45,25 @@ while (1) {
   # instead of just doing this search like normal CDRs
 
   #hmm :/
+  #used only by taqua, should have no effect otherwise
   my @recent = grep { ($sessionnum_unmatch{$_} + $sessionnum_retry) > time }
                  keys %sessionnum_unmatch;
   my $extra_sql = scalar(@recent)
                     ? ' AND acctid NOT IN ('. join(',', @recent). ') '
                     : '';
 
+  #order matters for removing dupes--only the first is preserved
+  $extra_sql .= ' ORDER BY acctid '
+    if $conf->exists('cdr-skip_duplicate_rewrite');
+
   my $found = 0;
-  my %skip = ();
+  my %skip = (); #used only by taqua
   my %warning = ();
 
   foreach my $cdr ( 
     qsearch( {
       'table'     => 'cdr',
-      'extra_sql' => 'FOR UPDATE',
+      '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 '.
@@ -67,11 +72,27 @@ while (1) {
     } )
   ) {
 
-    next if $skip{$cdr->acctid};
+    next if $skip{$cdr->acctid}; #used only by taqua
 
     $found = 1;
     my @status = ();
 
+    if ($conf->exists('cdr-skip_duplicate_rewrite')) {
+      #qsearch can't handle timestamp type of calldate
+      my $sth = dbh->prepare(
+        'SELECT 1 FROM cdr WHERE src=? AND dst=? AND calldate=? AND acctid < ? LIMIT 1'
+      ) or die dbh->errstr;
+      $sth->execute($cdr->src,$cdr->dst,$cdr->calldate,$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('done'); #prevent it from being billed
+        push(@status,'duplicate');
+      }
+    }
+
     if ( $conf->exists('cdr-asterisk_forward_rewrite')
          && $cdr->dstchannel =~ /^Local\/(\d+)/i && $1 ne $cdr->dst
        )
@@ -247,6 +268,7 @@ sub _shouldrun {
   || $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')
   || 0
   ;
 }
@@ -270,6 +292,11 @@ of the following config options are enabled:
 
 =over 4
 
+=item cdr-skip_duplicate_rewrite
+
+Marks as 'done' (prevents billing for) any CDRs with 
+a src, dst and calldate identical to an existing CDR
+
 =item cdr-asterisk_australia_rewrite
 
 Classifies Australian numbers as domestic, mobile, tollfree, international, or

-----------------------------------------------------------------------

Summary of changes:
 FS/FS/Conf.pm               |    7 +++++++
 FS/bin/freeside-cdrrewrited |   40 +++++++++++++++++++++++++++++++++-------
 2 files changed, 40 insertions(+), 7 deletions(-)




More information about the freeside-commits mailing list