summaryrefslogtreecommitdiff
path: root/FS/FS
diff options
context:
space:
mode:
authorlevinse <levinse>2011-06-09 22:11:04 +0000
committerlevinse <levinse>2011-06-09 22:11:04 +0000
commit7f4e4fddb595f5c825a18c88ed79029160650dc9 (patch)
treee0ad5e02d1916aa3c1f0165725fd4ec1a9e9c1fc /FS/FS
parentfdc247b504359ca9e74f63daa771f49393fd70ed (diff)
SMSC CDRs (Kannel) and cdrtypenum option on cdr sftp import script, RT10991
Diffstat (limited to 'FS/FS')
-rw-r--r--FS/FS/Record.pm4
-rw-r--r--FS/FS/cdr.pm8
-rw-r--r--FS/FS/cdr/kannel.pm43
3 files changed, 54 insertions, 1 deletions
diff --git a/FS/FS/Record.pm b/FS/FS/Record.pm
index e7440feb5..ffeabcb17 100644
--- a/FS/FS/Record.pm
+++ b/FS/FS/Record.pm
@@ -1853,10 +1853,12 @@ sub batch_import {
next if $line =~ /^\s*$/; #skip empty lines
$line = &{$row_callback}($line) if $row_callback;
+
+ next if $line =~ /^\s*$/; #skip empty lines
$parser->parse($line) or do {
$dbh->rollback if $oldAutoCommit;
- return "can't parse: ". $parser->error_input();
+ return "can't parse: ". $parser->error_input() . " " . $parser->error_diag;
};
@columns = $parser->fields();
diff --git a/FS/FS/cdr.pm b/FS/FS/cdr.pm
index e7b6e6cd3..36721a81a 100644
--- a/FS/FS/cdr.pm
+++ b/FS/FS/cdr.pm
@@ -948,6 +948,14 @@ sub batch_import {
my $iopt = _import_options;
$opt->{$_} = $iopt->{$_} foreach keys %$iopt;
+ if ( defined $opt->{'cdrtypenum'} ) {
+ $opt->{'preinsert_callback'} = sub {
+ my($record,$param) = (shift,shift);
+ $record->cdrtypenum($opt->{'cdrtypenum'});
+ '';
+ };
+ }
+
FS::Record::batch_import( $opt );
}
diff --git a/FS/FS/cdr/kannel.pm b/FS/FS/cdr/kannel.pm
new file mode 100644
index 000000000..3e2e5653a
--- /dev/null
+++ b/FS/FS/cdr/kannel.pm
@@ -0,0 +1,43 @@
+package FS::cdr::kannel;
+
+use strict;
+use vars qw( @ISA %info );
+use FS::cdr qw( _cdr_date_parser_maker );
+
+@ISA = qw(FS::cdr);
+
+%info = (
+ 'name' => 'Kannel',
+ 'weight' => 25,
+ 'header' => 1,
+ 'type' => 'csv',
+ 'row_callback' => sub { my $row = shift;
+ return ' ' if $row =~ /.*Log (begins|ends)$/;
+ die "invalid row format" unless
+ $row =~ /^(\d{4}-\d{2}-\d{2} \d{2}:\d{2}:\d{2}) ([A-Za-z ]+) (\[SMSC:\w+\] \[SVC:\w*\] \[ACT:\w*\] \[BINF:\w*\] \[FID:\w*\]) \[from:(|\+)(\d+)\] \[to:(|\+)(\d+)\] (\[flags:.*?\]) \[msg:(\d+):(.*?)\] (\[udh:.*?\])$/;
+ $row = "$1,$2,$3,$5,$7,$8,$9,$11";
+ $row;
+ },
+ 'import_fields' => [
+ _cdr_date_parser_maker('startdate'),
+ 'disposition',
+ 'userfield', # [SMSC: ... FID...], five fields
+ 'src',
+ 'dst',
+
+ sub { my($cdr, $flags) = @_;
+ $cdr->userfield($cdr->userfield." $flags");
+ },
+
+ # setting billsec to the msg length as we need billsec set non-zero
+ 'billsec',
+
+ sub { my($cdr, $udh) = @_;
+ $cdr->userfield($cdr->userfield." $udh");
+ },
+ ],
+);
+
+sub skip { map {''} (1..$_[0]) }
+
+1;