X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;ds=sidebyside;f=SL%2FController%2FCsvImport%2FBase.pm;h=97126979053938ef43f41ee43bb1b37a8f5ddfcb;hb=649529bf1cc186b2320c4797b85c411e552a464c;hp=4667677c6687e49de84acfb4fe0e3b755b072488;hpb=73a58f3dceeb378343ceb151942828eea686b75a;p=kivitendo-erp.git diff --git a/SL/Controller/CsvImport/Base.pm b/SL/Controller/CsvImport/Base.pm index 4667677c6..971269790 100644 --- a/SL/Controller/CsvImport/Base.pm +++ b/SL/Controller/CsvImport/Base.pm @@ -2,13 +2,14 @@ package SL::Controller::CsvImport::Base; use strict; +use English qw(-no_match_vars); use List::MoreUtils qw(pairwise any); use SL::Helper::Csv; -use SL::DB::Currency; use SL::DB::Customer; use SL::DB::Language; use SL::DB::PaymentTerm; +use SL::DB::DeliveryTerm; use SL::DB::Vendor; use SL::DB::Contact; use SL::DB::History; @@ -18,13 +19,13 @@ use parent qw(Rose::Object); use Rose::Object::MakeMethods::Generic ( scalar => [ qw(controller file csv test_run save_with_cascade) ], - 'scalar --get_set_init' => [ qw(profile displayable_columns existing_objects class manager_class cvar_columns all_cvar_configs all_languages payment_terms_by all_currencies default_currency_id all_vc vc_by) ], + 'scalar --get_set_init' => [ qw(profile displayable_columns existing_objects class manager_class cvar_columns all_cvar_configs all_languages payment_terms_by delivery_terms_by all_vc vc_by clone_methods) ], ); sub run { my ($self, %params) = @_; - $self->test_run($params{test_run}); + $self->test_run($params{test}); $self->controller->track_progress(phase => 'parsing csv', progress => 0); @@ -58,7 +59,7 @@ sub run { $self->controller->raw_data_headers({ used => { }, headers => [ ] }); $self->controller->info_headers({ used => { }, headers => [ ] }); - my @objects = $self->csv->get_objects; + my $objects = $self->csv->get_objects; $self->controller->track_progress(progress => 70); @@ -66,7 +67,7 @@ sub run { $self->controller->track_progress(progress => 80); - $self->controller->data([ pairwise { { object => $a, raw_data => $b, errors => [], information => [], info_data => {} } } @objects, @raw_data ]); + $self->controller->data([ pairwise { { object => $a, raw_data => $b, errors => [], information => [], info_data => {} } } @$objects, @raw_data ]); $self->controller->track_progress(progress => 90); @@ -140,23 +141,18 @@ sub init_all_languages { return SL::DB::Manager::Language->get_all; } -sub init_all_currencies { - my ($self) = @_; - - return SL::DB::Manager::Currency->get_all; -} - -sub init_default_currency_id { +sub init_payment_terms_by { my ($self) = @_; - return SL::DB::Default->get->currency_id; + my $all_payment_terms = SL::DB::Manager::PaymentTerm->get_all; + return { map { my $col = $_; ( $col => { map { ( $_->$col => $_ ) } @{ $all_payment_terms } } ) } qw(id description) }; } -sub init_payment_terms_by { +sub init_delivery_terms_by { my ($self) = @_; - my $all_payment_terms = SL::DB::Manager::PaymentTerm->get_all; - return { map { my $col = $_; ( $col => { map { ( $_->$col => $_ ) } @{ $all_payment_terms } } ) } qw(id description) }; + my $all_delivery_terms = SL::DB::Manager::DeliveryTerm->get_all; + return { map { my $col = $_; ( $col => { map { ( $_->$col => $_ ) } @{ $all_delivery_terms } } ) } qw(id description) }; } sub init_all_vc { @@ -166,6 +162,10 @@ sub init_all_vc { vendors => SL::DB::Manager::Vendor->get_all }; } +sub init_clone_methods { + {} +} + sub force_allow_columns { return (); } @@ -222,15 +222,29 @@ sub handle_cvars { bool => 'bool_value' ); my @cvars; + my %changed_cvars; foreach my $config (@{ $self->all_cvar_configs }) { next unless exists $entry->{raw_data}->{ "cvar_" . $config->name }; my $value = $entry->{raw_data}->{ "cvar_" . $config->name }; my $column = $type_to_column{ $config->type } || die "Program logic error: unknown custom variable storage type"; - push @cvars, SL::DB::CustomVariable->new(config_id => $config->id, $column => $value, sub_module => ''); + my $new_cvar = SL::DB::CustomVariable->new(config_id => $config->id, $column => $value, sub_module => ''); + + push @cvars, $new_cvar; + $changed_cvars{$config->name} = $new_cvar; } - $entry->{object}->custom_variables(\@cvars); + # merge existing with new cvars. swap every existing with the imported one, push the rest + if (@cvars) { + my @orig_cvars = ($entry->{object_to_save} || $entry->{object})->custom_variables; + for (@orig_cvars) { + $_ = $changed_cvars{ $_->config->name } if $changed_cvars{ $_->config->name }; + delete $changed_cvars{ $_->config->name }; + } + push @orig_cvars, values %changed_cvars; + + $entry->{object}->custom_variables(\@orig_cvars); + } } sub init_profile { @@ -390,6 +404,38 @@ sub check_payment { } $object->payment_id($terms->id); + + # register payment_id for method copying later + $self->clone_methods->{payment_id} = 1; + } + + return 1; +} + +sub check_delivery_term { + my ($self, $entry) = @_; + + my $object = $entry->{object}; + + # Check whether or not delivery term ID is valid. + if ($object->delivery_term_id && !$self->delivery_terms_by->{id}->{ $object->delivery_term_id }) { + push @{ $entry->{errors} }, $::locale->text('Error: Invalid delivery terms'); + return 0; + } + + # Map name to ID if given. + if (!$object->delivery_term_id && $entry->{raw_data}->{delivery_term}) { + my $terms = $self->delivery_terms_by->{description}->{ $entry->{raw_data}->{delivery_term} }; + + if (!$terms) { + push @{ $entry->{errors} }, $::locale->text('Error: Invalid delivery terms'); + return 0; + } + + $object->delivery_term_id($terms->id); + + # register delivery_term_id for method copying later + $self->clone_methods->{delivery_term_id} = 1; } return 1; @@ -416,9 +462,9 @@ sub save_objects { my $ret; if (!eval { $ret = $object->save(cascade => !!$self->save_with_cascade()); 1 }) { - push @{ $entry->{errors} }, $::locale->text('Error when saving: #1', $@); + push @{ $entry->{errors} }, $::locale->text('Error when saving: #1', $EVAL_ERROR); } elsif ( !$ret ) { - push @{ $entry->{errors} }, $::locale->text('Error when saving: #1', $entry->{object}->db->error); + push @{ $entry->{errors} }, $::locale->text('Error when saving: #1', $object->db->error); } else { $self->_save_history($object); $self->controller->num_imported($self->controller->num_imported + 1); @@ -434,7 +480,9 @@ sub save_objects { } sub field_lengths { - return (); + my ($self) = @_; + + return map { $_->name => $_->length } grep { $_->type eq 'varchar' } @{$self->class->meta->columns}; } sub fix_field_lengths {