From aadc07f765a7cdb6bc00cf89089c7e147b58d6f1 Mon Sep 17 00:00:00 2001 From: Christopher Burger Date: Mon, 26 Jun 2017 14:36:21 -0400 Subject: [PATCH] RT# 75680 - created cdr batch import for telapi --- FS/FS/cdr/telapi_sms.pm | 44 +++++++++++++++++++++++ FS/FS/cdr/telapi_voip.pm | 50 ++++++++++++++++++++++++++ FS/bin/freeside-cdr-telapi-import | 75 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 169 insertions(+) create mode 100644 FS/FS/cdr/telapi_sms.pm create mode 100644 FS/FS/cdr/telapi_voip.pm create mode 100755 FS/bin/freeside-cdr-telapi-import diff --git a/FS/FS/cdr/telapi_sms.pm b/FS/FS/cdr/telapi_sms.pm new file mode 100644 index 000000000..28c4c4b01 --- /dev/null +++ b/FS/FS/cdr/telapi_sms.pm @@ -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 index 000000000..65aed7666 --- /dev/null +++ b/FS/FS/cdr/telapi_voip.pm @@ -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 index 000000000..4a637f57f --- /dev/null +++ b/FS/bin/freeside-cdr-telapi-import @@ -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 -- 2.11.0