Lines 325-330
sub _stage_file {
Link Here
|
325 |
}; |
325 |
}; |
326 |
} |
326 |
} |
327 |
|
327 |
|
|
|
328 |
=head3 _get_MarcFieldsToOrder_syspref_data |
329 |
|
330 |
my $marc_fields_to_order = _get_MarcFieldsToOrder_syspref_data('MarcFieldsToOrder', $marcrecord, $fields); |
331 |
|
332 |
Fetches data from a marc record based on the mappings in the syspref MarcFieldsToOrder using the fields selected in $fields (array). |
333 |
|
334 |
=cut |
335 |
|
336 |
sub _get_MarcFieldsToOrder_syspref_data { |
337 |
my ($syspref_name, $record, $field_list) = @_; |
338 |
my $syspref = C4::Context->preference($syspref_name); |
339 |
$syspref = "$syspref\n\n"; |
340 |
my $yaml = eval { |
341 |
YAML::XS::Load(Encode::encode_utf8($syspref)); |
342 |
}; |
343 |
if ( $@ ) { |
344 |
warn "Unable to parse $syspref syspref : $@"; |
345 |
return (); |
346 |
} |
347 |
my $r; |
348 |
for my $field_name ( @$field_list ) { |
349 |
next unless exists $yaml->{$field_name}; |
350 |
my @fields = split /\|/, $yaml->{$field_name}; |
351 |
for my $field ( @fields ) { |
352 |
my ( $f, $sf ) = split /\$/, $field; |
353 |
next unless $f and $sf; |
354 |
if ( my $v = $record->subfield( $f, $sf ) ) { |
355 |
$r->{$field_name} = $v; |
356 |
} |
357 |
last if $yaml->{$field}; |
358 |
} |
359 |
} |
360 |
return $r; |
361 |
} |
362 |
|
328 |
=head3 _get_MarcItemFieldsToOrder_syspref_data |
363 |
=head3 _get_MarcItemFieldsToOrder_syspref_data |
329 |
|
364 |
|
330 |
my $marc_item_fields_to_order = _get_MarcItemFieldsToOrder_syspref_data('MarcItemFieldsToOrder', $marcrecord, $fields); |
365 |
my $marc_item_fields_to_order = _get_MarcItemFieldsToOrder_syspref_data('MarcItemFieldsToOrder', $marcrecord, $fields); |
Lines 359-366
sub _get_MarcItemFieldsToOrder_syspref_data {
Link Here
|
359 |
} |
394 |
} |
360 |
@tags_list = List::MoreUtils::uniq(@tags_list); |
395 |
@tags_list = List::MoreUtils::uniq(@tags_list); |
361 |
|
396 |
|
362 |
die "System preference MarcItemFieldsToOrder has not been filled in. Please set the mapping values to use this cron script." if scalar(@tags_list == 0); |
|
|
363 |
|
364 |
my $tags_count = _verify_number_of_fields(\@tags_list, $record); |
397 |
my $tags_count = _verify_number_of_fields(\@tags_list, $record); |
365 |
# Return if the number of these fields in the record is not the same. |
398 |
# Return if the number of these fields in the record is not the same. |
366 |
die "Invalid number of fields detected on field $tags_count->{key}, please check this file" if $tags_count->{error}; |
399 |
die "Invalid number of fields detected on field $tags_count->{key}, please check this file" if $tags_count->{error}; |
Lines 375-395
sub _get_MarcItemFieldsToOrder_syspref_data {
Link Here
|
375 |
$fields_hash->{$tag} = \@tmp_fields; |
408 |
$fields_hash->{$tag} = \@tmp_fields; |
376 |
} |
409 |
} |
377 |
|
410 |
|
378 |
for (my $i = 0; $i < $tags_count->{count}; $i++) { |
411 |
if($tags_count->{count}){ |
379 |
my $r; |
412 |
for (my $i = 0; $i < $tags_count->{count}; $i++) { |
380 |
for my $field_name ( @$field_list ) { |
413 |
my $r; |
381 |
next unless exists $yaml->{$field_name}; |
414 |
for my $field_name ( @$field_list ) { |
382 |
my @fields = split /\|/, $yaml->{$field_name}; |
415 |
next unless exists $yaml->{$field_name}; |
383 |
for my $field ( @fields ) { |
416 |
my @fields = split /\|/, $yaml->{$field_name}; |
384 |
my ( $f, $sf ) = split /\$/, $field; |
417 |
for my $field ( @fields ) { |
385 |
next unless $f and $sf; |
418 |
my ( $f, $sf ) = split /\$/, $field; |
386 |
my $v = $fields_hash->{$f}[$i] ? $fields_hash->{$f}[$i]->subfield( $sf ) : undef; |
419 |
next unless $f and $sf; |
387 |
$r->{$field_name} = $v if (defined $v); |
420 |
my $v = $fields_hash->{$f}[$i] ? $fields_hash->{$f}[$i]->subfield( $sf ) : undef; |
388 |
last if $yaml->{$field}; |
421 |
$r->{$field_name} = $v if (defined $v); |
|
|
422 |
last if $yaml->{$field}; |
423 |
} |
389 |
} |
424 |
} |
|
|
425 |
push @result, $r; |
390 |
} |
426 |
} |
391 |
push @result, $r; |
|
|
392 |
} |
427 |
} |
|
|
428 |
|
393 |
return $result[0]; |
429 |
return $result[0]; |
394 |
} |
430 |
} |
395 |
|
431 |
|
Lines 416-422
sub _verify_number_of_fields {
Link Here
|
416 |
return { error => 1, key => $key } if $tag_fields_count->{$key} != $tags_count; # All counts of various fields should be equal if they exist |
452 |
return { error => 1, key => $key } if $tag_fields_count->{$key} != $tags_count; # All counts of various fields should be equal if they exist |
417 |
} |
453 |
} |
418 |
} |
454 |
} |
419 |
|
|
|
420 |
return { error => 0, count => $tags_count }; |
455 |
return { error => 0, count => $tags_count }; |
421 |
} |
456 |
} |
422 |
|
457 |
|
Lines 539-544
sub add_items_from_import_record {
Link Here
|
539 |
my @order_line_details; |
574 |
my @order_line_details; |
540 |
|
575 |
|
541 |
if($agent eq 'cron') { |
576 |
if($agent eq 'cron') { |
|
|
577 |
my $marc_fields_to_order = _get_MarcFieldsToOrder_syspref_data('MarcFieldsToOrder', $marcrecord, ['price', 'quantity', 'budget_code', 'discount', 'sort1', 'sort2']); |
578 |
my $quantity = $marc_fields_to_order->{quantity}; |
579 |
my $budget_code = $marc_fields_to_order->{budget_code} || $budget_id; # Use fallback from ordering profile if not mapped |
580 |
my $price = $marc_fields_to_order->{price}; |
581 |
my $discount = $marc_fields_to_order->{discount}; |
582 |
my $sort1 = $marc_fields_to_order->{sort1}; |
583 |
my $sort2 = $marc_fields_to_order->{sort2}; |
584 |
my $mapped_budget; |
585 |
if($budget_code) { |
586 |
my $biblio_budget = GetBudgetByCode($budget_code); |
587 |
if($biblio_budget) { |
588 |
$mapped_budget = $biblio_budget->{budget_id}; |
589 |
} else { |
590 |
$mapped_budget = $budget_id; |
591 |
} |
592 |
} |
593 |
|
542 |
my $marc_item_fields_to_order = _get_MarcItemFieldsToOrder_syspref_data('MarcItemFieldsToOrder', $marcrecord, ['homebranch', 'holdingbranch', 'itype', 'nonpublic_note', 'public_note', 'loc', 'ccode', 'notforloan', 'uri', 'copyno', 'price', 'replacementprice', 'itemcallnumber', 'quantity', 'budget_code']); |
594 |
my $marc_item_fields_to_order = _get_MarcItemFieldsToOrder_syspref_data('MarcItemFieldsToOrder', $marcrecord, ['homebranch', 'holdingbranch', 'itype', 'nonpublic_note', 'public_note', 'loc', 'ccode', 'notforloan', 'uri', 'copyno', 'price', 'replacementprice', 'itemcallnumber', 'quantity', 'budget_code']); |
543 |
my $item_homebranch = $marc_item_fields_to_order->{homebranch}; |
595 |
my $item_homebranch = $marc_item_fields_to_order->{homebranch}; |
544 |
my $item_holdingbranch = $marc_item_fields_to_order->{holdingbranch}; |
596 |
my $item_holdingbranch = $marc_item_fields_to_order->{holdingbranch}; |
Lines 550-556
sub add_items_from_import_record {
Link Here
|
550 |
my $item_notforloan = $marc_item_fields_to_order->{notforloan}; |
602 |
my $item_notforloan = $marc_item_fields_to_order->{notforloan}; |
551 |
my $item_uri = $marc_item_fields_to_order->{uri}; |
603 |
my $item_uri = $marc_item_fields_to_order->{uri}; |
552 |
my $item_copyno = $marc_item_fields_to_order->{copyno}; |
604 |
my $item_copyno = $marc_item_fields_to_order->{copyno}; |
553 |
my $item_quantity = $marc_item_fields_to_order->{quantity}; |
605 |
my $item_quantity = $marc_item_fields_to_order->{quantity} || 0; |
554 |
my $item_budget_code = $marc_item_fields_to_order->{budget_code}; |
606 |
my $item_budget_code = $marc_item_fields_to_order->{budget_code}; |
555 |
my $item_budget_id; |
607 |
my $item_budget_id; |
556 |
if ( $marc_item_fields_to_order->{budget_code} ) { |
608 |
if ( $marc_item_fields_to_order->{budget_code} ) { |
Lines 566-578
sub add_items_from_import_record {
Link Here
|
566 |
my $item_price = $marc_item_fields_to_order->{price}; |
618 |
my $item_price = $marc_item_fields_to_order->{price}; |
567 |
my $item_replacement_price = $marc_item_fields_to_order->{replacementprice}; |
619 |
my $item_replacement_price = $marc_item_fields_to_order->{replacementprice}; |
568 |
my $item_callnumber = $marc_item_fields_to_order->{itemcallnumber}; |
620 |
my $item_callnumber = $marc_item_fields_to_order->{itemcallnumber}; |
569 |
|
621 |
my $itemcreation = 0; |
570 |
if(!$item_quantity) { |
|
|
571 |
my $isbn = $marcrecord->subfield( '020', "a" ); |
572 |
warn "No quantity found for record with ISBN: $isbn. No items will be added."; |
573 |
} |
574 |
|
622 |
|
575 |
for (my $i = 0; $i < $item_quantity; $i++) { |
623 |
for (my $i = 0; $i < $item_quantity; $i++) { |
|
|
624 |
$itemcreation = 1; |
576 |
my $item = Koha::Item->new({ |
625 |
my $item = Koha::Item->new({ |
577 |
biblionumber => $biblionumber, |
626 |
biblionumber => $biblionumber, |
578 |
homebranch => $item_homebranch, |
627 |
homebranch => $item_homebranch, |
Lines 592-599
sub add_items_from_import_record {
Link Here
|
592 |
|
641 |
|
593 |
my %order_detail_hash = ( |
642 |
my %order_detail_hash = ( |
594 |
biblionumber => $biblionumber, |
643 |
biblionumber => $biblionumber, |
595 |
itemnumbers => ($item->itemnumber), |
|
|
596 |
basketno => $basket_id, |
644 |
basketno => $basket_id, |
|
|
645 |
itemnumbers => ($item->itemnumber), |
597 |
quantity => 1, |
646 |
quantity => 1, |
598 |
budget_id => $item_budget_id, |
647 |
budget_id => $item_budget_id, |
599 |
currency => $vendor->listprice, |
648 |
currency => $vendor->listprice, |
Lines 615-620
sub add_items_from_import_record {
Link Here
|
615 |
|
664 |
|
616 |
push @order_line_details, \%order_detail_hash; |
665 |
push @order_line_details, \%order_detail_hash; |
617 |
} |
666 |
} |
|
|
667 |
|
668 |
if(!$itemcreation) { |
669 |
my %order_detail_hash = ( |
670 |
biblionumber => $biblionumber, |
671 |
basketno => $basket_id, |
672 |
quantity => $quantity, |
673 |
budget_id => $mapped_budget, |
674 |
uncertainprice => 1, |
675 |
sort1 => $sort1, |
676 |
sort2 => $sort2, |
677 |
); |
678 |
|
679 |
if ($price){ |
680 |
$order_detail_hash{tax_rate_on_ordering} = $vendor->tax_rate; |
681 |
$order_detail_hash{tax_rate_on_receiving} = $vendor->tax_rate; |
682 |
my $order_discount = $discount ? $discount : $vendor->discount; |
683 |
$order_detail_hash{discount} = $order_discount; |
684 |
$order_detail_hash{rrp} = $price; |
685 |
$order_detail_hash{ecost} = $order_discount ? $price * ( 1 - $order_discount / 100 ) : $price; |
686 |
$order_detail_hash{listprice} = $order_detail_hash{rrp} / $active_currency->rate; |
687 |
$order_detail_hash{unitprice} = $order_detail_hash{ecost}; |
688 |
} else { |
689 |
$order_detail_hash{listprice} = 0; |
690 |
} |
691 |
|
692 |
$order_detail_hash{uncertainprice} = 0 if $order_detail_hash{listprice}; |
693 |
push @order_line_details, \%order_detail_hash; |
694 |
} |
618 |
} |
695 |
} |
619 |
|
696 |
|
620 |
if($agent eq 'client') { |
697 |
if($agent eq 'client') { |
Lines 750-756
sub create_order_lines {
Link Here
|
750 |
my $order_line_details = $args->{order_line_details}; |
827 |
my $order_line_details = $args->{order_line_details}; |
751 |
|
828 |
|
752 |
foreach my $order_detail ( @{ $order_line_details } ) { |
829 |
foreach my $order_detail ( @{ $order_line_details } ) { |
753 |
my @itemnumbers = $order_detail->{itemnumbers}; |
830 |
my @itemnumbers = $order_detail->{itemnumbers} || (); |
754 |
delete($order_detail->{itemnumber}); |
831 |
delete($order_detail->{itemnumber}); |
755 |
my $order = Koha::Acquisition::Order->new( \%{ $order_detail } ); |
832 |
my $order = Koha::Acquisition::Order->new( \%{ $order_detail } ); |
756 |
$order->populate_with_prices_for_ordering(); |
833 |
$order->populate_with_prices_for_ordering(); |