RT# 75680 - created cdr batch import for telapi
authorChristopher Burger <burgerc@freeside.biz>
Mon, 26 Jun 2017 18:36:21 +0000 (14:36 -0400)
committerChristopher Burger <burgerc@freeside.biz>
Mon, 26 Jun 2017 18:36:21 +0000 (14:36 -0400)
FS/FS/cdr/telapi_sms.pm [new file with mode: 0644]
FS/FS/cdr/telapi_voip.pm [new file with mode: 0644]
FS/bin/freeside-cdr-telapi-import [new file with mode: 0755]

diff --git a/FS/FS/cdr/telapi_sms.pm b/FS/FS/cdr/telapi_sms.pm
new file mode 100644 (file)
index 0000000..28c4c4b
--- /dev/null
@@ -0,0 +1,44 @@
+package FS::cdr::telapi_sms;
+use base qw( FS::cdr );
+
+use strict;
+use vars qw( @ISA %info $CDR_TYPES );
+use FS::Record qw( qsearch );
+use FS::cdr qw( _cdr_date_parser_maker _cdr_min_parser_maker );
+
+%info = (
+  'name'          => 'telapi_sms',
+  'weight'        => 601,
+  'header'        => 1,
+  'type'          => 'csv',
+  'import_fields' => [
+    _cdr_date_parser_maker('startdate'),  # date gmt
+    'src',                                # source
+    'dst',                                # destination
+    'clid',                               # direction
+    sub {
+      my($cdr, $cdrtypename, $conf, $param) = @_;
+      return unless length($cdrtypename);
+      _init_cdr_types();
+      die "no matching cdrtypenum for $cdrtypename"
+        unless defined $CDR_TYPES->{$cdrtypename};
+      $cdr->cdrtypenum($CDR_TYPES->{$cdrtypename});
+    },                                    # type
+    skip(1),                              # cost
+  ],
+);
+
+sub skip { map {''} (1..$_[0]) }
+
+sub _init_cdr_types {
+  unless ($CDR_TYPES) {
+    $CDR_TYPES = {};
+    foreach my $cdr_type ( qsearch('cdr_type') ) {
+      die "multiple cdr_types with same cdrtypename".$cdr_type->cdrtypename
+        if defined $CDR_TYPES->{$cdr_type->cdrtypename};
+      $CDR_TYPES->{$cdr_type->cdrtypename} = $cdr_type->cdrtypenum;
+    }
+  }
+}
+
+1;
\ No newline at end of file
diff --git a/FS/FS/cdr/telapi_voip.pm b/FS/FS/cdr/telapi_voip.pm
new file mode 100644 (file)
index 0000000..65aed76
--- /dev/null
@@ -0,0 +1,50 @@
+package FS::cdr::telapi_voip;
+use base qw( FS::cdr );
+
+use strict;
+use vars qw( @ISA %info $CDR_TYPES );
+use FS::Record qw( qsearch );
+use FS::cdr qw( _cdr_date_parser_maker _cdr_min_parser_maker );
+
+%info = (
+  'name'          => 'telapi_voip',
+  'weight'        => 601,
+  'header'        => 1,
+  'type'          => 'csv',
+  'import_fields' => [
+    _cdr_date_parser_maker('startdate'),  #'date gmt'
+    'src',                                # source
+    'dst',                                # destination
+    'clid',                               # callerid
+    skip(1),                              # hangup code
+    skip(1),                              # sip account
+    'src_ip_addr',                        # orig ip
+    'duration',                           # duration
+    skip(1),                              # per minute
+    'upstream_price',                     # callcost
+    sub {
+      my($cdr, $cdrtypename, $conf, $param) = @_;
+      return unless length($cdrtypename);
+      _init_cdr_types();
+      die "no matching cdrtypenum for $cdrtypename"
+        unless defined $CDR_TYPES->{$cdrtypename};
+      $cdr->cdrtypenum($CDR_TYPES->{$cdrtypename});
+    },                                   # type 
+    _cdr_min_parser_maker('billsec'),     #PriceDurationMins
+  ],
+);
+
+sub skip { map {''} (1..$_[0]) }
+
+sub _init_cdr_types {
+  unless ($CDR_TYPES) {
+    $CDR_TYPES = {};
+    foreach my $cdr_type ( qsearch('cdr_type') ) {
+      die "multiple cdr_types with same cdrtypename".$cdr_type->cdrtypename
+        if defined $CDR_TYPES->{$cdr_type->cdrtypename};
+      $CDR_TYPES->{$cdr_type->cdrtypename} = $cdr_type->cdrtypenum;
+    }
+  }
+}
+
+1;
\ No newline at end of file
diff --git a/FS/bin/freeside-cdr-telapi-import b/FS/bin/freeside-cdr-telapi-import
new file mode 100755 (executable)
index 0000000..4a637f5
--- /dev/null
@@ -0,0 +1,75 @@
+#!/usr/bin/perl
+
+use strict;
+
+use Date::Format 'time2str';
+use Date::Parse 'str2time';
+use Getopt::Long;
+use Cpanel::JSON::XS;
+use Net::HTTPS::Any qw(https_post https_get);
+use Time::Local;
+
+use FS::Record qw(qsearchs dbh);
+use FS::UID qw(adminsuidsetup);
+use FS::cdr;
+use FS::cdr_batch;
+
+my $host = "cdr.teleapi.net";
+
+my @now = localtime();
+my $now = timelocal($now[0],$now[1],$now[2],$now[3],$now[4],$now[5]); #most recent midnight
+
+sub usage {
+  "Usage:
+freeside-cdr-telapi-import -t type -p token -s startdate [-e enddate] freesideuser
+
+Downloads any existing CDR voip files or CDR SMS files (type) from the start date untill the enddate and 
+imports those records.";
+}
+
+my ($type,$token,$startdate,$enddate);
+GetOptions(
+  "type=s"      => \$type,
+  "token=s"     => \$token,
+  "startdate=s" => \$startdate,
+  "enddate=s"   => \$enddate,
+);
+
+my $fsuser = $ARGV[-1];
+
+die usage() unless $fsuser;
+
+adminsuidsetup($fsuser);
+
+my ( $page, $response, %reply_headers )= https_get(
+      'host' => $host,
+      'port' => '443',
+      'path' => '/'.$type.'/'.$startdate.'/'.$enddate.'?token='.$token,
+    );
+
+die "Bad response from telapi server: $response"
+  unless $response =~ /^200/;
+
+my $cdrbatch = "Telapi-import-" . $type . "-" . time2str('%Y/%m/%d-%T',$now);  
+
+my $dir = $FS::UID::cache_dir. "/cache.". $FS::UID::datasrc; 
+
+my $cfh = new File::Temp( TEMPLATE => 'telapi.XXXXXXXX',
+                          SUFFIX   => '.csv',
+                          DIR      => $dir,
+                         )
+    or die "can't open temporary file to save data: $!\n";
+
+#print returned data to file handle for temp file.
+print $cfh $page;
+
+seek($cfh,0,0);
+
+  print "Importing batch $cdrbatch\n";
+  my $error = FS::cdr::batch_import({
+    'batch_namevalue' => $cdrbatch,
+    'file'            => $cfh->filename,
+    'format'          => 'telapi_'.$type
+  });
+
+exit;
\ No newline at end of file