X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FController%2FCsvImport%2FPart.pm;h=9f4ed7284327948a5c976fb68df8d044bfa9a796;hb=7ed4b336b89b861479a1fc2670b9456334b0d1be;hp=0cb132f34eb9bb7734a6014cf990f37ebd77b707;hpb=2da5d610ce0aeb43428de82e6b5e79acfb502628;p=kivitendo-erp.git diff --git a/SL/Controller/CsvImport/Part.pm b/SL/Controller/CsvImport/Part.pm index 0cb132f34..9f4ed7284 100644 --- a/SL/Controller/CsvImport/Part.pm +++ b/SL/Controller/CsvImport/Part.pm @@ -16,6 +16,8 @@ use SL::DB::Price; use SL::DB::Translation; use SL::DB::Unit; +use List::MoreUtils qw(none); + use parent qw(SL::Controller::CsvImport::Base); use Rose::Object::MakeMethods::Generic @@ -203,31 +205,33 @@ sub check_existing { my $object = $entry->{object}; - if (!$self->test_run && $object->partnumber && $self->parts_by->{partnumber}{$object->partnumber}) { - $entry->{part} = SL::DB::Manager::Part->find_by( - SL::DB::Manager::Part->type_filter($object->type), - ( partnumber => $object->partnumber ) x!! $object->partnumber, - ); + if ($object->partnumber && $self->parts_by->{partnumber}{$object->partnumber}) { + $entry->{part} = SL::DB::Manager::Part->find_by(partnumber => $object->partnumber); } - if ($self->settings->{article_number_policy} eq 'update_prices') { - if ($object->partnumber && $self->parts_by->{partnumber}{$object->partnumber}) { - push @{ $entry->{information} }, $::locale->text('Updating prices of existing entry in database'); - } - if ($entry->{part}) { - map { $entry->{part}->$_( $object->$_ ) if defined $object->$_ } qw(sellprice listprice lastcost); + if ($entry->{part}) { + if ($self->settings->{article_number_policy} eq 'update_prices') { + if ($self->settings->{parts_type} eq 'mixed' && $entry->{part}->type ne $object->type) { + push(@{$entry->{errors}}, $::locale->text('Skipping due to existing entry in database with different type')); + } else { + map { $entry->{part}->$_( $object->$_ ) if defined $object->$_ } qw(sellprice listprice lastcost); - # merge prices - my %prices_by_pricegroup_id = map { $_->pricegroup->id => $_ } $entry->{part}->prices, $object->prices; - $entry->{part}->prices(grep { $_ } map { $prices_by_pricegroup_id{$_->id} } @{ $self->all_pricegroups }); + # merge prices + my %prices_by_pricegroup_id = map { $_->pricegroup->id => $_ } $entry->{part}->prices, $object->prices; + $entry->{part}->prices(grep { $_ } map { $prices_by_pricegroup_id{$_->id} } @{ $self->all_pricegroups }); - push @{ $entry->{information} }, $::locale->text('Updating prices of existing entry in database'); - $entry->{object_to_save} = $entry->{part}; + push @{ $entry->{information} }, $::locale->text('Updating prices of existing entry in database'); + $entry->{object_to_save} = $entry->{part}; + } + } elsif ( $self->settings->{article_number_policy} eq 'skip' ) { + push(@{$entry->{errors}}, $::locale->text('Skipping due to existing entry in database')); + + } else { + $object->partnumber('####'); + push(@{$entry->{errors}}, $::locale->text('Skipping, for assemblies are not importable (yet)')) if $object->type eq 'assembly'; } - } elsif ( $self->settings->{article_number_policy} eq 'skip' ) { - push(@{$entry->{errors}}, $::locale->text('Skipping due to existing entry in database')) if ( $entry->{part} ); } else { - $object->partnumber('####') if $entry->{part}; + push(@{$entry->{errors}}, $::locale->text('Skipping, for assemblies are not importable (yet)')) if $object->type eq 'assembly'; } } @@ -254,22 +258,34 @@ sub check_type { my ($self, $entry) = @_; my $bg = $self->bg_by->{id}->{ $entry->{object}->buchungsgruppen_id }; - $bg ||= SL::DB::Buchungsgruppe->new(inventory_accno_id => 1, income_accno_id_0 => 1, expense_accno_id_0 => 1); + $bg ||= SL::DB::Buchungsgruppe->new(inventory_accno_id => 1); # does this case ever occur? my $type = $self->settings->{parts_type}; if ($type eq 'mixed') { $type = $entry->{raw_data}->{type} =~ m/^p/i ? 'part' : $entry->{raw_data}->{type} =~ m/^s/i ? 'service' + : $entry->{raw_data}->{type} =~ m/^a/i ? 'assembly' : undef; } - $entry->{object}->income_accno_id( $bg->income_accno_id_0 ); - $entry->{object}->expense_accno_id( $bg->expense_accno_id_0 ); + $entry->{object}->assembly($type eq 'assembly'); + + # when saving income_accno_id or expense_accno_id use ids from the selected + # $bg according to the default tax_zone (the one with the highest sort + # order). Alternatively one could use the ids from defaults, but they might + # not all be set. + + $entry->{object}->income_accno_id( $bg->income_accno_id( SL::DB::Manager::TaxZone->get_default->id ) ); + + if ($type eq 'part' || $type eq 'service') { + $entry->{object}->expense_accno_id( $bg->expense_accno_id( SL::DB::Manager::TaxZone->get_default->id ) ); + } if ($type eq 'part') { $entry->{object}->inventory_accno_id( $bg->inventory_accno_id ); + } - } elsif ($type ne 'service') { + if (none { $_ eq $type } qw(part service assembly)) { push @{ $entry->{errors} }, $::locale->text('Error: Invalid part type'); return 0; } @@ -411,10 +427,10 @@ sub handle_makemodel { return; } - my %old_makemodels_by_make = map { $_->make => $_ } $entry->{part}->makemodels; + my %old_makemodels_by_mm = map { $_->make . $; . $_->model => $_ } $entry->{part}->makemodels; foreach my $makemodel ($object->makemodels()) { - my $makemodel_orig = $old_makemodels_by_make{$makemodel->make}; + my $makemodel_orig = $old_makemodels_by_mm{$makemodel->make,$makemodel->model}; $found_any = 1; if ($makemodel_orig) { @@ -426,7 +442,9 @@ sub handle_makemodel { } } - $entry->{part}->makemodel($object->makemodel); + # reindex makemodels + my $i = 0; + $_->sortorder(++$i) for @{ $entry->{part}->makemodels }; $self->save_with_cascade(1) if $found_any; } @@ -485,7 +503,7 @@ sub setup_displayable_columns { { name => 'not_discountable', description => $::locale->text('Not Discountable') }, { name => 'notes', description => $::locale->text('Notes') }, { name => 'obsolete', description => $::locale->text('Obsolete') }, - { name => 'onhand', description => $::locale->text('On Hand') }, + { name => 'onhand', description => $::locale->text('On Hand') . ' [2]' }, { name => 'partnumber', description => $::locale->text('Part Number') }, { name => 'partsgroup_id', description => $::locale->text('Partsgroup (database ID)') }, { name => 'partsgroup', description => $::locale->text('Partsgroup (name)') }, @@ -496,7 +514,7 @@ sub setup_displayable_columns { { name => 'rop', description => $::locale->text('ROP') }, { name => 'sellprice', description => $::locale->text('Sellprice') }, { name => 'shop', description => $::locale->text('Shopartikel') }, - { name => 'type', description => $::locale->text('Article type (see below)') }, + { name => 'type', description => $::locale->text('Article type') . ' [3]' }, { name => 'unit', description => $::locale->text('Unit (if missing or empty default unit will be used)') }, { name => 've', description => $::locale->text('Verrechnungseinheit') }, { name => 'weight', description => $::locale->text('Weight') },