]> wagnertech.de Git - mfinanz.git/blobdiff - SL/Controller/CsvImport.pm
new_lastmtime um optionalen dbh erweitert
[mfinanz.git] / SL / Controller / CsvImport.pm
index e53917e01a282633c2de8c7937de494066d22302..3122037e1e1f533a3d0a731b17276b6573ab375b 100644 (file)
@@ -154,32 +154,32 @@ sub action_download_sample {
 sub action_report {
   my ($self, %params) = @_;
 
-  my $report_id = $params{report_id} || $::form->{id};
-
-  $self->{report}      = SL::DB::Manager::CsvImportReport->find_by(id => $report_id);
+  my $report_id   = $params{report_id} || $::form->{id};
+  $self->{report} = SL::DB::Manager::CsvImportReport->find_by(id => $report_id);
 
   if (!$self->{report}) {
     $::form->error(t8('No report with id #1', $report_id));
   }
-  my $num_rows         = $self->{report}->numrows;
-  my $num_cols         = SL::DB::Manager::CsvImportReportRow->get_all_count(query => [ csv_import_report_id => $report_id, row => 0 ]);
+
+  my $num_rows               = $self->{report}->numrows;
+  my $num_cols               = SL::DB::Manager::CsvImportReportRow->get_all_count(query => [ csv_import_report_id => $report_id, row => 0 ]);
 
   # manual paginating, yuck
-  my $page = $::form->{page} || 1;
-  my $pages = {};
-  $pages->{per_page}        = $::form->{per_page} || 20;
-  $pages->{max}             = SL::DB::Helper::Paginated::ceil($num_rows, $pages->{per_page}) || 1;
-  $pages->{page}             = $page < 1 ? 1
-                            : $page > $pages->{max} ? $pages->{max}
-                            : $page;
-  $pages->{common}          = [ grep { $_->{visible} } @{ SL::DB::Helper::Paginated::make_common_pages($pages->{page}, $pages->{max}) } ];
+  my $page                   = $::form->{page} || 1;
+  my $pages                  = {};
+  $pages->{per_page}         = $::form->{per_page} || 20;
+  $pages->{max}              = SL::DB::Helper::Paginated::ceil($num_rows, $pages->{per_page}) || 1;
+  $pages->{page}             = $page < 1             ? 1
+                             : $page > $pages->{max} ? $pages->{max}
+                             : $                       page;
+  $pages->{common}           = [ grep { $_->{visible} } @{ SL::DB::Helper::Paginated::make_common_pages($pages->{page}, $pages->{max}) } ];
 
   $self->{report_numheaders} = $self->{report}->numheaders;
-  my $first_row_header = 0;
-  my $last_row_header  = $self->{report_numheaders} - 1;
-  my $first_row_data   = $pages->{per_page} * ($pages->{page}-1) + $self->{report_numheaders};
-  my $last_row_data    = min($pages->{per_page} * $pages->{page}, $num_rows) + $self->{report_numheaders} - 1;
-  $self->{display_rows} = [
+  my $first_row_header       = 0;
+  my $last_row_header        = $self->{report_numheaders} - 1;
+  my $first_row_data         = $pages->{per_page} * ($pages->{page}-1) + $self->{report_numheaders};
+  my $last_row_data          = min($pages->{per_page} * $pages->{page}, $num_rows) + $self->{report_numheaders} - 1;
+  $self->{display_rows}      = [
     $first_row_header
       ..
     $last_row_header,
@@ -202,13 +202,13 @@ sub action_report {
     ]
   );
 
-  my $rows             = SL::DB::Manager::CsvImportReportRow->get_all(query => \@query);
-  my $status           = SL::DB::Manager::CsvImportReportStatus->get_all(query => \@query);
+  my $rows               = SL::DB::Manager::CsvImportReportRow   ->get_all(query => \@query);
+  my $status             = SL::DB::Manager::CsvImportReportStatus->get_all(query => \@query);
 
   $self->{report_rows}   = $self->{report}->folded_rows(rows => $rows);
   $self->{report_status} = $self->{report}->folded_status(status => $status);
-  $self->{pages} = $pages;
-  $self->{base_url} = $self->url_for(action => 'report', id => $report_id, no_layout => $params{no_layout} || $::form->{no_layout} );
+  $self->{pages}         = $pages;
+  $self->{base_url}      = $self->url_for(action => 'report', id => $report_id, no_layout => $params{no_layout} || $::form->{no_layout} );
 
   $self->render('csv_import/report', { layout => !($params{no_layout} || $::form->{no_layout}) });
 }
@@ -239,19 +239,13 @@ sub action_add_mapping_from_upload {
     return;
   }
 
-  my $csv = Text::CSV_XS->new({
-    binary      => 1,
-    sep_char    => $self->profile->get('sep_char'),
-    quote_char  => $self->profile->get('quote_char'),
-    escape_char => $self->profile->get('escape_char'),
-  });
+  my $csv = SL::Helper::Csv->new(
+    file => $file->file_name,
+    map { $_ => $self->profile->get($_) } qw(sep_char escape_char quote_char),
+  );
 
-  my $header = $csv->getline($file->fh) or do {
-    $self->js
-      ->flash('error', t8('No header found'))
-      ->render;
-    return;
-  };
+  $csv->_open_file;
+  my $header = $csv->check_header;
 
   for my $field (@$header) {
     next if $self->mappings_for_profile->{$field};
@@ -516,6 +510,7 @@ sub save_report_single {
     file       => '',
     numrows    => scalar @{ $self->data },
     numheaders => 1,
+    test_mode  => $params{test} ? 1 : 0,
   );
 
   $report->save(cascade => 1) or die $report->db->error;
@@ -586,6 +581,7 @@ sub save_report_multi {
     file       => '',
     numrows    => scalar @{ $self->data },
     numheaders => scalar @{ $self->worker->profile },
+    test_mode  => $params{test} ? 1 : 0,
   );
 
   $report->save(cascade => 1) or die $report->db->error;
@@ -726,7 +722,7 @@ sub mappings_for_profile {
 }
 
 sub init_mappings {
-  $::form->{mappings} || []
+  [ grep { $_->{from} } @{ $::form->{mappings} || [] } ]
 }
 
 1;