From 39289cd1e5a06044aa9a8dc3d2e4d8c9ffb02b11 Mon Sep 17 00:00:00 2001 From: mark Date: Thu, 25 Nov 2010 01:06:29 +0000 Subject: [PATCH] Telos XML CDR format, RT#10721 --- FS/FS/Record.pm | 38 +++++++++++++++++++++++++++++++++----- FS/FS/cdr.pm | 9 +++++++++ FS/FS/cdr/telos_xml.pm | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 FS/FS/cdr/telos_xml.pm 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; -- 2.11.0