@@ -, +, @@ item --- C4/Items.pm | 93 +++++++++++++++++++++---------- cataloguing/moveitem.pl | 50 ++++++++++------- t/db_dependent/Items/MoveItemFromBiblio.t | 10 ++-- 3 files changed, 101 insertions(+), 52 deletions(-) --- a/C4/Items.pm +++ a/C4/Items.pm @@ -1863,7 +1863,7 @@ sub _koha_new_item { =head2 MoveItemFromBiblio - MoveItemFromBiblio($itenumber, $frombiblio, $tobiblio); + MoveItemFromBiblio($itenumber, $frombiblio, $tobiblio, $bibliotoindex); Moves an item from a biblio to another @@ -1879,36 +1879,73 @@ sub MoveItemFromBiblio { FROM biblioitems WHERE biblionumber = ? |, undef, $tobiblio ); - my $return = $dbh->do(q| - UPDATE items - SET biblioitemnumber = ?, - biblionumber = ? - WHERE itemnumber = ? - AND biblionumber = ? - |, undef, $tobiblioitem, $tobiblio, $itemnumber, $frombiblio ); - if ($return == 1) { - ModZebra( $tobiblio, "specialUpdate", "biblioserver" ); - ModZebra( $frombiblio, "specialUpdate", "biblioserver" ); - # Checking if the item we want to move is in an order - require C4::Acquisition; - my $order = C4::Acquisition::GetOrderFromItemnumber($itemnumber); - if ($order) { - # Replacing the biblionumber within the order if necessary - $order->{'biblionumber'} = $tobiblio; - C4::Acquisition::ModOrder($order); - } - # Update reserves, hold_fill_targets, tmp_holdsqueue and linktracker tables - for my $table_name ( qw( reserves hold_fill_targets tmp_holdsqueue linktracker ) ) { - $dbh->do( qq| - UPDATE $table_name - SET biblionumber = ? + if ( defined $_[3]) { + my $bibliotoindex = $_[3]; + if ($bibliotoindex eq "new") { + my $return = $dbh->do(q| + UPDATE items + SET biblioitemnumber = ?, + biblionumber = ? WHERE itemnumber = ? - |, undef, $tobiblio, $itemnumber ); + AND biblionumber = ? + |, undef, $tobiblioitem, $tobiblio, $itemnumber, $frombiblio ); + if ($return == 1) { + ModZebra( $tobiblio, "specialUpdate", "biblioserver" ); + # Checking if the item we want to move is in an order + require C4::Acquisition; + my $order = C4::Acquisition::GetOrderFromItemnumber($itemnumber); + if ($order) { + # Replacing the biblionumber within the order if necessary + $order->{'biblionumber'} = $tobiblio; + C4::Acquisition::ModOrder($order); + } + + # Update reserves, hold_fill_targets, tmp_holdsqueue and linktracker tables + for my $table_name ( qw( reserves hold_fill_targets tmp_holdsqueue linktracker ) ) { + $dbh->do( qq| + UPDATE $table_name + SET biblionumber = ? + WHERE itemnumber = ? + |, undef, $tobiblio, $itemnumber ); + } + return $tobiblio; + } + } elsif ($bibliotoindex eq "old") { + ModZebra( $frombiblio, "specialUpdate", "biblioserver" ); + return 1; } - return $tobiblio; - } - return; + } else { + my $return = $dbh->do(q| + UPDATE items + SET biblioitemnumber = ?, + biblionumber = ? + WHERE itemnumber = ? + AND biblionumber = ? + |, undef, $tobiblioitem, $tobiblio, $itemnumber, $frombiblio ); + if ($return == 1) { + ModZebra( $tobiblio, "specialUpdate", "biblioserver" ); + ModZebra( $frombiblio, "specialUpdate", "biblioserver" ); + # Checking if the item we want to move is in an order + require C4::Acquisition; + my $order = C4::Acquisition::GetOrderFromItemnumber($itemnumber); + if ($order) { + # Replacing the biblionumber within the order if necessary + $order->{'biblionumber'} = $tobiblio; + C4::Acquisition::ModOrder($order); + } + # Update reserves, hold_fill_targets, tmp_holdsqueue and linktracker tables + for my $table_name ( qw( reserves hold_fill_targets tmp_holdsqueue linktracker ) ) { + $dbh->do( qq| + UPDATE $table_name + SET biblionumber = ? + WHERE itemnumber = ? + |, undef, $tobiblio, $itemnumber ); + } + return $tobiblio; + } + return; + } } =head2 ItemSafeToDelete --- a/cataloguing/moveitem.pl +++ a/cataloguing/moveitem.pl @@ -65,7 +65,7 @@ $template->param(bibliotitle => $biblio->title); $template->param(biblionumber => $biblionumber); # If we already have the barcode of the item to move and the biblionumber to move the item to -if ($barcode && $biblionumber) { +if ($barcode && $biblionumber) { my $itemnumber; my $item = Koha::Items->find({ barcode => $barcode }); @@ -74,25 +74,35 @@ if ($barcode && $biblionumber) { $itemnumber = $item->itemnumber; my $frombiblionumber = $item->biblionumber; - - my $moveresult = MoveItemFromBiblio($itemnumber, $frombiblionumber, $biblionumber); - if ($moveresult) { - $template->param(success => 1); - } else { - $template->param(error => 1, - errornonewitem => 1); - } - - - } else { - $template->param(error => 1, - errornoitem => 1); - } - $template->param( - barcode => $barcode, - itemnumber => $itemnumber, - ); - + my @bibliostoindex = ("new", "old"); + my $moveresult; + foreach my $bibliotoindex (@bibliostoindex) { + if ($bibliotoindex eq "new") { + $moveresult = MoveItemFromBiblio($itemnumber, $frombiblionumber, $biblionumber, $bibliotoindex); + if ($moveresult) { + $template->param(success => 1); + } else { + $template->param(error => 1, + errornonewitem => 1); + } + } elsif ($bibliotoindex eq "old" && $moveresult) { + my $moveresult = MoveItemFromBiblio($itemnumber, $frombiblionumber, $biblionumber, $bibliotoindex); + if ($moveresult) { + $template->param(success => 1); + } else { + $template->param(error => 1, + errornonewitem => 1); + } + } + } + } else { + $template->param(error => 1, + errornoitem => 1); + } + $template->param( + barcode => $barcode, + itemnumber => $itemnumber, + ); } else { $template->param(missingparameter => 1); if (!$barcode) { $template->param(missingbarcode => 1); } --- a/t/db_dependent/Items/MoveItemFromBiblio.t +++ a/t/db_dependent/Items/MoveItemFromBiblio.t @@ -16,7 +16,7 @@ # along with Koha; if not, see . use Modern::Perl; -use Test::More tests => 8; +use Test::More tests => 9; use C4::Items; use C4::Reserves; @@ -71,11 +71,13 @@ my $item_level_hold_to_move = $builder->build( } ); -my $to_biblionumber_after_moved = C4::Items::MoveItemFromBiblio( $item2->{itemnumber}, $from_biblio->{biblionumber}, $to_biblio->{biblionumber} ); +my $to_biblionumber_index_new_biblio = C4::Items::MoveItemFromBiblio( $item2->{itemnumber}, $from_biblio->{biblionumber}, $to_biblio->{biblionumber}, "new" ); +my $to_biblionumber_index_old_biblio = C4::Items::MoveItemFromBiblio( $item2->{itemnumber}, $from_biblio->{biblionumber}, $to_biblio->{biblionumber}, "old" ); -is( $to_biblionumber_after_moved, $to_biblio->{biblionumber}, 'MoveItemFromBiblio should return the to_biblionumber if success' ); +is( $to_biblionumber_index_new_biblio, $to_biblio->{biblionumber}, 'MoveItemFromBiblio should return the to_biblionumber if success' ); +is( $to_biblionumber_index_old_biblio, 1 , 'MoveItemFromBiblio should return the value 1 if the old biblio has been indexed if success' ); -$to_biblionumber_after_moved = C4::Items::MoveItemFromBiblio( $item2->{itemnumber}, $from_biblio->{biblionumber}, $to_biblio->{biblionumber} ); +my $to_biblionumber_after_moved = C4::Items::MoveItemFromBiblio( $item2->{itemnumber}, $from_biblio->{biblionumber}, $to_biblio->{biblionumber} ); is( $to_biblionumber_after_moved, undef, 'MoveItemFromBiblio should return undef if the move has failed. If called twice, the item is not attached to the first biblio anymore' ); --