X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/4c313ecf54813bb13c72804f9db3a6d02a20d7bc..675f21e68f62a43d3227d4c0e24bbfd840198787:/SL/Controller/CsvImport/Part.pm diff --git a/SL/Controller/CsvImport/Part.pm b/SL/Controller/CsvImport/Part.pm index 79c1b9192..a78ab8c1e 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 @@ -204,30 +206,32 @@ sub check_existing { my $object = $entry->{object}; if ($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, - ); + $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; } @@ -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; }