(
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_importable displayable_columns file all_taxzones) ],
- 'scalar --get_set_init' => [ qw(worker task_server num_imported) ],
+ 'scalar --get_set_init' => [ qw(worker task_server num_imported mappings) ],
'array' => [
progress_tracker => { },
add_progress_tracker => { interface => 'add', hash_key => 'progress_tracker' },
$self->render('csv_import/report', { layout => !($params{no_layout} || $::form->{no_layout}) });
}
+sub action_add_empty_mapping_line {
+ my ($self) = @_;
+
+ $self->profile_from_form;
+ $self->setup_help;
+
+ $self->js
+ ->append('#csv_import_mappings', $self->render('csv_import/_mapping_item', { layout => 0, output => 0 }))
+ ->hide('#mapping_empty')
+ ->render;
+}
+
+sub action_add_mapping_from_upload {
+ my ($self) = @_;
+
+ $self->profile_from_form;
+ $self->setup_help;
+
+ my $file = SL::SessionFile->new($self->csv_file_name, mode => '<', encoding => $self->profile->get('charset'));
+ if (!$file->fh) {
+ $self->js
+ ->flash('error', t8('No file has been uploaded yet.'))
+ ->render;
+ 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 $header = $csv->getline($file->fh) or do {
+ $self->js
+ ->flash('error', t8('No header found'))
+ ->render;
+ return;
+ };
+
+ for my $field (@$header) {
+ next if $self->mappings_for_profile->{$field};
+ $self->js->append(
+ '#csv_import_mappings',
+ $self->render('csv_import/_mapping_item', { layout => 0, output => 0 }, item => { from => $field }),
+ );
+ }
+
+ $self->js
+ ->hide('#mapping_empty')
+ ->render;
+}
+
#
# filters
$profile ||= SL::DB::CsvImportProfile->new(type => $self->{type}, login => $::myconfig{login});
$self->profile($profile);
+ $self->mappings(SL::JSON::from_json($self->profile->get('json_mappings'))) if $self->profile->get('json_mappings');
$self->worker->set_profile_defaults;
$self->profile->set_defaults;
}
$self->profile->assign_attributes(%{ $::form->{profile} });
$self->profile->settings(map({ { key => $_, value => $::form->{settings}->{$_} } } keys %{ $::form->{settings} }),
@settings);
+
+ $self->profile->set('json_mappings', JSON::to_json($self->mappings));
+
$self->profile->set_defaults;
}
1;
}
+sub mappings_for_profile {
+ +{ map { $_->{from} => $_->{to} } @{ $_[0]->mappings } }
+}
+
+sub init_mappings {
+ $::form->{mappings} || []
+}
+
1;