X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FController%2FCsvImport.pm;h=b74b04be038926c822cbd8471030d2abec34a3d4;hb=a21015406d710a4fc3025422738ec297df078fb0;hp=7fa20a7e10e0ccf373233ba25afc1aa92d7de775;hpb=1870f11e7915b768e83e18f8491f1e13d0702ead;p=kivitendo-erp.git diff --git a/SL/Controller/CsvImport.pm b/SL/Controller/CsvImport.pm index 7fa20a7e1..b74b04be0 100644 --- a/SL/Controller/CsvImport.pm +++ b/SL/Controller/CsvImport.pm @@ -13,9 +13,12 @@ use SL::SessionFile; use SL::Controller::CsvImport::Contact; use SL::Controller::CsvImport::CustomerVendor; use SL::Controller::CsvImport::Part; +use SL::Controller::CsvImport::Inventory; use SL::Controller::CsvImport::Shipto; use SL::Controller::CsvImport::Project; use SL::Controller::CsvImport::Order; +use SL::JSON; +use SL::Controller::CsvImport::BankTransaction; use SL::BackgroundJob::CsvImport; use SL::System::TaskServer; @@ -27,7 +30,7 @@ use parent qw(SL::Controller::Base); use Rose::Object::MakeMethods::Generic ( 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) ], + import_status errors headers raw_data_headers info_headers data num_imported num_importable displayable_columns file all_taxzones) ], 'scalar --get_set_init' => [ qw(worker task_server) ], 'array' => [ progress_tracker => { }, @@ -127,12 +130,12 @@ sub action_download_sample { my $csv = Text::CSV_XS->new({ binary => 1, map { ( $_ => $self->profile->get($_) ) } qw(sep_char escape_char quote_char),}); if ($self->worker->is_multiplexed) { - foreach my $ri (keys %{ $self->displayable_columns }) { - $csv->print($file->fh, [ map { $_->{name} } @{ $self->displayable_columns->{$ri} } ]); + foreach my $p (@{ $self->worker->profile }) { + $csv->print($file->fh, [ map { $_->{name} } @{ $self->displayable_columns->{$p->{row_ident}} } ]); $file->fh->print("\r\n"); } - foreach my $ri (keys %{ $self->displayable_columns }) { - $csv->print($file->fh, [ map { $_->{description} } @{ $self->displayable_columns->{$ri} } ]); + foreach my $p (@{ $self->worker->profile }) { + $csv->print($file->fh, [ map { $_->{description} } @{ $self->displayable_columns->{$p->{row_ident}} } ]); $file->fh->print("\r\n"); } } else { @@ -165,16 +168,16 @@ sub action_report { my $pages = {}; $pages->{per_page} = $::form->{per_page} || 20; $pages->{max} = SL::DB::Helper::Paginated::ceil($num_rows, $pages->{per_page}) || 1; - $pages->{cur} = $page < 1 ? 1 + $pages->{page} = $page < 1 ? 1 : $page > $pages->{max} ? $pages->{max} : $page; - $pages->{common} = [ grep { $_->{visible} } @{ SL::DB::Helper::Paginated::make_common_pages($pages->{cur}, $pages->{max}) } ]; + $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->{cur}-1) + $self->{report_numheaders}; - my $last_row_data = min($pages->{per_page} * $pages->{cur}, $num_rows) + $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 .. @@ -221,7 +224,7 @@ sub check_auth { sub check_type { my ($self) = @_; - die "Invalid CSV import type" if none { $_ eq $::form->{profile}->{type} } qw(parts customers_vendors addresses contacts projects orders); + die "Invalid CSV import type" if none { $_ eq $::form->{profile}->{type} } qw(parts inventories customers_vendors addresses contacts projects orders bank_transactions); $self->type($::form->{profile}->{type}); } @@ -263,10 +266,16 @@ sub render_inputs { : $self->type eq 'addresses' ? $::locale->text('CSV import: shipping addresses') : $self->type eq 'contacts' ? $::locale->text('CSV import: contacts') : $self->type eq 'parts' ? $::locale->text('CSV import: parts and services') + : $self->type eq 'inventories' ? $::locale->text('CSV import: inventories') : $self->type eq 'projects' ? $::locale->text('CSV import: projects') : $self->type eq 'orders' ? $::locale->text('CSV import: orders') + : $self->type eq 'bank_transactions' ? $::locale->text('CSV import: bank transactions') : die; + if ($self->{type} eq 'customers_vendors' or $self->{type} eq 'orders' ) { + $self->all_taxzones(SL::DB::Manager::TaxZone->get_all_sorted(query => [ obsolete => 0 ])); + }; + if ($self->{type} eq 'parts') { $self->all_buchungsgruppen(SL::DB::Manager::Buchungsgruppe->get_all_sorted); $self->all_units(SL::DB::Manager::Unit->get_all_sorted); @@ -280,7 +289,11 @@ sub render_inputs { sub test_and_import_deferred { my ($self, %params) = @_; - $self->profile_from_form; + if ( $::form->{force_profile} && $::form->{profile}->{id} ) { + $self->load_default_profile; + } else { + $self->profile_from_form; + }; if ($::form->{file}) { my $file = SL::SessionFile->new($self->csv_file_name, mode => '>'); @@ -308,11 +321,15 @@ sub test_and_import_deferred { $self->task_server->start; } - flash('info', $::locale->text('Your import is beig processed.')); + flash('info', $::locale->text('Your import is being processed.')); $self->{deferred} = 1; - $self->render_inputs; + if ($::request->type eq 'json') { + $self->render(\ SL::JSON::to_json($self->{background_job}->as_tree), { type => 'json' }) + } else { + $self->render_inputs; + } } sub test_and_import { @@ -353,6 +370,7 @@ sub load_default_profile { $profile ||= SL::DB::CsvImportProfile->new(type => $self->{type}, login => $::myconfig{login}); $self->profile($profile); + $self->worker->set_profile_defaults; $self->profile->set_defaults; } @@ -363,6 +381,7 @@ sub load_all_profiles { where => [ type => $self->type, login => $::myconfig{login}, + '!name' => '', ], sort_by => 'name')); } @@ -414,17 +433,17 @@ sub char_map { } sub save_report { - my ($self, $report_id) = @_; + my ($self, %params) = @_; if ($self->worker->is_multiplexed) { - return $self->save_report_multi($report_id); + return $self->save_report_multi(%params); } else { - return $self->save_report_single($report_id); + return $self->save_report_single(%params); } } sub save_report_single { - my ($self, $report_id) = @_; + my ($self, %params) = @_; $self->track_progress(phase => 'building report', progress => 0); @@ -432,7 +451,7 @@ sub save_report_single { $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 $report = SL::DB::CsvImportReport->new( - session_id => $::auth->create_or_refresh_session, + session_id => $params{session_id}, profile => $clone_profile, type => $self->type, file => '', @@ -494,7 +513,7 @@ sub save_report_single { } sub save_report_multi { - my ($self, $report_id) = @_; + my ($self, %params) = @_; $self->track_progress(phase => 'building report', progress => 0); @@ -502,7 +521,7 @@ sub save_report_multi { $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 $report = SL::DB::CsvImportReport->new( - session_id => $::auth->create_or_refresh_session, + session_id => $params{session_id}, profile => $clone_profile, type => $self->type, file => '', @@ -603,8 +622,10 @@ sub init_worker { : $self->{type} eq 'contacts' ? SL::Controller::CsvImport::Contact->new(@args) : $self->{type} eq 'addresses' ? SL::Controller::CsvImport::Shipto->new(@args) : $self->{type} eq 'parts' ? SL::Controller::CsvImport::Part->new(@args) + : $self->{type} eq 'inventories' ? SL::Controller::CsvImport::Inventory->new(@args) : $self->{type} eq 'projects' ? SL::Controller::CsvImport::Project->new(@args) : $self->{type} eq 'orders' ? SL::Controller::CsvImport::Order->new(@args) + : $self->{type} eq 'bank_transactions' ? SL::Controller::CsvImport::BankTransaction->new(@args) : die "Program logic error"; }