X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/5497ac6c0fa81bdce28c33b191a5348e10042fd6..8ae2bc4fb4c72f3ac907a3e47c0cbd5da23f62c5:/SL/Controller/CsvImport/Part.pm diff --git a/SL/Controller/CsvImport/Part.pm b/SL/Controller/CsvImport/Part.pm index 5d203a9a5..30c3719ca 100644 --- a/SL/Controller/CsvImport/Part.pm +++ b/SL/Controller/CsvImport/Part.pm @@ -103,9 +103,15 @@ sub check_objects { return unless @{ $self->controller->data }; + $self->controller->track_progress(phase => 'building data', progress => 0); + $self->makemodel_columns({}); + my $i; + my $num_data = scalar @{ $self->controller->data }; foreach my $entry (@{ $self->controller->data }) { + $self->controller->track_progress(progress => $i/$num_data * 100) if $i % 100 == 0; + $self->check_buchungsgruppe($entry); $self->check_type($entry); $self->check_unit($entry); @@ -120,6 +126,8 @@ sub check_objects { $self->handle_cvars($entry); $self->handle_makemodel($entry); $self->set_various_fields($entry); + } continue { + $i++; } $self->add_columns(qw(type)) if $self->settings->{parts_type} eq 'mixed'; @@ -132,29 +140,23 @@ sub check_objects { map { $self->add_raw_data_columns("make_${_}", "model_${_}", "lastcost_${_}") } sort { $a <=> $b } keys %{ $self->makemodel_columns }; } -sub check_duplicates { - my ($self, %params) = @_; - - my $normalizer = sub { my $name = $_[0]; $name =~ s/[\s,\.\-]//g; return $name; }; - my $name_maker = sub { return $normalizer->($_[0]->description) }; - - my %by_name; - if ('check_db' eq $self->controller->profile->get('duplicates')) { - %by_name = map { ( $name_maker->($_) => 'db' ) } @{ $self->existing_objects }; - } - - foreach my $entry (@{ $self->controller->data }) { - next if @{ $entry->{errors} }; - - my $name = $name_maker->($entry->{object}); - - if (!$by_name{ $name }) { - $by_name{ $name } = 'csv'; - - } else { - push @{ $entry->{errors} }, $by_name{ $name } eq 'db' ? $::locale->text('Duplicate in database') : $::locale->text('Duplicate in CSV file'); - } - } +sub get_duplicate_check_fields { + return { + partnumber => { + label => $::locale->text('Part Number'), + default => 0 + }, + + description => { + label => $::locale->text('Description'), + default => 1, + maker => sub { + my $desc = shift->description; + $desc =~ s/[\s,\.\-]//g; + return $desc; + } + }, + }; } sub check_buchungsgruppe { @@ -367,9 +369,11 @@ sub handle_pricegroups { sub handle_makemodel { my ($self, $entry) = @_; + my $object = $entry->{object}; + my $found_any; my @makemodels; - foreach my $idx (map { substr $_, 5 } grep { m/^make_\d+$/ && $entry->{raw_data}->{$_} } keys %{ $entry->{raw_data} }) { + foreach my $idx (sort map { substr $_, 5 } grep { m/^make_\d+$/ && $entry->{raw_data}->{$_} } keys %{ $entry->{raw_data} }) { my $vendor = $entry->{raw_data}->{"make_${idx}"}; $vendor = $self->vc_by->{id}-> { $vendor } || $self->vc_by->{number}->{vendors}->{ $vendor } @@ -379,6 +383,7 @@ sub handle_makemodel { push @{ $entry->{errors} }, $::locale->text('Error: Invalid vendor in column make_#1', $idx); } else { + $found_any = 1; push @makemodels, SL::DB::MakeModel->new(make => $vendor->id, model => $entry->{raw_data}->{"model_${idx}"}, lastcost_as_number => $entry->{raw_data}->{"lastcost_${idx}"}); @@ -388,8 +393,31 @@ sub handle_makemodel { } } - $entry->{object}->makemodels(\@makemodels); - $entry->{object}->makemodel(scalar(@makemodels) ? 1 : 0); + $object->makemodels(\@makemodels); + $object->makemodel(scalar(@makemodels) ? 1 : 0); + + if ( !$entry->{part} || $self->settings->{article_number_policy} ne 'update_prices' ) { + return; + } + + my %old_makemodels_by_make = map { $_->make => $_ } $entry->{part}->makemodels; + + foreach my $makemodel ($object->makemodels()) { + my $makemodel_orig = $old_makemodels_by_make{$makemodel->make}; + $found_any = 1; + + if ($makemodel_orig) { + $makemodel_orig->model($makemodel->model); + $makemodel_orig->lastcost($makemodel->lastcost); + + } else { + $entry->{part}->add_makemodels($makemodel); + } + } + + $entry->{part}->makemodel($object->makemodel); + + $self->save_with_cascade(1) if $found_any; } sub set_various_fields { @@ -437,10 +465,10 @@ sub setup_displayable_columns { { name => 'image', description => $::locale->text('Image') }, { name => 'lastcost', description => $::locale->text('Last Cost') }, { name => 'listprice', description => $::locale->text('List Price') }, - { name => 'make_X', description => $::locale->text('Make (with X being a number)') }, + { name => 'make_X', description => $::locale->text('Make (vendor\'s database ID, number or name; with X being a number)') . ' [1]' }, { name => 'microfiche', description => $::locale->text('Microfiche') }, - { name => 'model_X', description => $::locale->text('Model (with X being a number)') }, - { name => 'lastcost_X', description => $::locale->text('Lastcost (with X being a number)') }, + { name => 'model_X', description => $::locale->text('Model (with X being a number)') . ' [1]' }, + { name => 'lastcost_X', description => $::locale->text('Lastcost (with X being a number)') . ' [1]' }, { name => 'not_discountable', description => $::locale->text('Not Discountable') }, { name => 'notes', description => $::locale->text('Notes') }, { name => 'obsolete', description => $::locale->text('Obsolete') },