From 9f775eac8a4d3d308313cd22ae094d98fe9edf3f Mon Sep 17 00:00:00 2001 From: ivan Date: Thu, 22 Oct 2009 00:28:31 +0000 Subject: [PATCH] fix netsapiens CDR import, RT#5226 --- FS/FS/Schema.pm | 20 +++++++++++++++++++- bin/cdr-netsapiens.import | 32 ++++++++++++++++++++++---------- 2 files changed, 41 insertions(+), 11 deletions(-) diff --git a/FS/FS/Schema.pm b/FS/FS/Schema.pm index ba8dcdeae..cf3a88989 100644 --- a/FS/FS/Schema.pm +++ b/FS/FS/Schema.pm @@ -2149,6 +2149,8 @@ sub tables_hashref { ### # fields for unitel/RSLCOM/convergent that don't map well to asterisk # defaults + # though these are now used elsewhere: + # charged_party, upstream_price, rated_price, carrierid ### #cdr_type: Usage = 1, S&E = 7, OC&C = 8 @@ -2191,19 +2193,35 @@ sub tables_hashref { #NULL, done (or something) 'freesiderewritestatus', 'varchar', 'NULL', 32, '', '', + #an indexed place to put big numbers + 'cdrid', 'bigint', 'NULL', '', '', '', + + #i should become a table 'cdrbatch', 'varchar', 'NULL', 255, '', '', + #'cdrbatchnum', 'int', 'NULL', '', '', '', ], 'primary_key' => 'acctid', 'unique' => [], 'index' => [ [ 'calldate' ], [ 'src' ], [ 'dst' ], [ 'dcontext' ], [ 'charged_party' ], - [ 'accountcode' ], [ 'carrierid' ], + [ 'accountcode' ], [ 'carrierid' ], [ 'cdrid' ], [ 'freesidestatus' ], [ 'freesiderewritestatus' ], [ 'cdrbatch' ], ], }, + #'cdr_batch' => { + # 'columns' => [ + # 'cdrbatchnum', 'serial', '', '', '', '', + # 'cdrbatch', 'varchar', 'NULL', 255, '', '', + # '_date', @date_type, '', '', + # ], + # 'primary_key' => 'cdrbatchnum', + # 'unique' => [ [ 'cdrbatch' ] ], + # 'index' => [], + #}, + 'cdr_termination' => { 'columns' => [ 'cdrtermnum', 'bigserial', '', '', '', '', diff --git a/bin/cdr-netsapiens.import b/bin/cdr-netsapiens.import index b3ad5b2e7..8aa4ac0b7 100755 --- a/bin/cdr-netsapiens.import +++ b/bin/cdr-netsapiens.import @@ -11,7 +11,7 @@ use FS::Record qw(qsearchs); use FS::part_export; use FS::cdr; -$DEBUG = 2; +$DEBUG = 1; my $user = shift or die &usage; adminsuidsetup $user; @@ -31,8 +31,7 @@ do { or die dbh->errstr; $sth->execute or die $sth->errstr; - my $time_release = time2str('%Y-%m-%d %x', $sth->fetchrow_arrayref->[0]); - + my $time_release = time2str('%Y-%m-%d %X', $sth->fetchrow_arrayref->[0]); #retreive CDRs >= this time my $ns = $part_export->ns_command( 'GET', '/cdr/', @@ -49,11 +48,23 @@ do { #20090219201719000016@SkyNet360.Com #
while ( $content =~ - s/^.*?//is ) + s/^.*?//is ) { - my $accountcode = $1; - warn "$accountcode\n" if $DEBUG; + my $cdrid = ($1-1900). $2; #2009 -> 109 so we fit in a bigint + + unless ( $cdrs ) { #inefficient + my $dsth = dbh->prepare( + 'SELECT cdrid FROM cdr WHERE cdrid IS NOT NULL AND cdrid = ?' + ) or die dbh->errstr; + $dsth->execute($cdrid) or die $dsth->errstr; + my $row = $dsth->fetchrow_arrayref; + if ( $row && $row->[0] eq $cdrid ) { # == w/ 8 byte int? + warn "$cdrid (dup)\n" if $DEBUG > 1; + next; + } + } + warn "$cdrid\n" if $DEBUG > 1; $content =~ s/(.*?)<\/form>//is; my $cdr_content = $1; @@ -62,22 +73,23 @@ do { while ( $cdr_content =~ s/.*?//is ) { - warn " $1 => $2\n" if $DEBUG > 1; + warn " $1 => $2\n" if $DEBUG > 2; $cdr{$1} = $2; } $cdrs++; my $cdr = new FS::cdr { - 'src' => $cdr{'orig_sub'}, #orig_from_user? - 'dst' => $cdr{'term_sub'}, + 'src' => $cdr{'orig_from_user'}, #orig_sub + 'dst' => $cdr{'orig_to_user'}, #term_sub? 'startdate' => FS::cdr::_cdr_date_parse($cdr{'time_start'}), 'enddate' => FS::cdr::_cdr_date_parse($cdr{'time_release'}), 'duration' => $cdr{'duration'}, 'billsec' => $cdr{'time_talking'}, #'disposition' => - 'accountcode' => $accountcode, + #'accountcode' => #'charged_party' + 'cdrid' => $cdrid, 'cdrbatch' => $cdrbatch, }; -- 2.11.0