|
Lines 30-35
use C4::Context;
Link Here
|
| 30 |
use C4::Circulation; |
30 |
use C4::Circulation; |
| 31 |
use C4::Koha; |
31 |
use C4::Koha; |
| 32 |
use C4::ClassSource; |
32 |
use C4::ClassSource; |
|
|
33 |
use C4::Barcodes; |
| 34 |
use C4::Barcodes::ValueBuilder; |
| 33 |
use Koha::DateUtils; |
35 |
use Koha::DateUtils; |
| 34 |
use Koha::Items; |
36 |
use Koha::Items; |
| 35 |
use Koha::ItemTypes; |
37 |
use Koha::ItemTypes; |
|
Lines 475-494
if ($prefillitem) {
Link Here
|
| 475 |
} |
477 |
} |
| 476 |
|
478 |
|
| 477 |
#------------------------------------------------------------------------------- |
479 |
#------------------------------------------------------------------------------- |
|
|
480 |
my $current_item; |
| 478 |
if ($op eq "additem") { |
481 |
if ($op eq "additem") { |
| 479 |
|
482 |
|
| 480 |
#------------------------------------------------------------------------------- |
|
|
| 481 |
# rebuild |
| 482 |
my @tags = $input->multi_param('tag'); |
| 483 |
my @subfields = $input->multi_param('subfield'); |
| 484 |
my @values = $input->multi_param('field_value'); |
| 485 |
# build indicator hash. |
| 486 |
my @ind_tag = $input->multi_param('ind_tag'); |
| 487 |
my @indicator = $input->multi_param('indicator'); |
| 488 |
my $xml = TransformHtmlToXml(\@tags,\@subfields,\@values,\@indicator,\@ind_tag, 'ITEM'); |
| 489 |
my $record = MARC::Record::new_from_xml($xml, 'UTF-8'); |
| 490 |
|
| 491 |
# type of add |
| 492 |
my $add_submit = $input->param('add_submit'); |
483 |
my $add_submit = $input->param('add_submit'); |
| 493 |
my $add_duplicate_submit = $input->param('add_duplicate_submit'); |
484 |
my $add_duplicate_submit = $input->param('add_duplicate_submit'); |
| 494 |
my $add_multiple_copies_submit = $input->param('add_multiple_copies_submit'); |
485 |
my $add_multiple_copies_submit = $input->param('add_multiple_copies_submit'); |
|
Lines 502-642
if ($op eq "additem") {
Link Here
|
| 502 |
$add_duplicate_submit = 1 if ($prefillitem); |
493 |
$add_duplicate_submit = 1 if ($prefillitem); |
| 503 |
$justaddeditem = 1; |
494 |
$justaddeditem = 1; |
| 504 |
|
495 |
|
| 505 |
# if autoBarcode is set to 'incremental', calculate barcode... |
496 |
my @columns = Koha::Items->columns; |
| 506 |
if ( C4::Context->preference('autoBarcode') eq 'incremental' ) { |
497 |
my $biblio = Koha::Biblios->find($biblionumber); |
| 507 |
$record = _increment_barcode($record, $frameworkcode); |
498 |
my $item = Koha::Item->new; |
|
|
499 |
$item->biblionumber($biblio->biblionumber); |
| 500 |
for my $c ( @columns ) { |
| 501 |
if ( $c eq 'more_subfields_xml' ) { |
| 502 |
my @more_subfields_xml = $input->multi_param("items.more_subfields_xml"); |
| 503 |
my @unlinked_item_subfields; |
| 504 |
for my $subfield ( @more_subfields_xml ) { |
| 505 |
my $v = $input->param('items.more_subfields_xml_' . $subfield); |
| 506 |
push @unlinked_item_subfields, $subfield, $v; |
| 507 |
} |
| 508 |
if ( @unlinked_item_subfields ) { |
| 509 |
my $marc = MARC::Record->new(); |
| 510 |
# use of tag 999 is arbitrary, and doesn't need to match the item tag |
| 511 |
# used in the framework |
| 512 |
$marc->append_fields(MARC::Field->new('999', ' ', ' ', @unlinked_item_subfields)); |
| 513 |
$marc->encoding("UTF-8"); |
| 514 |
$item->more_subfields_xml($marc->as_xml("USMARC")); |
| 515 |
next; |
| 516 |
} |
| 517 |
$item->more_subfields_xml(undef); |
| 518 |
} else { |
| 519 |
my $v = $input->param("items.".$c); |
| 520 |
next unless defined $v; |
| 521 |
$item->$c($v); |
| 522 |
} |
| 508 |
} |
523 |
} |
| 509 |
|
524 |
|
| 510 |
my $addedolditem = TransformMarcToKoha( $record ); |
525 |
# if autoBarcode is set to 'incremental', calculate barcode... |
|
|
526 |
if ( not $item->barcode && C4::Context->preference('autoBarcode') eq 'incremental' ) { |
| 527 |
my ( $barcode ) = C4::Barcodes::ValueBuilder::incremental::get_barcode; |
| 528 |
$item->barcode($barcode); |
| 529 |
} |
| 511 |
|
530 |
|
| 512 |
# If we have to add or add & duplicate, we add the item |
531 |
# If we have to add or add & duplicate, we add the item |
| 513 |
if ( $add_submit || $add_duplicate_submit ) { |
532 |
if ( $add_submit || $add_duplicate_submit ) { |
| 514 |
|
533 |
|
| 515 |
# check for item barcode # being unique |
534 |
# check for item barcode # being unique |
| 516 |
my $exist_itemnumber = get_item_from_barcode( $addedolditem->{'barcode'} ); |
535 |
if ( Koha::Items->search({ barcode => $item->barcode })->count ) { |
| 517 |
push @errors, "barcode_not_unique" if ($exist_itemnumber); |
536 |
# if barcode exists, don't create, but report The problem. |
| 518 |
|
537 |
push @errors, "barcode_not_unique"; |
| 519 |
# if barcode exists, don't create, but report The problem. |
538 |
} |
| 520 |
unless ($exist_itemnumber) { |
539 |
else { |
| 521 |
my ( $oldbiblionumber, $oldbibnum, $oldbibitemnum ) = AddItemFromMarc( $record, $biblionumber ); |
540 |
$item->store->discard_changes; |
| 522 |
|
541 |
|
| 523 |
# Pushing the last created item cookie back |
542 |
# FIXME This need to be rewritten, we must store $item->unblessed instead |
| 524 |
if ($prefillitem && defined $record) { |
543 |
## Pushing the last created item cookie back |
| 525 |
my $itemcookie = $input->cookie( |
544 |
#if ($prefillitem && defined $record) { |
| 526 |
-name => 'LastCreatedItem', |
545 |
# my $itemcookie = $input->cookie( |
| 527 |
# We encode_base64url the whole freezed structure so we're sure we won't have any encoding problems |
546 |
# -name => 'LastCreatedItem', |
| 528 |
-value => encode_base64url( freeze( $record ) ), |
547 |
# # We encode_base64url the whole freezed structure so we're sure we won't have any encoding problems |
| 529 |
-HttpOnly => 1, |
548 |
# -value => encode_base64url( freeze( $record ) ), |
| 530 |
-expires => '' |
549 |
# -HttpOnly => 1, |
| 531 |
); |
550 |
# -expires => '' |
| 532 |
|
551 |
# ); |
| 533 |
$cookie = [ $cookie, $itemcookie ]; |
552 |
|
| 534 |
} |
553 |
# $cookie = [ $cookie, $itemcookie ]; |
|
|
554 |
#} |
| 535 |
|
555 |
|
| 536 |
} |
556 |
} |
| 537 |
$nextop = "additem"; |
557 |
$nextop = "additem"; |
| 538 |
if ($exist_itemnumber) { |
558 |
|
| 539 |
$itemrecord = $record; |
559 |
|
| 540 |
} |
560 |
# FIXME reset item to the item we were editing |
|
|
561 |
#if ($exist_itemnumber) { |
| 562 |
|
| 563 |
# $itemrecord = $record; |
| 564 |
#} |
| 565 |
$current_item = $item->unblessed; |
| 541 |
} |
566 |
} |
| 542 |
|
567 |
|
| 543 |
# If we have to add & duplicate |
568 |
# If we have to add & duplicate |
| 544 |
if ($add_duplicate_submit) { |
569 |
if ($add_duplicate_submit) { |
| 545 |
$itemrecord = $record; |
|
|
| 546 |
if (C4::Context->preference('autoBarcode') eq 'incremental') { |
570 |
if (C4::Context->preference('autoBarcode') eq 'incremental') { |
| 547 |
$itemrecord = _increment_barcode($itemrecord, $frameworkcode); |
571 |
my ( $barcode ) = C4::Barcodes::ValueBuilder::incremental::get_barcode; |
|
|
572 |
$current_item->{barcode} = $barcode; |
| 548 |
} |
573 |
} |
| 549 |
else { |
574 |
else { |
| 550 |
# we have to clear the barcode field in the duplicate item record to make way for the new one generated by the javascript plugin |
575 |
# we have to clear the barcode field in the duplicate item record to make way for the new one generated by the javascript plugin |
| 551 |
my ($tagfield,$tagsubfield) = &GetMarcFromKohaField( "items.barcode" ); |
576 |
$current_item->{barcode} = undef; # FIXME or delete? |
| 552 |
my $fieldItem = $itemrecord->field($tagfield); |
|
|
| 553 |
$itemrecord->delete_field($fieldItem); |
| 554 |
$fieldItem->delete_subfields($tagsubfield); |
| 555 |
$itemrecord->insert_fields_ordered($fieldItem); |
| 556 |
} |
577 |
} |
| 557 |
$itemrecord = removeFieldsForPrefill($itemrecord) if ($prefillitem); |
578 |
# FIXME This subroutine needs to be adjusted |
|
|
579 |
# We want to pass $item |
| 580 |
# $itemrecord = removeFieldsForPrefill($itemrecord) if ($prefillitem); |
| 558 |
} |
581 |
} |
| 559 |
|
582 |
|
| 560 |
# If we have to add multiple copies |
583 |
# If we have to add multiple copies |
| 561 |
if ($add_multiple_copies_submit) { |
584 |
if ($add_multiple_copies_submit) { |
| 562 |
|
585 |
|
| 563 |
use C4::Barcodes; |
586 |
my $copynumber = $current_item->{copynumber}; |
| 564 |
my $barcodeobj = C4::Barcodes->new; |
587 |
my $oldbarcode = $current_item->{barcode}; |
| 565 |
my $copynumber = $addedolditem->{'copynumber'}; |
|
|
| 566 |
my $oldbarcode = $addedolditem->{'barcode'}; |
| 567 |
my ($tagfield,$tagsubfield) = &GetMarcFromKohaField( "items.barcode" ); |
| 568 |
my ($copytagfield,$copytagsubfield) = &GetMarcFromKohaField( "items.copynumber" ); |
| 569 |
|
588 |
|
| 570 |
# If there is a barcode and we can't find their new values, we can't add multiple copies |
589 |
# If there is a barcode and we can't find their new values, we can't add multiple copies |
| 571 |
my $testbarcode; |
590 |
my $testbarcode; |
|
|
591 |
my $barcodeobj = C4::Barcodes->new; |
| 572 |
$testbarcode = $barcodeobj->next_value($oldbarcode) if $barcodeobj; |
592 |
$testbarcode = $barcodeobj->next_value($oldbarcode) if $barcodeobj; |
| 573 |
if ($oldbarcode && !$testbarcode) { |
593 |
if ( $oldbarcode && !$testbarcode ) { |
| 574 |
|
594 |
|
| 575 |
push @errors, "no_next_barcode"; |
595 |
push @errors, "no_next_barcode"; |
| 576 |
$itemrecord = $record; |
596 |
$itemrecord = $record; |
| 577 |
|
|
|
| 578 |
} else { |
| 579 |
# We add each item |
| 580 |
|
597 |
|
| 581 |
# For the first iteration |
598 |
} |
| 582 |
my $barcodevalue = $oldbarcode; |
599 |
else { |
| 583 |
my $exist_itemnumber; |
600 |
# We add each item |
|
|
601 |
|
| 602 |
# For the first iteration |
| 603 |
my $barcodevalue = $oldbarcode; |
| 604 |
my $exist_itemnumber; |
| 605 |
|
| 606 |
for ( my $i = 0 ; $i < $number_of_copies ; ) { |
| 607 |
|
| 608 |
# If there is a barcode |
| 609 |
if ($barcodevalue) { |
| 610 |
|
| 611 |
# Getting a new barcode (if it is not the first iteration or the barcode we tried already exists) |
| 612 |
$barcodevalue = $barcodeobj->next_value($oldbarcode) |
| 613 |
if ( $i > 0 || $exist_itemnumber ); |
| 614 |
|
| 615 |
# Putting it into the record |
| 616 |
if ($barcodevalue) { |
| 617 |
if ( C4::Context->preference("autoBarcode") eq |
| 618 |
'hbyymmincr' && $i > 0 ) |
| 619 |
{ # The first copy already contains the homebranch prefix |
| 620 |
# This is terribly hacky but the easiest way to fix the way hbyymmincr is working |
| 621 |
# Contrary to what one might think, the barcode plugin does not prefix the returned string with the homebranch |
| 622 |
# For a single item, it is handled with some JS code (see cataloguing/value_builder/barcode.pl) |
| 623 |
# But when adding multiple copies we need to prefix it here, |
| 624 |
# so we retrieve the homebranch from the item and prefix the barcode with it. |
| 625 |
my $homebranch = $current_item->{homebranch}; |
| 626 |
$barcodevalue = $homebranch . $barcodevalue; |
| 627 |
} |
| 628 |
$current_item->{barcode} = $barcodevalue; |
| 629 |
} |
| 584 |
|
630 |
|
|
|
631 |
# Checking if the barcode already exists |
| 632 |
$exist_itemnumber = Koha::Items->search({ barcode => $barcodevalue })->count; |
| 633 |
} |
| 585 |
|
634 |
|
| 586 |
for (my $i = 0; $i < $number_of_copies;) { |
635 |
# Updating record with the new copynumber |
|
|
636 |
if ($copynumber) { |
| 637 |
$current_item->{copynumber} = $copynumber; |
| 638 |
} |
| 587 |
|
639 |
|
| 588 |
# If there is a barcode |
640 |
# Adding the item |
| 589 |
if ($barcodevalue) { |
641 |
if ( !$exist_itemnumber ) { |
|
|
642 |
delete $current_item->{itemnumber}; |
| 643 |
$current_item = Koha::Item->new($current_item)->store( |
| 644 |
{ skip_record_index => 1 } )->discard_changes->unblessed; |
| 645 |
set_item_default_location($current_item->{itemnumber}); |
| 590 |
|
646 |
|
| 591 |
# Getting a new barcode (if it is not the first iteration or the barcode we tried already exists) |
647 |
# We count the item only if it was really added |
| 592 |
$barcodevalue = $barcodeobj->next_value($oldbarcode) if ($i > 0 || $exist_itemnumber); |
648 |
# That way, all items are added, even if there was some already existing barcodes |
|
|
649 |
# FIXME : Please note that there is a risk of infinite loop here if we never find a suitable barcode |
| 650 |
$i++; |
| 593 |
|
651 |
|
| 594 |
# Putting it into the record |
652 |
# Only increment copynumber if item was really added |
| 595 |
if ($barcodevalue) { |
653 |
$copynumber++ if ( $copynumber && $copynumber =~ m/^\d+$/ ); |
| 596 |
if ( C4::Context->preference("autoBarcode") eq 'hbyymmincr' && $i > 0 ) { # The first copy already contains the homebranch prefix |
|
|
| 597 |
# This is terribly hacky but the easiest way to fix the way hbyymmincr is working |
| 598 |
# Contrary to what one might think, the barcode plugin does not prefix the returned string with the homebranch |
| 599 |
# For a single item, it is handled with some JS code (see cataloguing/value_builder/barcode.pl) |
| 600 |
# But when adding multiple copies we need to prefix it here, |
| 601 |
# so we retrieve the homebranch from the item and prefix the barcode with it. |
| 602 |
my ($hb_field, $hb_subfield) = GetMarcFromKohaField( "items.homebranch" ); |
| 603 |
my $homebranch = $record->subfield($hb_field, $hb_subfield); |
| 604 |
$barcodevalue = $homebranch . $barcodevalue; |
| 605 |
} |
654 |
} |
| 606 |
$record->field($tagfield)->update($tagsubfield => $barcodevalue); |
|
|
| 607 |
} |
| 608 |
|
| 609 |
# Checking if the barcode already exists |
| 610 |
$exist_itemnumber = get_item_from_barcode($barcodevalue); |
| 611 |
} |
| 612 |
# Updating record with the new copynumber |
| 613 |
if ( $copynumber ){ |
| 614 |
$record->field($copytagfield)->update($copytagsubfield => $copynumber); |
| 615 |
} |
| 616 |
|
| 617 |
# Adding the item |
| 618 |
if (!$exist_itemnumber) { |
| 619 |
my ( $oldbiblionumber, $oldbibnum, $oldbibitemnum ) = |
| 620 |
AddItemFromMarc( $record, $biblionumber, { skip_record_index => 1 } ); |
| 621 |
|
655 |
|
| 622 |
# We count the item only if it was really added |
656 |
# Preparing the next iteration |
| 623 |
# That way, all items are added, even if there was some already existing barcodes |
657 |
$oldbarcode = $barcodevalue; |
| 624 |
# FIXME : Please note that there is a risk of infinite loop here if we never find a suitable barcode |
658 |
} |
| 625 |
$i++; |
|
|
| 626 |
# Only increment copynumber if item was really added |
| 627 |
$copynumber++ if ( $copynumber && $copynumber =~ m/^\d+$/ ); |
| 628 |
} |
| 629 |
|
| 630 |
# Preparing the next iteration |
| 631 |
$oldbarcode = $barcodevalue; |
| 632 |
} |
| 633 |
|
659 |
|
| 634 |
my $indexer = Koha::SearchEngine::Indexer->new({ index => $Koha::SearchEngine::BIBLIOS_INDEX }); |
660 |
my $indexer = Koha::SearchEngine::Indexer->new( |
| 635 |
$indexer->index_records( $biblionumber, "specialUpdate", "biblioserver" ); |
661 |
{ index => $Koha::SearchEngine::BIBLIOS_INDEX } ); |
|
|
662 |
$indexer->index_records( $biblionumber, "specialUpdate", |
| 663 |
"biblioserver" ); |
| 636 |
|
664 |
|
| 637 |
undef($itemrecord); |
665 |
undef($current_item); |
| 638 |
} |
666 |
} |
| 639 |
} |
667 |
} |
| 640 |
if ($frameworkcode eq 'FA' && $fa_circborrowernumber){ |
668 |
if ($frameworkcode eq 'FA' && $fa_circborrowernumber){ |
| 641 |
print $input->redirect( |
669 |
print $input->redirect( |
| 642 |
'/cgi-bin/koha/circ/circulation.pl?' |
670 |
'/cgi-bin/koha/circ/circulation.pl?' |