diff options
| -rw-r--r-- | FS/FS/Record.pm | 38 | ||||
| -rw-r--r-- | FS/FS/cdr.pm | 9 | ||||
| -rw-r--r-- | FS/FS/cdr/telos_xml.pm | 36 | 
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;  | 
