summaryrefslogtreecommitdiff
path: root/FS
diff options
context:
space:
mode:
authormark <mark>2010-11-25 01:06:29 +0000
committermark <mark>2010-11-25 01:06:29 +0000
commit39289cd1e5a06044aa9a8dc3d2e4d8c9ffb02b11 (patch)
tree305c995e91e8549820ef00c3aef16a0bed644495 /FS
parent54f3136cfa1230e9a80641c7477ed75c0910d48a (diff)
Telos XML CDR format, RT#10721
Diffstat (limited to 'FS')
-rw-r--r--FS/FS/Record.pm38
-rw-r--r--FS/FS/cdr.pm9
-rw-r--r--FS/FS/cdr/telos_xml.pm36
3 files changed, 78 insertions, 5 deletions
diff --git a/FS/FS/Record.pm b/FS/FS/Record.pm
index 92f503f42..16520f409 100644
--- a/FS/FS/Record.pm
+++ b/FS/FS/Record.pm
@@ -1581,6 +1581,7 @@ sub process_batch_import {
format_headers => $opt->{format_headers},
format_sep_chars => $opt->{format_sep_chars},
format_fixedlength_formats => $opt->{format_fixedlength_formats},
+ format_xml_formats => $opt->{format_xml_formats},
format_row_callbacks => $opt->{format_row_callbacks},
#per-import
job => $job,
@@ -1640,7 +1641,7 @@ FS::queue object, will be updated with progress
=item type
-csv, xls or fixedlength
+csv, xls, fixedlength, xml
=item empty_ok
@@ -1660,7 +1661,8 @@ sub batch_import {
my $file = $param->{file};
my $params = $param->{params} || {};
- my( $type, $header, $sep_char, $fixedlength_format, $row_callback, @fields );
+ my( $type, $header, $sep_char, $fixedlength_format,
+ $xml_format, $row_callback, @fields );
my $postinsert_callback = '';
if ( $param->{'format'} ) {
@@ -1686,6 +1688,11 @@ sub batch_import {
? $param->{'format_fixedlength_formats'}{ $param->{'format'} }
: '';
+ $xml_format =
+ $param->{'format_xml_formats'}
+ ? $param->{'format_xml_formats'}{ $param->{'format'} }
+ : '';
+
$row_callback =
$param->{'format_row_callbacks'}
? $param->{'format_row_callbacks'}{ $param->{'format'} }
@@ -1741,8 +1748,9 @@ sub batch_import {
eval "use Parse::FixedLength;";
die $@ if $@;
$parser = new Parse::FixedLength $fixedlength_format;
-
- } else {
+
+ }
+ else {
die "Unknown file type $type\n";
}
@@ -1768,7 +1776,22 @@ sub batch_import {
$count++;
$row = $header || 0;
-
+ } elsif ( $type eq 'xml' ) {
+ # FS::pay_batch
+ eval "use XML::Simple;";
+ die $@ if $@;
+ my $xmlrow = $xml_format->{'xmlrow'};
+ $parser = $xml_format->{'xmlkeys'};
+ die 'no xmlkeys specified' unless ref $parser eq 'ARRAY';
+ my $data = XML::Simple::XMLin(
+ $file,
+ 'SuppressEmpty' => '', #sets empty values to ''
+ 'KeepRoot' => 1,
+ );
+ my $rows = $data;
+ $rows = $rows->{$_} foreach @$xmlrow;
+ $rows = [ $rows ] if ref($rows) ne 'ARRAY';
+ $count = @buffer = @$rows;
} else {
die "Unknown file type $type\n";
}
@@ -1842,6 +1865,11 @@ sub batch_import {
#my $z = 'A';
#warn $z++. ": $_\n" for @columns;
+ } elsif ( $type eq 'xml' ) {
+ # $parser = [ 'Column0Key', 'Column1Key' ... ]
+ last unless scalar(@buffer);
+ my $row = shift @buffer;
+ @columns = @{ $row }{ @$parser };
} else {
die "Unknown file type $type\n";
}
diff --git a/FS/FS/cdr.pm b/FS/FS/cdr.pm
index 8f6a43c60..f7402eead 100644
--- a/FS/FS/cdr.pm
+++ b/FS/FS/cdr.pm
@@ -788,6 +788,10 @@ sub _cdr_date_parse {
} elsif ( $date =~ /^\s*(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})$/ ) {
# WIP: 20100329121420
($year, $mon, $day, $hour, $min, $sec) = ( $1, $2, $3, $4, $5, $6 );
+ } elsif ( $date =~ /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2})Z$/) {
+ # Telos
+ ($year, $mon, $day, $hour, $min, $sec) = ( $1, $2, $3, $4, $5, $6 );
+ $options{gmt} = 1;
} else {
die "unparsable date: $date"; #maybe we shouldn't die...
}
@@ -855,6 +859,11 @@ my %import_options = (
keys %cdr_info
},
+ 'format_xml_formats' =>
+ { map { $_ => $cdr_info{$_}->{'xml_format'}; }
+ keys %cdr_info
+ },
+
'format_row_callbacks' => { map { $_ => $cdr_info{$_}->{'row_callback'}; }
keys %cdr_info
},
diff --git a/FS/FS/cdr/telos_xml.pm b/FS/FS/cdr/telos_xml.pm
new file mode 100644
index 000000000..a144f0ba4
--- /dev/null
+++ b/FS/FS/cdr/telos_xml.pm
@@ -0,0 +1,36 @@
+package FS::cdr::telos_xml;
+
+use strict;
+use vars qw( @ISA %info );
+use FS::cdr qw(_cdr_date_parser_maker);
+
+@ISA = qw(FS::cdr);
+
+%info = (
+ 'name' => 'Telos (XML)',
+ 'weight' => 530,
+ 'type' => 'xml',
+ 'xml_format' => {
+ 'xmlrow' => [ 'Telos_CDRS', 'CDRecord' ],
+ 'xmlkeys' => [ qw(
+ seq_num
+ a_party_num
+ b_party_num
+ seize
+ answer
+ disc
+ ) ],
+ },
+
+ 'import_fields' => [
+ 'uniqueid',
+ 'src',
+ 'dst', # usually empty for some reason
+ _cdr_date_parser_maker('startdate'),
+ _cdr_date_parser_maker('answerdate'),
+ _cdr_date_parser_maker('enddate'),
+ ],
+
+);
+
+1;