Revision 8f374230
Von Tamino Steinert vor 10 Monaten hinzugefügt
scripts/import_variant_csv.pl | ||
---|---|---|
30 | 30 |
use SL::DB::Part; |
31 | 31 |
use SL::DB::PartsGroup; |
32 | 32 |
use SL::DB::VariantProperty; |
33 |
use SL::DB::VariantPropertyValue; |
|
33 | 34 |
use SL::DB::Warehouse; |
34 | 35 |
use SL::DB::Inventory; |
35 | 36 |
|
... | ... | |
37 | 38 |
|
38 | 39 |
chdir($FindBin::Bin . '/..'); |
39 | 40 |
|
40 |
my ($opt_user, $opt_client, $opt_part_csv_file); |
|
41 |
my ($opt_user, $opt_client, $opt_part_csv_file, $opt_groessen_staffeln_csv_file);
|
|
41 | 42 |
our (%myconfig, $form, $user, $employee, $auth, $locale); |
42 | 43 |
|
43 | 44 |
$opt_client = "variant"; |
44 | 45 |
$opt_user = "test_user"; |
45 | 46 |
|
46 |
# $opt_part_csv_file = "Artikel_Auswahl.csv";
|
|
47 |
$opt_part_csv_file = "Artikel_small.csv"; |
|
48 |
# $opt_part_csv_file = "Artikel_komplett.csv";
|
|
47 |
$opt_part_csv_file = "Artikel_komplett.csv";
|
|
48 |
|
|
49 |
$opt_groessen_staffeln_csv_file = "Größenstaffeln.csv";
|
|
49 | 50 |
|
50 | 51 |
|
51 | 52 |
$locale = Locale->new; |
... | ... | |
138 | 139 |
file => $opt_part_csv_file, |
139 | 140 |
encoding => 'utf-8', # undef means utf8 |
140 | 141 |
sep_char => ';', # default ';' |
141 |
quote_char => '"', # default '"' |
|
142 |
quote_char => '"', # default '"'
|
|
142 | 143 |
escape_char => '"', # default '"' |
143 | 144 |
); |
144 |
|
|
145 | 145 |
$part_csv->parse or die "Could not parse csv"; |
146 |
my $hrefs = $part_csv->get_data;
|
|
146 |
my $part_hrefs = $part_csv->get_data;
|
|
147 | 147 |
|
148 | 148 |
my %parent_variants_to_variants; |
149 |
foreach my $part_row (@$hrefs) { |
|
149 |
foreach my $part_row (@$part_hrefs) {
|
|
150 | 150 |
my %part = |
151 | 151 |
map {$parts_mapping{$_} => $part_row->{$_}} |
152 | 152 |
grep {$part_row->{$_}} |
153 | 153 |
keys %parts_mapping; |
154 | 154 |
|
155 | 155 |
if ($part{varianten_farbnummer} || $part{varianten_farbname}) { |
156 |
$part{varianten_farbnummer} ||= ''; |
|
157 |
$part{varianten_farbname} ||= ''; |
|
156 | 158 |
$part{varianten_farbe} = (delete $part{varianten_farbnummer}) . '-' . (delete $part{varianten_farbname}); |
157 | 159 |
} |
158 | 160 |
|
159 | 161 |
push @{$parent_variants_to_variants{$part_row->{LIEFERANT}}->{$part_row->{ARTIKELNR}}}, \%part; |
160 | 162 |
} |
161 | 163 |
|
162 |
my %variant_property_groups;
|
|
163 |
my @parent_variants;
|
|
164 |
my @variants;
|
|
165 |
|
|
166 |
my %partsgroup_name_to_partsgroup = map {$_->partsgroup => $_} @{SL::DB::Manager::PartsGroup->get_all()};
|
|
167 |
my %vendor_name_to_vendor = map {$_->name => $_} @{SL::DB::Manager::Vendor->get_all()};
|
|
168 |
my %warehouse_description_to_warehouse = map {$_->description => $_} @{SL::DB::Manager::Warehouse->get_all()};
|
|
169 |
|
|
170 |
my @all_variant_properties = @{SL::DB::Manager::VariantProperty->get_all()};
|
|
164 |
my $groessen_staffel_csv = SL::Helper::Csv->new(
|
|
165 |
file => $opt_groessen_staffeln_csv_file,
|
|
166 |
encoding => 'utf-8', # undef means utf8
|
|
167 |
sep_char => ';', # default ';' |
|
168 |
quote_char => '"', # default '"'
|
|
169 |
escape_char => '"', # default '"'
|
|
170 |
);
|
|
171 |
$groessen_staffel_csv->parse or die "Could not parse csv"; |
|
172 |
my $groessen_staffel_hrefs = $groessen_staffel_csv->get_data;
|
|
171 | 173 |
|
172 | 174 |
my $transfer_type = SL::DB::Manager::TransferType->find_by( |
173 | 175 |
direction => 'in', |
... | ... | |
175 | 177 |
) or die "Could no find transfer_type"; |
176 | 178 |
|
177 | 179 |
SL::DB->client->with_transaction(sub { |
178 |
foreach my $vendor (keys %parent_variants_to_variants) { |
|
179 |
foreach my $partnumber (keys %{$parent_variants_to_variants{$vendor}}) { |
|
180 |
my $grouped_variant_values = $parent_variants_to_variants{$vendor}->{$partnumber}; |
|
181 |
|
|
182 |
#get data for parent_variant |
|
183 |
my $first_part = $grouped_variant_values->[0]; |
|
184 |
my $description = $first_part->{description}; |
|
185 |
my $partsgroup_name = $first_part->{warengruppe}; |
|
186 |
my $warehouse_description = $first_part->{warehouse_description}; |
|
187 |
my $vendor_name = $first_part->{vendor_name}; |
|
188 |
my $makemodel_model = $first_part->{makemodel_model}; |
|
189 |
my $best_sellprice = first {$_} sort map {$_->{sellprice}} @$grouped_variant_values; |
|
190 |
my $partsgroup = $partsgroup_name_to_partsgroup{$partsgroup_name} or die |
|
191 |
die "Could not find partsgroup '$partsgroup_name' for part '$makemodel_model $description'"; |
|
192 |
my $vendor = $vendor_name_to_vendor{$vendor_name} or |
|
193 |
die "Could not find vendor: '$vendor_name' for part '$makemodel_model $description'"; |
|
194 |
my $warehouse = $warehouse_description_to_warehouse{$warehouse_description} or |
|
195 |
die "Could not find warehouse '$warehouse_description' for part '$makemodel_model $description'"; |
|
196 |
my $parent_variant = SL::DB::Part->new_parent_variant( |
|
197 |
description => $description, |
|
198 |
sellprice => $best_sellprice, |
|
199 |
partsgroup => $partsgroup, |
|
200 |
warehouse => $warehouse, |
|
201 |
bin => $warehouse->bins->[0], |
|
202 |
part_type => 'part', |
|
203 |
unit => 'Stck', |
|
204 |
); |
|
205 |
|
|
206 |
# add makemodel |
|
207 |
my $makemodel = SL::DB::MakeModel->new( |
|
208 |
make => $vendor->id, |
|
209 |
model => $makemodel_model, |
|
210 |
part_description => $description, |
|
211 |
); |
|
212 |
$parent_variant->add_makemodels($makemodel); |
|
213 |
|
|
214 |
# get active variant_properties |
|
215 |
my %group_variant_property_vales; |
|
216 |
foreach my $variant_values (@$grouped_variant_values) { |
|
217 |
$group_variant_property_vales{$_}->{$variant_values->{$_}} = 1 for |
|
218 |
grep { $_ =~ m/^variant/ } |
|
219 |
keys %$variant_values; |
|
220 |
} |
|
221 |
foreach my $variant_property (keys %group_variant_property_vales) { |
|
222 |
$group_variant_property_vales{$variant_property} = [sort keys %{$group_variant_property_vales{$variant_property}}]; |
|
223 |
} |
|
224 | 180 |
|
225 |
# find variant_properties |
|
226 |
my %property_name_to_variant_property; |
|
227 |
foreach my $property_name (keys %group_variant_property_vales) { |
|
228 |
# TODO find valid properties for partsgroup |
|
229 |
my $needed_property_values = $group_variant_property_vales{$property_name}; |
|
230 |
my ($best_match) = |
|
231 |
sort {scalar @{$a->{missing}} <=> scalar @{$b->{missing}}} |
|
232 |
map { |
|
233 |
my @property_values = map {$_->value} @{$_->property_values}; |
|
234 |
my @missing; |
|
235 |
foreach my $needed_property_value (@$needed_property_values) { |
|
236 |
push @missing, $needed_property_value unless scalar grep {$needed_property_value eq $_} @property_values; |
|
237 |
} |
|
238 |
{property => $_, missing => \@missing}; |
|
239 |
} |
|
240 |
@all_variant_properties; |
|
241 |
|
|
242 |
if (scalar @{$best_match->{missing}}) { |
|
243 |
die "Could not find variant property with values '@{$needed_property_values}'.\n" . |
|
244 |
"Best match is ${\$best_match->{property}->name} with missing values '@{$best_match->{missing}}'"; |
|
245 |
} |
|
246 |
$property_name_to_variant_property{$property_name} = $best_match->{property}; |
|
247 |
} |
|
248 |
my @variant_properties = values %property_name_to_variant_property; |
|
249 |
$parent_variant->variant_properties(@variant_properties); |
|
250 |
|
|
251 |
$parent_variant->save(); |
|
252 |
|
|
253 |
foreach my $variant_values (@$grouped_variant_values) { |
|
254 |
my @property_values = |
|
255 |
map { |
|
256 |
my $value = $variant_values->{$_}; |
|
257 |
first {$_->value eq $value} @{$property_name_to_variant_property{$_}->property_values}} |
|
258 |
grep { $_ =~ m/^variant/ } |
|
259 |
keys %$variant_values; |
|
181 |
# create groessen staffeln |
|
182 |
foreach my $groessen_staffel_row (@$groessen_staffel_hrefs) { |
|
183 |
my $name = delete $groessen_staffel_row->{BEZEICHNUNG}; |
|
184 |
my $variant_property = SL::DB::VariantProperty->new( |
|
185 |
name => $name, |
|
186 |
unique_name => $name, |
|
187 |
abbreviation => "gr", |
|
188 |
)->save; |
|
189 |
|
|
190 |
my $pos = 1; |
|
191 |
SL::DB::VariantPropertyValue->new( |
|
192 |
variant_property => $variant_property, |
|
193 |
value => $_, |
|
194 |
abbreviation => $_, |
|
195 |
sortkey => $pos++, |
|
196 |
)->save for |
|
197 |
map {$groessen_staffel_row->{$_}} |
|
198 |
sort |
|
199 |
grep {defined $groessen_staffel_row->{$_}} |
|
200 |
keys %$groessen_staffel_row; |
|
201 |
} |
|
260 | 202 |
|
261 |
my $variant = $parent_variant->create_new_variant(\@property_values); |
|
203 |
die "end"; |
|
204 |
|
|
205 |
my %partsgroup_name_to_partsgroup = map {$_->partsgroup => $_} @{SL::DB::Manager::PartsGroup->get_all()}; |
|
206 |
my %vendor_name_to_vendor = map {$_->name => $_} @{SL::DB::Manager::Vendor->get_all()}; |
|
207 |
my %warehouse_description_to_warehouse = map {$_->description => $_} @{SL::DB::Manager::Warehouse->get_all()}; |
|
208 |
|
|
209 |
my @all_variant_properties = @{SL::DB::Manager::VariantProperty->get_all()}; |
|
210 |
# create parts |
|
211 |
foreach my $vendor (keys %parent_variants_to_variants) { |
|
212 |
foreach my $partnumber (keys %{$parent_variants_to_variants{$vendor}}) { |
|
213 |
my $grouped_variant_values = $parent_variants_to_variants{$vendor}->{$partnumber}; |
|
214 |
|
|
215 |
#get data for parent_variant |
|
216 |
my $first_part = $grouped_variant_values->[0]; |
|
217 |
my $description = $first_part->{description}; |
|
218 |
my $partsgroup_name = $first_part->{warengruppe}; |
|
219 |
my $warehouse_description = $first_part->{warehouse_description}; |
|
220 |
my $vendor_name = $first_part->{vendor_name}; |
|
221 |
my $makemodel_model = $first_part->{makemodel_model}; |
|
222 |
my $best_sellprice = first {$_} sort map {$_->{sellprice}} @$grouped_variant_values; |
|
223 |
my $partsgroup = $partsgroup_name_to_partsgroup{$partsgroup_name} or die |
|
224 |
die "Could not find partsgroup '$partsgroup_name' for part '$makemodel_model $description'"; |
|
225 |
my $vendor = $vendor_name_to_vendor{$vendor_name} or |
|
226 |
die "Could not find vendor: '$vendor_name' for part '$makemodel_model $description'"; |
|
227 |
my $warehouse = $warehouse_description_to_warehouse{$warehouse_description} or |
|
228 |
die "Could not find warehouse '$warehouse_description' for part '$makemodel_model $description'"; |
|
229 |
my $parent_variant = SL::DB::Part->new_parent_variant( |
|
230 |
description => $description, |
|
231 |
sellprice => $best_sellprice, |
|
232 |
partsgroup => $partsgroup, |
|
233 |
warehouse => $warehouse, |
|
234 |
bin => $warehouse->bins->[0], |
|
235 |
part_type => 'part', |
|
236 |
unit => 'Stck', |
|
237 |
); |
|
262 | 238 |
|
263 |
$variant->update_attributes( |
|
264 |
ean => $variant_values->{ean}, |
|
265 |
description => $variant_values->{description}, |
|
266 |
sellprice => $variant_values->{sellprice}, |
|
239 |
# add makemodel |
|
240 |
my $makemodel = SL::DB::MakeModel->new( |
|
241 |
make => $vendor->id, |
|
242 |
model => $makemodel_model, |
|
243 |
part_description => $description, |
|
267 | 244 |
); |
245 |
$parent_variant->add_makemodels($makemodel); |
|
246 |
|
|
247 |
# get active variant_properties |
|
248 |
my %group_variant_property_vales; |
|
249 |
foreach my $variant_values (@$grouped_variant_values) { |
|
250 |
$group_variant_property_vales{$_}->{$variant_values->{$_}} = 1 for |
|
251 |
grep { $_ =~ m/^variant/ } |
|
252 |
keys %$variant_values; |
|
253 |
} |
|
254 |
foreach my $variant_property (keys %group_variant_property_vales) { |
|
255 |
$group_variant_property_vales{$variant_property} = [sort keys %{$group_variant_property_vales{$variant_property}}]; |
|
256 |
} |
|
268 | 257 |
|
269 |
# set stock |
|
270 |
my ($trans_id) = selectrow_query($::form, $::form->get_standard_dbh, qq|SELECT nextval('id')|); |
|
271 |
SL::DB::Inventory->new( |
|
272 |
part => $variant, |
|
273 |
trans_id => $trans_id, |
|
274 |
trans_type => $transfer_type, |
|
275 |
shippingdate => 'now()', |
|
276 |
comment => 'initialer Bestand', |
|
277 |
warehouse => $variant->warehouse, |
|
278 |
bin => $variant->bin, |
|
279 |
qty => $variant_values->{part_qty}, |
|
280 |
employee => $employee, |
|
281 |
)->save; |
|
258 |
# find variant_properties |
|
259 |
my %property_name_to_variant_property; |
|
260 |
foreach my $property_name (keys %group_variant_property_vales) { |
|
261 |
# TODO find valid properties for partsgroup |
|
262 |
my $needed_property_values = $group_variant_property_vales{$property_name}; |
|
263 |
my ($best_match) = |
|
264 |
sort {scalar @{$a->{missing}} <=> scalar @{$b->{missing}}} |
|
265 |
map { |
|
266 |
my @property_values = map {$_->value} @{$_->property_values}; |
|
267 |
my @missing; |
|
268 |
foreach my $needed_property_value (@$needed_property_values) { |
|
269 |
push @missing, $needed_property_value unless scalar grep {$needed_property_value eq $_} @property_values; |
|
270 |
} |
|
271 |
{property => $_, missing => \@missing}; |
|
272 |
} |
|
273 |
@all_variant_properties; |
|
274 |
|
|
275 |
if (scalar @{$best_match->{missing}}) { |
|
276 |
die "Could not find variant property with values '@{$needed_property_values}'.\n" . |
|
277 |
"Best match is ${\$best_match->{property}->name} with missing values '@{$best_match->{missing}}'"; |
|
278 |
} |
|
279 |
$property_name_to_variant_property{$property_name} = $best_match->{property}; |
|
280 |
} |
|
281 |
my @variant_properties = values %property_name_to_variant_property; |
|
282 |
$parent_variant->variant_properties(@variant_properties); |
|
283 |
|
|
284 |
$parent_variant->save(); |
|
285 |
|
|
286 |
foreach my $variant_values (@$grouped_variant_values) { |
|
287 |
my @property_values = |
|
288 |
map { |
|
289 |
my $value = $variant_values->{$_}; |
|
290 |
first {$_->value eq $value} @{$property_name_to_variant_property{$_}->property_values}} |
|
291 |
grep { $_ =~ m/^variant/ } |
|
292 |
keys %$variant_values; |
|
293 |
|
|
294 |
my $variant = $parent_variant->create_new_variant(\@property_values); |
|
295 |
|
|
296 |
$variant->update_attributes( |
|
297 |
ean => $variant_values->{ean}, |
|
298 |
description => $variant_values->{description}, |
|
299 |
sellprice => $variant_values->{sellprice}, |
|
300 |
); |
|
301 |
|
|
302 |
# set stock |
|
303 |
my ($trans_id) = selectrow_query($::form, $::form->get_standard_dbh, qq|SELECT nextval('id')|); |
|
304 |
SL::DB::Inventory->new( |
|
305 |
part => $variant, |
|
306 |
trans_id => $trans_id, |
|
307 |
trans_type => $transfer_type, |
|
308 |
shippingdate => 'now()', |
|
309 |
comment => 'initialer Bestand', |
|
310 |
warehouse => $variant->warehouse, |
|
311 |
bin => $variant->bin, |
|
312 |
qty => $variant_values->{part_qty}, |
|
313 |
employee => $employee, |
|
314 |
)->save; |
|
282 | 315 |
|
316 |
} |
|
283 | 317 |
} |
284 | 318 |
} |
285 |
} |
|
286 |
1; |
|
319 |
1; |
|
287 | 320 |
}) or do { |
288 | 321 |
die t8('Error while creating variants: '), SL::DB->client->error; |
289 | 322 |
}; |
Auch abrufbar als: Unified diff
kuw: CSV-Import-Script um Größenstaffeln erweitert