use SL::Controller::CsvImport::Part;
use SL::Controller::CsvImport::Shipto;
use SL::Controller::CsvImport::Project;
+use SL::BackgroundJob::CsvImport;
+use SL::System::TaskServer;
use List::MoreUtils qw(none);
(
scalar => [ qw(type profile file all_profiles all_charsets sep_char all_sep_chars quote_char all_quote_chars escape_char all_escape_chars all_buchungsgruppen all_units
import_status errors headers raw_data_headers info_headers data num_imported num_importable displayable_columns file) ],
- 'scalar --get_set_init' => [ qw(worker) ]
+ 'scalar --get_set_init' => [ qw(worker) ],
+ 'array' => [
+ progress_tracker => { },
+ add_progress_tracker => { interface => 'add', hash_key => 'progress_tracker' },
+ ],
);
__PACKAGE__->run_before('check_auth');
sub action_test {
my ($self) = @_;
- $self->test_and_import(test => 1);
+ $self->test_and_import_deferred(test => 1);
}
sub action_import {
my $self = shift;
- $self->test_and_import(test => 0);
+ $self->test_and_import_deferred(test => 0);
}
sub action_save {
$self->redirect_to(action => 'new', 'profile.type' => $self->type);
}
+sub action_result {
+ my $self = shift;
+
+ # load resultobject
+ $self->{background_job} = SL::DB::Manager::BackgroundJob->find_by(id => $::form->{job});
+
+ my $data = $self->{background_job}->data_as_hash;
+
+ my $profile = SL::DB::Manager::CsvImportProfile->find_by(id => $data->{profile_id});
+
+ $self->profile($profile);
+
+ if ($data->{errors} and my $first_error = $data->{errors}->[0]) {
+ flash('error', $::locale->text('There was an error parsing the csv file: #1 in line #2.', $first_error->[2], $first_error->[0]));
+ }
+
+ if (!$data->{progress}{finished}) {
+ $self->render('csv_import/_deferred_results', { no_layout => 1 });
+ } else {
+ $self->action_report(report_id => $data->{report_id}, no_layout => 1);
+ }
+}
+
sub action_download_sample {
my $self = shift;
$self->send_file($file->file_name, name => $file_name);
}
+sub action_report {
+ my ($self, %params) = @_;
+
+ $self->{report} = SL::DB::Manager::CsvImportReport->find_by(id => $params{report_id} || $::form->{id});
+
+ $self->render('csv_import/report', { no_layout => $params{no_layout} });
+}
+
+
#
# filters
#
$self->render('csv_import/form', title => $title);
}
-sub test_and_import {
+sub test_and_import_deferred {
my ($self, %params) = @_;
$self->profile_from_form;
$file->fh->close;
}
- my $file = SL::SessionFile->new($self->csv_file_name, mode => '<', encoding => $self->profile->get('charset'));
- if (!$file->fh) {
- flash('error', $::locale->text('No file has been uploaded yet.'));
- return $self->action_new;
- }
+ $self->{background_job} = SL::BackgroundJob::CsvImport->create_job(
+ file => $self->csv_file_name,
+ profile => $self->profile,
+ type => $self->profile->type,
+ test => $params{test},
+ )->save;
+
+ SL::System::TaskServer->start_if_not_running;
+ SL::System::TaskServer->wake_up;
+
+ flash('info', $::locale->text('Your import is beig processed.'));
+
+ $self->{deferred} = 1;
+
+ $self->render_inputs;
+}
+
+sub test_and_import {
+ my ($self, %params) = @_;
+
+ my $file = SL::SessionFile->new(
+ $self->csv_file_name,
+ mode => '<',
+ encoding => $self->profile->get('charset'),
+ session_id => $params{session_id}
+ );
$self->file($file);
$worker->run;
+ return if $self->errors;
+
$self->num_imported(0);
$worker->save_objects if !$params{test};
- $self->save_report;
-
$self->num_importable(scalar grep { !$_ } map { scalar @{ $_->{errors} } } @{ $self->data || [] });
$self->import_status($params{test} ? 'tested' : 'imported');
- flash('info', $::locale->text('Objects have been imported.')) if !$params{test};
-
- $self->action_new;
+# flash('info', $::locale->text('Objects have been imported.')) if !$params{test};
}
sub load_default_profile {
sub save_report {
my ($self, $report_id) = @_;
+ $self->track_progress(phase => 'building report', progress => 0);
+
my $clone_profile = $self->profile->clone_and_reset_deep;
$clone_profile->save; # weird bug. if this isn't saved before adding it to the report, it will default back to the last profile.
my $sth = $dbh->prepare($query);
my $sth2 = $dbh->prepare($query2);
-# $::lxdebug->dump(0, "self", $self->info_headers);
-# $::lxdebug->dump(0, "self", $self->headers);
-# $::lxdebug->dump(0, "self", $self->raw_data_headers);
-
# save headers
- my @headers = (
- grep({ $self->info_headers->{used}->{$_} } @{ $self->info_headers->{headers} }),
- grep({ $self->headers->{used}->{$_} } @{ $self->headers->{headers} }),
- grep({ $self->raw_data_headers->{used}->{$_} } @{ $self->raw_data_headers->{headers} }),
+ my (@headers, @info_methods, @raw_methods, @methods);
+
+ for my $i (0 .. $#{ $self->info_headers->{headers} }) {
+ next unless $self->info_headers->{used}->{ $self->info_headers->{headers}->[$i] };
+ push @headers, $self->info_headers->{headers}->[$i];
+ push @info_methods, $self->info_headers->{methods}->[$i];
+ }
+ for my $i (0 .. $#{ $self->headers->{headers} }) {
+ next unless $self->headers->{used}->{ $self->headers->{headers}->[$i] };
+ push @headers, $self->headers->{headers}->[$i];
+ push @methods, $self->headers->{methods}->[$i];
+ }
+ for my $i (0 .. $#{ $self->raw_data_headers->{headers} }) {
+ next unless $self->raw_data_headers->{used}->{ $self->raw_data_headers->{headers}->[$i] };
+ push @headers, $self->raw_data_headers->{headers}->[$i];
+ push @raw_methods, $self->raw_data_headers->{headers}->[$i];
+ }
+
+ $::lxdebug->dump(0, "methods",
+ [ \@info_methods,
+ \@methods,
+ \@raw_methods ]
);
- my @info_methods = grep { $self->info_headers->{used}->{$_} } @{ $self->info_headers->{headers} };
- my @methods = grep { $self->headers->{used}->{$_} } @{ $self->headers->{methods} };
- my @raw_methods = grep { $self->raw_data_headers->{used}->{$_} } @{ $self->raw_data_headers->{headers} };
$sth->execute($report->id, $_, 0, $headers[$_]) for 0 .. $#headers;
my $o2 = $o1 + @methods;
for my $row (0 .. $#{ $self->data }) {
+ $self->track_progress(progress => $row / @{ $self->data } * 100) if $row % 100 == 0;
my $data_row = $self->{data}[$row];
$sth->execute($report->id, $_, $row + 1, $data_row->{info_data}{ $info_methods[$_] }) for 0 .. $#info_methods;
}
$dbh->commit;
-}
-
-sub action_report {
- my ($self) = @_;
- $self->{report} = SL::DB::Manager::CsvImportReport->find_by(id => $::form->{id});
-
- $self->render('csv_import/report');
+ return $report->id;
}
sub csv_file_name {
$self->worker->setup_displayable_columns;
}
+sub track_progress {
+ my ($self, %params) = @_;
+
+ for my $tracker ($self->progress_tracker) {
+ $tracker->track_progress(%params);
+ }
+}
+
1;