X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FHelper%2FCsv%2FDispatcher.pm;h=3a725b5a0fc3d056793d57aec5c028061d07b3c8;hb=504db13fd9becf571a4bfce548342e2d6deefb19;hp=17d52d75103215641551b6f1df608b431b3e2a30;hpb=af2053931fb484b246ba42f93df4889c4257ab42;p=kivitendo-erp.git diff --git a/SL/Helper/Csv/Dispatcher.pm b/SL/Helper/Csv/Dispatcher.pm index 17d52d751..3a725b5a0 100644 --- a/SL/Helper/Csv/Dispatcher.pm +++ b/SL/Helper/Csv/Dispatcher.pm @@ -5,8 +5,9 @@ use strict; use Data::Dumper; use Carp; use Scalar::Util qw(weaken); +use List::MoreUtils qw(all pairwise); use Rose::Object::MakeMethods::Generic scalar => [ qw( - _specs _errors + _specs _row_class _row_spec _errors ) ]; use SL::Helper::Csv::Error; @@ -38,48 +39,34 @@ sub dispatch { return $obj; } -# return class for given line -# if only one profile is given, return this profiles class -# if more than one profile is given, identify class by first -# column??? sub _class_by_line { my ($self, $line) = @_; - my $class; + # initialize lookup hash if not already done + if ($self->_csv->is_multiplexed && ! defined $self->_row_class ) { + $self->_row_class({ map { $_->{row_ident} => $_->{class} } @{ $self->_csv->profile } }); + } + if ($self->_csv->is_multiplexed) { - foreach my $p (@{ $self->_csv->profile }) { - my $row_ident = $p->{row_ident}; - if ($line->{datatype} eq $row_ident) { - $class = $p->{class}; - last; - } - } + return $self->_row_class->{$line->{datatype}}; } else { - $class = @{ $self->_csv->profile }[0]->{class}; + return $self->_csv->profile->[0]->{class}; } - - return $class; } sub _specs_by_line { my ($self, $line) = @_; - my $spec; - my $i = 0; + # initialize lookup hash if not already done + if ($self->_csv->is_multiplexed && ! defined $self->_row_spec ) { + $self->_row_spec({ pairwise { no warnings 'once'; $a->{row_ident} => $b } @{ $self->_csv->profile }, @{ $self->_specs } }); + } + if ($self->_csv->is_multiplexed) { - foreach my $p (@{ $self->_csv->profile }) { - my $row_ident = $p->{row_ident}; - if ($line->{datatype} eq $row_ident) { - $spec = @{ $self->_specs }[$i]; - last; - } - $i++; - } + return $self->_row_spec->{$line->{datatype}}; } else { - $spec = @{ $self->_specs }[0]; + return $self->_specs->[0]; } - - return $spec; } @@ -119,21 +106,14 @@ sub is_known { sub parse_profile { my ($self, %params) = @_; - my $profile; - my $class; - my $header; my @specs; + my $csv_profile = $self->_csv->profile; + my $h_aref = ($self->_csv->is_multiplexed)? $self->_csv->header : [ $self->_csv->header ]; my $i = 0; - foreach my $h (@{ $self->_csv->header }) { - $header = $h; - if ($self->_csv->profile) { - $profile = @{ $self->_csv->profile }[$i]->{profile}; - $class = @{ $self->_csv->profile }[$i]->{class}; - } - - my $spec = $self->_parse_profile(profile => $profile, - class => $class, + foreach my $header (@{ $h_aref }) { + my $spec = $self->_parse_profile(profile => $csv_profile->[$i]->{profile}, + class => $csv_profile->[$i]->{class}, header => $header); push @specs, $spec; $i++; @@ -141,6 +121,8 @@ sub parse_profile { $self->_specs(\@specs); + $self->_csv->_push_error($self->errors); + return ! $self->errors; } @@ -170,8 +152,6 @@ sub _parse_profile { } } - $self->_csv->_push_error($self->errors); - return \@specs; }