Revision 25b1500a
Von Tamino Steinert vor etwa 1 Jahr hinzugefügt
| scripts/import_variant_csv.pl | ||
|---|---|---|
|  | ||
| use Data::Dumper;
 | ||
| use List::Util qw(first);
 | ||
| use File::Basename;
 | ||
|  | ||
| use SL::DBUtils;
 | ||
| use SL::LXDebug;
 | ||
| ... | ... | |
|  | ||
| chdir($FindBin::Bin . '/..');
 | ||
|  | ||
| my ($opt_user, $opt_client, $opt_part_csv_file, $opt_groessen_staffeln_csv_file);
 | ||
| my (
 | ||
|   $opt_user, $opt_client,
 | ||
|   $opt_warengruppen_csv_file, $opt_farben_folder,
 | ||
|   $opt_part_csv_file, $opt_groessen_staffeln_csv_file
 | ||
| );
 | ||
| our (%myconfig, $form, $user, $employee, $auth, $locale);
 | ||
|  | ||
| $opt_client = "variant";
 | ||
| $opt_user   = "test_user";
 | ||
|  | ||
| $opt_part_csv_file = "Artikel_komplett.csv";
 | ||
|  | ||
| $opt_groessen_staffeln_csv_file = "Größenstaffeln.csv";
 | ||
| $opt_warengruppen_csv_file = "kuw/Warengruppen.csv";
 | ||
| $opt_groessen_staffeln_csv_file = "kuw/Größenstaffeln.csv";
 | ||
| $opt_farben_folder = "kuw/Farben";
 | ||
| $opt_part_csv_file = "kuw/Export_bearbeitet.csv";
 | ||
|  | ||
|  | ||
| $locale = Locale->new;
 | ||
| ... | ... | |
| my %parts_mapping = (
 | ||
|   VK                      => 'sellprice',
 | ||
|   EANNR                   => 'ean',
 | ||
|   WAR_KURZBEZEICHNUNG     => 'description',
 | ||
|   WARENGRUPPENBEZEICHNUNG => 'warengruppe',
 | ||
|   EIGENEARTIKELNR         => 'description',
 | ||
|   WAR_KURZBEZEICHNUNG     => 'warengruppe',
 | ||
|   GROESSE                 => 'varianten_groesse',
 | ||
|   LAENGE                  => 'varianten_laenge',
 | ||
|   FARBNR                  => 'varianten_farbnummer',
 | ||
| ... | ... | |
| $groessen_staffel_csv->parse or die "Could not parse csv";
 | ||
| my $groessen_staffel_hrefs = $groessen_staffel_csv->get_data;
 | ||
|  | ||
| my $warengruppen_csv = SL::Helper::Csv->new(
 | ||
|   file        => $opt_warengruppen_csv_file,
 | ||
|   encoding    => 'utf-8', # undef means utf8
 | ||
|   sep_char    => ';',     # default ';'
 | ||
|   quote_char  => '"',     # default '"'
 | ||
|   escape_char => '"',     # default '"'
 | ||
| );
 | ||
| $warengruppen_csv->parse or die "Could not parse csv";
 | ||
| my $warengruppen_hrefs = $warengruppen_csv->get_data;
 | ||
|  | ||
| my $transfer_type = SL::DB::Manager::TransferType->find_by(
 | ||
|   direction => 'in',
 | ||
|   description => 'stock',
 | ||
| ... | ... | |
|  | ||
| SL::DB->client->with_transaction(sub {
 | ||
|  | ||
|   # create farben listen
 | ||
|   foreach my $farb_csv_file (glob( $opt_farben_folder . '/*' )) {
 | ||
|     my $farb_csv = SL::Helper::Csv->new(
 | ||
|       file        => $farb_csv_file,
 | ||
|       encoding    => 'utf-8', # undef means utf8
 | ||
|       sep_char    => ';',     # default ';'
 | ||
|       quote_char  => '"',     # default '"'
 | ||
|       escape_char => '"',     # default '"'
 | ||
|     );
 | ||
|     $farb_csv->parse or die "Could not parse csv";
 | ||
|     my $farb_hrefs = $farb_csv->get_data;
 | ||
|  | ||
|     my $vendor_name = basename($farb_csv_file);
 | ||
|     $vendor_name =~ s/\.csv//;
 | ||
|  | ||
|     my $variant_property = SL::DB::VariantProperty->new(
 | ||
|       name         => "Farbliste $vendor_name",
 | ||
|       unique_name  => "Farbliste $vendor_name",
 | ||
|       abbreviation => "fa",
 | ||
|     )->save;
 | ||
|  | ||
|     my $pos = 1;
 | ||
|     SL::DB::VariantPropertyValue->new(
 | ||
|       variant_property => $variant_property,
 | ||
|       value            => $_,
 | ||
|       abbreviation     => $_,
 | ||
|       sortkey => $pos++,
 | ||
|     )->save for
 | ||
|       map {$_->{Joined}}
 | ||
|       @$farb_hrefs;
 | ||
|   }
 | ||
|  | ||
|   # create partsgroups
 | ||
|   my @hierachy_descrioptions = qw(
 | ||
|     Bereich Hauptabteilung Abteilung Hauptwarengruppe Warengruppe
 | ||
|   );
 | ||
|   my %current_partsgroup_hierachy;
 | ||
|   foreach my $partsgroup_row (@$warengruppen_hrefs) {
 | ||
|     # TODO: store valid groessen staffeln
 | ||
|     my $valid_groessen_staffen = delete $partsgroup_row->{Größenstaffeln};
 | ||
|     my $last_hierachy_key;
 | ||
|     foreach my $hierachy_key (@hierachy_descrioptions) {
 | ||
|       if ($partsgroup_row->{$hierachy_key}) {
 | ||
|         my ($number, @rest) = split(' ', $partsgroup_row->{$hierachy_key});
 | ||
|         my $name = join(' ', @rest);
 | ||
|         unless ($number && $name) {
 | ||
|           die "Could not find number and name for $hierachy_key partsgroup '".$partsgroup_row->{$hierachy_key}."' in the row:'\n".
 | ||
|           join(';', map {$partsgroup_row->{$_}} @hierachy_descrioptions);
 | ||
|         }
 | ||
|         my $partsgroup = SL::DB::PartsGroup->new(
 | ||
|           partsgroup  => $name,
 | ||
|           sortkey     => $number,
 | ||
|           description => "$number $name",
 | ||
|           parent_id   => $last_hierachy_key ? $current_partsgroup_hierachy{$last_hierachy_key}->id : undef,
 | ||
|         )->save;
 | ||
|         $current_partsgroup_hierachy{$hierachy_key} = $partsgroup;
 | ||
|       }
 | ||
|       my $last_hierachy_key = $hierachy_key;
 | ||
|     }
 | ||
|   }
 | ||
|  | ||
|   # create groessen staffeln
 | ||
|   foreach my $groessen_staffel_row (@$groessen_staffel_hrefs) {
 | ||
|     my $name = delete $groessen_staffel_row->{BEZEICHNUNG};
 | ||
| ... | ... | |
|       keys %$groessen_staffel_row;
 | ||
|   }
 | ||
|  | ||
|   die "end";
 | ||
|  | ||
|   my %partsgroup_name_to_partsgroup = map {$_->partsgroup => $_} @{SL::DB::Manager::PartsGroup->get_all()};
 | ||
|   my %vendor_name_to_vendor = map {$_->name => $_} @{SL::DB::Manager::Vendor->get_all()};
 | ||
|   my %warehouse_description_to_warehouse = map {$_->description => $_} @{SL::DB::Manager::Warehouse->get_all()};
 | ||
|   my %partsgroup_name_to_partsgroup = map {lc($_->partsgroup) => $_} @{SL::DB::Manager::PartsGroup->get_all()};
 | ||
|   my %vendor_name_to_vendor = map {lc($_->name) => $_} @{SL::DB::Manager::Vendor->get_all()};
 | ||
|   my %warehouse_description_to_warehouse = map {lc($_->description) => $_} @{SL::DB::Manager::Warehouse->get_all()};
 | ||
|  | ||
|   my @all_variant_properties = @{SL::DB::Manager::VariantProperty->get_all()};
 | ||
|   # create parts
 | ||
| ... | ... | |
|       my $vendor_name = $first_part->{vendor_name};
 | ||
|       my $makemodel_model = $first_part->{makemodel_model};
 | ||
|       my $best_sellprice = first {$_} sort map {$_->{sellprice}} @$grouped_variant_values;
 | ||
|       my $partsgroup = $partsgroup_name_to_partsgroup{$partsgroup_name} or die
 | ||
|       $best_sellprice =~ s/,/./;
 | ||
|       my $partsgroup = $partsgroup_name_to_partsgroup{lc($partsgroup_name)} or die
 | ||
|         die "Could not find partsgroup '$partsgroup_name' for part '$makemodel_model $description'";
 | ||
|       my $vendor = $vendor_name_to_vendor{$vendor_name} or
 | ||
|       my $vendor = $vendor_name_to_vendor{lc($vendor_name)} or
 | ||
|         die "Could not find vendor: '$vendor_name' for part '$makemodel_model $description'";
 | ||
|       my $warehouse = $warehouse_description_to_warehouse{$warehouse_description} or
 | ||
|       my $warehouse = $warehouse_description_to_warehouse{lc($warehouse_description)} or
 | ||
|         die "Could not find warehouse '$warehouse_description' for part '$makemodel_model $description'";
 | ||
|       my $parent_variant = SL::DB::Part->new_parent_variant(
 | ||
|         description => $description,
 | ||
| ... | ... | |
|           @all_variant_properties;
 | ||
|  | ||
|         if (scalar @{$best_match->{missing}}) {
 | ||
|           die "Could not find variant property with values '@{$needed_property_values}'.\n" .
 | ||
|           die "Could not find variant property with values for $property_name '@{$needed_property_values}' of part '$makemodel_model $description'.\n" .
 | ||
|           "Best match is ${\$best_match->{property}->name} with missing values '@{$best_match->{missing}}'";
 | ||
|         }
 | ||
|         $property_name_to_variant_property{$property_name} = $best_match->{property};
 | ||
| ... | ... | |
|  | ||
|         my $variant = $parent_variant->create_new_variant(\@property_values);
 | ||
|  | ||
|         my $sellprice = $variant_values->{sellprice};
 | ||
|         $sellprice =~ s/,/./;
 | ||
|         $variant->update_attributes(
 | ||
|           ean => $variant_values->{ean},
 | ||
|           description => $variant_values->{description},
 | ||
|           sellprice => $variant_values->{sellprice},
 | ||
|           sellprice => $sellprice,
 | ||
|         );
 | ||
|  | ||
|         # set stock
 | ||
Auch abrufbar als: Unified diff
kuw: CSV-Import-Script um Farbtabellen erweitert