Merge branch 'b-3.6.1' of ../kivitendo-erp_20220811
[kivitendo-erp.git] / SL / Helper / Csv / Dispatcher.pm
index 3a725b5..801e822 100644 (file)
@@ -99,8 +99,8 @@ sub apply {
 }
 
 sub is_known {
-  my ($self, $col) = @_;
-  return grep { $col eq $_->{key} } $self->_specs;
+  my ($self, $col, $row) = @_;
+  return grep { $col eq $_->{key} } @{ $self->_specs->[$row // 0] };
 }
 
 sub parse_profile {
@@ -113,6 +113,7 @@ sub parse_profile {
   my $i = 0;
   foreach my $header (@{ $h_aref }) {
     my $spec = $self->_parse_profile(profile => $csv_profile->[$i]->{profile},
+                                     mapping => $csv_profile->[$i]->{mapping},
                                      class   => $csv_profile->[$i]->{class},
                                      header  => $header);
     push @specs, $spec;
@@ -129,23 +130,24 @@ sub parse_profile {
 sub _parse_profile {
   my ($self, %params) = @_;
 
-  my $profile = $params{profile};
+  my $profile = $params{profile} // {};
   my $class   = $params{class};
   my $header  = $params{header};
+  my $mapping = $params{mapping};
 
   my @specs;
 
   for my $col (@$header) {
     next unless $col;
-    if ($self->_csv->strict_profile) {
-      if (exists $profile->{$col}) {
-        push @specs, $self->make_spec($col, $profile->{$col}, $class);
-      } else {
-        $self->unknown_column($col, undef);
-      }
+    if (exists $mapping->{$col} && $profile->{$mapping->{$col}}) {
+      push @specs, $self->make_spec($col, $profile->{$mapping->{$col}}, $class);
+    } elsif (exists $mapping->{$col} && !%{ $profile }) {
+      push @specs, $self->make_spec($col, $mapping->{$col}, $class);
+    } elsif (exists $profile->{$col}) {
+      push @specs, $self->make_spec($col, $profile->{$col}, $class);
     } else {
-      if (exists $profile->{$col}) {
-        push @specs, $self->make_spec($col, $profile->{$col}, $class);
+      if ($self->_csv->strict_profile) {
+        $self->unknown_column($col, undef);
       } else {
         push @specs, $self->make_spec($col, $col, $class);
       }
@@ -158,7 +160,7 @@ sub _parse_profile {
 sub make_spec {
   my ($self, $col, $path, $cur_class) = @_;
 
-  my $spec = { key => $col, steps => [] };
+  my $spec = { key => $col, path => $path, steps => [] };
 
   return unless $path;