[freeside-commits] branch master updated. 0c66f548fe3c1a2e880c6672ff28a5c2da353057
Jonathan Prykop
jonathan at 420.am
Tue Dec 1 18:14:00 PST 2015
The branch, master has been updated
via 0c66f548fe3c1a2e880c6672ff28a5c2da353057 (commit)
from 1d9bee7e321b4ec2db3250af5f4d9240725b1974 (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 0c66f548fe3c1a2e880c6672ff28a5c2da353057
Author: Jonathan Prykop <jonathan at freeside.biz>
Date: Tue Dec 1 02:27:19 2015 -0600
RT37901: Galactic Telecom CDRs [need to finish field mapping
diff --git a/FS/bin/freeside-cdr-portaone-import b/FS/bin/freeside-cdr-portaone-import
new file mode 100644
index 0000000..be2555b
--- /dev/null
+++ b/FS/bin/freeside-cdr-portaone-import
@@ -0,0 +1,186 @@
+#!/usr/bin/perl
+
+use strict;
+
+use Date::Format 'time2str';
+use Date::Parse 'str2time';
+use Getopt::Long;
+use JSON;
+use Net::HTTPS::Any qw(https_post);
+
+use FS::Record qw(qsearchs dbh);
+use FS::UID qw(adminsuidsetup);
+
+sub usage {
+ "Usage:
+freeside-cdr-portaone-import -h 'your.domain.com:443' -u switchusername -p switchpass
+ [-s startdate] [-e enddate] [-v] freesideuser
+";
+}
+
+my ($host,$username,$password,$startdate,$enddate,$verbose);
+GetOptions(
+ "enddate=s" => \$enddate,
+ "host=s" => \$host,
+ "password=s" => \$password,
+ "startdate=s" => \$startdate,
+ "username=s" => \$username,
+ "verbose" => \$verbose,
+);
+
+my $fsuser = $ARGV[-1];
+
+die usage() unless $host && $password && $username && $fsuser;
+
+adminsuidsetup($fsuser);
+
+my $port = 443;
+if ($host =~ /^(.*)\:(.*)$/) {
+ $host = $1;
+ $port = $2;
+}
+
+if ($startdate) {
+ $startdate = str2time($startdate) or die "Can't parse startdate $startdate";
+ $startdate = time2str("%Y-%m-%d %H:%M:%S",$startdate);
+}
+unless ($startdate) {
+ my $lastbatch = qsearchs({
+ 'table' => 'cdr_batch',
+ 'hashref' => { 'cdrbatch' => {op=>'like', value=>'portaone-import%'}},
+ 'order_by' => 'ORDER BY _date DESC LIMIT 1',
+ });
+ $startdate = time2str("%Y-%m-%d %H:%M:%S", $lastbatch->_date + 1) if $lastbatch;
+}
+$startdate ||= '2010-01-01 00:00:00'; #seems decently in the past
+
+my $now = time;
+if ($enddate) {
+ $enddate = str2time($enddate) or die "Can't parse enddate $enddate";
+ $now = $enddate;
+ $enddate = time2str("%Y-%m-%d %H:%M:%S",$enddate);
+}
+$enddate ||= time2str("%Y-%m-%d %H:%M:%S",$now);
+
+print "Downloading records from $startdate to $enddate\n" if $verbose;
+
+my $auth_info; # needs to be declared undef for call_api
+$auth_info = call_api('Session','login',{
+ 'login' => $username,
+ 'password' => $password,
+});
+
+my $results = {};
+my $custlist = call_api('Customer','get_customer_list');
+my @custnum = map { $_->{'i_customer'} } @{$custlist->{'customer_list'}};
+foreach my $custnum (@custnum) {
+ print "Processing customer $custnum\n" if $verbose;
+ my $xdrs = call_api('Customer','get_customer_xdrs',{
+ 'i_customer' => $custnum,
+ 'from_date' => $startdate,
+ 'to_date' => $enddate,
+ 'cdr_entity' => 'C', # can also be 'A', or blank for both
+ });
+ my @xdrs = @{$xdrs->{'xdr_list'}};
+ print scalar(@xdrs) . " xdrs retrieved\n" if $verbose;
+ $results->{$custnum} = \@xdrs;
+}
+
+call_api('Session','logout',$auth_info);
+
+$FS::UID::AutoCommit = 0;
+
+my $cdr_batch = new FS::cdr_batch({
+ 'cdrbatch' => 'portaone-import-'. time2str('%Y/%m/%d-%T',$now),
+ '_date' => $now,
+});
+my $error = $cdr_batch->insert;
+if ($error) {
+ dbh->rollback;
+ die "Error inserting batch: $error";
+}
+
+foreach my $custnum (keys %$results) {
+ foreach my $xdr (@{$results->{$custnum}}) {
+ my $cdr = FS::cdr->new ({
+ 'cdrbatchnum' => $cdr_batch->cdrbatchnum,
+ 'acctid' => $xdr->{'i_xdr'}, #???
+ 'accountcode' => $xdr->{'account_id'}, #???
+ 'startdate' => $xdr->{'unix_connect_time'},
+ 'enddate' => $xdr->{'unix_disconnect_time'},
+
+### XXX NEED TO MAP FIELDS:
+#i_xdr int The unique ID of the xdr record
+#account_id int The unique ID of the account database record
+#CLI string Calling Line Identification
+#CLD string Called Line Identification
+#charged_amount float Amount charged
+#charged_quantity int Units charged
+#country string Country
+#subdivision string Country subdivision
+#description string Destination description
+#disconnect_cause string The code of disconnect cause
+#bill_status string Call bill status
+#disconnect_reason string Call disconnect reason
+#connect_time dateTime Call connect time
+#unix_connect_time int Call connect time (expressed in Unix time format - seconds since epoch)
+#disconnect_time dateTime Call disconnect time
+#unix_disconnect_time int Call disconnect time i_xdr int The unique ID of the xdr record
+#account_id int The unique ID of the account database record
+#CLI string Calling Line Identification
+#CLD string Called Line Identification
+#charged_amount float Amount charged
+#charged_quantity int Units charged
+#country string Country
+#subdivision string Country subdivision
+#description string Destination description
+#disconnect_cause string The code of disconnect cause
+#bill_status string Call bill status
+#disconnect_reason string Call disconnect reason
+#connect_time dateTime Call connect time
+#unix_connect_time int Call connect time (expressed in Unix time format - seconds since epoch)
+#disconnect_time dateTime Call disconnect time
+#unix_disconnect_time int Call disconnect time (expressed in Unix time format - seconds since epoch)
+#bill_time dateTime Call bill time
+#bit_flags int Extended information how the service was used; the integer field that should be treated as a bit-map. Each currently used bit is listed in the Transaction_Flag_Types table (bit_offset indicates position)
+#call_recording_url string Path to recorded .wav files
+#call_recording_server_url string URL to the recording server (expressed in Unix time format - seconds since epoch)
+#bill_time dateTime Call bill time
+#bit_flags int Extended information how the service was used; the integer field that should be treated as a bit-map. Each currently used bit is listed in the Transaction_Flag_Types table (bit_offset indicates position)
+#call_recording_url string Path to recorded .wav files
+#call_recording_server_url string URL to the recording server
+
+ });
+ $error = $cdr->insert;
+ if ($error) {
+ dbh->rollback;
+ die "Error inserting cdr: $error";
+ }
+ } #foreach $xdr
+} #foreach $custnum
+
+dbh->commit;
+
+exit;
+
+sub call_api {
+ my ($service,$method,$params) = @_;
+ my %auth_info = $auth_info ? ('auth_info' => encode_json($auth_info)) : ();
+ $params ||= {};
+ print "Calling $service/$method...\n" if $verbose;
+ my ( $page, $response, %reply_headers ) = https_post(
+ 'host' => $host,
+ 'port' => $port,
+ 'path' => '/rest/'.$service.'/'.$method.'/',
+ 'args' => [ %auth_info, 'params' => encode_json($params) ],
+ );
+ return decode_json($page) if $response eq '200 OK';
+ if ($response =~ /^500/) {
+ my $error = decode_json($page);
+ die "Server returned error during $service/$method: ".$error->{'faultstring'}
+ if $error->{'faultcode'};
+ }
+ die "Bad response from server during $service/$method: $response";
+}
+
+
-----------------------------------------------------------------------
Summary of changes:
FS/bin/freeside-cdr-portaone-import | 186 +++++++++++++++++++++++++++++++++++
1 file changed, 186 insertions(+)
create mode 100644 FS/bin/freeside-cdr-portaone-import
More information about the freeside-commits
mailing list