[freeside-commits] branch master updated. 527638b9d017fbd5960b04f170eed029ef25d974

Mark Wells mark at 420.am
Thu Jul 25 16:39:31 PDT 2013


The branch, master has been updated
       via  527638b9d017fbd5960b04f170eed029ef25d974 (commit)
      from  642cd9bbd96603c696f3932f527d57ad33e9b7ee (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 527638b9d017fbd5960b04f170eed029ef25d974
Author: Mark Wells <mark at freeside.biz>
Date:   Thu Jul 25 16:24:12 2013 -0700

    a2billing cdr import script, #23276

diff --git a/bin/cdr-a2billing.import b/bin/cdr-a2billing.import
new file mode 100755
index 0000000..6677fa0
--- /dev/null
+++ b/bin/cdr-a2billing.import
@@ -0,0 +1,164 @@
+#!/usr/bin/perl
+
+use strict;
+use vars qw( $DEBUG );
+use Date::Parse 'str2time';
+use Date::Format 'time2str';
+use FS::UID qw(adminsuidsetup dbh);
+use FS::cdr;
+use DBI;
+use Getopt::Std;
+
+my %opt;
+getopts('H:U:P:D:T:s:e:c:', \%opt);
+my $user = shift or die &usage;
+
+my $dsn = 'dbi:mysql';
+$dsn .= ":database=$opt{D}" if $opt{D};
+$dsn .= ":host=$opt{H}" if $opt{H};
+
+my $mysql = DBI->connect($dsn, $opt{U}, $opt{P}) 
+  or die $DBI::errstr;
+
+my ($start, $end) = ('', '');
+if ( $opt{s} ) {
+  $start = str2time($opt{s}) or die "can't parse start date $opt{s}\n";
+  $start = time2str('%Y-%m-%d', $start);
+}
+if ( $opt{e} ) {
+  $end = str2time($opt{e}) or die "can't parse end date $opt{e}\n";
+  $end = time2str('%Y-%m-%d', $end);
+}
+
+adminsuidsetup $user;
+
+my $fsdbh = FS::UID::dbh;
+
+# check for existence of freesidestatus
+my $table = $opt{T} || 'cc_call';
+my $status = $mysql->selectall_arrayref("SHOW COLUMNS FROM $table WHERE Field = 'freesidestatus'");
+if( ! @$status ) {
+  print "Adding freesidestatus column...\n";
+  $mysql->do("ALTER TABLE $table ADD COLUMN freesidestatus varchar(32)")
+    or die $mysql->errstr;
+}
+else {
+  print "freesidestatus column present\n";
+}
+
+# Fields:
+# id - primary key, sequential
+# session_id - Local/<digits>-<digits> or SIP/<digits>-<digits>
+# uniqueid - a decimal number, seems to be close to the unix timestamp
+# card_id - probably the equipment port, 1 - 10
+# nasipaddress - we don't care
+# starttime, stoptime - timestamps
+# sessiontime - duration, seconds
+# calledstation - dst
+# sessionbill - upstream_price
+# id_tariffgroup - null, 0, 1
+# id_tariffplan - null, 0, 3, 4, 5, 6, 7, 8, 9
+# id_ratecard - larger numbers
+# (all of the id_* fields are foreign keys: cc_tariffgroup, cc_ratecard, etc.)
+# id_trunk - we don't care
+# sipiax - probably don't care
+# src - src.  Usually a phone number, but not always.
+# id_did - always null
+# buycost - wholesale price? correlated with sessionbill
+# id_card_package_offer - no idea
+# real_sessiontime - close to sessiontime, except when it's null
+# (When sessiontime = 0, real_sessiontime is either 0 or null, and 
+# sessionbill is 0.  When sessiontime > 0, but real_sessiontime is null, 
+# sessionbill is 0.  So real_sessiontime seems to be the billable time, and 
+# is null when the call is non-billable.)
+# dnid - sometimes equals calledstation, or calledstation without the leading 
+# "1".  But not always.
+# terminatecauseid - integer, 0 - 7
+# destination - seems to be the NPA or NPA+NXX sometimes, or "0".
+
+# terminatecauseid values:
+my %disposition = (
+  0 => '',
+  1 => 'ANSWER', #the only one that's billable
+  2 => 'BUSY',
+  3 => 'NOANSWER',
+  4 => 'CANCEL',
+  5 => 'CONGESTION',
+  6 => 'CHANUNAVAIL',
+  7 => 'DONTCALL',
+  8 => 'TORTURE', #???
+  9 => 'INVALIDARGS',
+);
+
+my @cols = ( qw(
+  id sessionid
+  starttime stoptime sessiontime real_sessiontime
+  terminatecauseid
+  calledstation src
+  id_tariffplan id_ratecard sessionbill
+) );
+
+my $sql = 'SELECT '.join(',', @cols). " FROM $table".
+  ' WHERE freesidestatus IS NULL' .
+  ($start && " AND starttime >= '$start'") .
+  ($end   && " AND starttime <  '$end'") ;
+my $sth = $mysql->prepare($sql);
+$sth->execute;
+print "Importing ".$sth->rows." records...\n";
+
+my $cdr_batch = new FS::cdr_batch({ 
+    'cdrbatch' => 'mysql-import-'. time2str('%Y/%m/%d-%T',time),
+  });
+my $error = $cdr_batch->insert;
+die $error if $error;
+my $cdrbatchnum = $cdr_batch->cdrbatchnum;
+my $imports = 0;
+my $updates = 0;
+
+my $row;
+while ( $row = $sth->fetchrow_hashref ) {
+  $row->{calledstation} =~ s/^1//;
+  $row->{src} =~ s/^1//;
+  my $cdr = FS::cdr->new ({
+    uniqueid            => $row->{sessionid},
+    cdrbatchnum         => $cdrbatchnum,
+    startdate           => time2str($row->{starttime}),
+    enddate             => time2str($row->{stoptime}),
+    duration            => $row->{sessiontime},
+    billsec             => $row->{real_sessiontime},
+    dst                 => $row->{calledstation},
+    src                 => $row->{src},
+    upstream_rateplanid => $row->{id_tariffplan},
+    upstream_rateid     => $row->{id_ratecard}, # I think?
+    upstream_price      => $row->{sessionbill},
+  });
+  $cdr->cdrtypenum($opt{c}) if $opt{c};
+
+  my $error = $cdr->insert;
+  if($error) {
+    print "failed import: $error\n";
+  } else {
+    $imports++;
+    my $updated = $mysql->do(
+                    "UPDATE $table SET freesidestatus = 'done' WHERE id = ?",
+                    undef,
+                    $row->{'id'}
+                  );
+    $updates += $updated;
+    print "failed to set status: ".$mysql->errstr."\n" unless $updated;
+  }
+}
+print "Done.\nImported $imports CDRs, marked $updates as done in source database.\n";
+$mysql->disconnect;
+
+sub usage {
+  "Usage: 
+  cdr-a2billing.import
+      [ -H host ]
+      -D database
+      -U user
+      -P password
+      [ -s start ] [ -e end ] [ -c cdrtypenum ]
+      freesideuser
+";
+}

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

Summary of changes:
 bin/cdr-a2billing.import |  164 ++++++++++++++++++++++++++++++++++++++++++++++
 1 files changed, 164 insertions(+), 0 deletions(-)
 create mode 100755 bin/cdr-a2billing.import




More information about the freeside-commits mailing list