@@ -, +, @@ --- C4/Biblio.pm | 8 ++++++ C4/Items.pm | 1 + C4/Reserves.pm | 6 ++-- .../prog/en/modules/tools/batchMod-del.tt | 6 +++- tools/batchMod.pl | 27 ++++++++++++++----- 5 files changed, 37 insertions(+), 11 deletions(-) --- a/C4/Biblio.pm +++ a/C4/Biblio.pm @@ -35,6 +35,7 @@ use C4::Dates qw/format_date/; use C4::Log; # logaction use C4::ClassSource; use C4::Charset; + require C4::Heading; require C4::Serials; require C4::Items; @@ -423,6 +424,13 @@ sub DelBiblio { &C4::Serials::DelSubscription( $subscription->{subscriptionid} ); } + # We delete any existing holds + my ($count, $reserves) = C4::Reserves::GetReservesFromBiblionumber($biblionumber); + foreach my $res ( @$reserves ) { + warn Data::Dumper::Dumper( $res ); + C4::Reserves::CancelReserve( $res->{'biblionumber'}, $res->{'itemnumber'}, $res->{'borrowernumber'} ); + } + # Delete in Zebra. Be careful NOT to move this line after _koha_delete_biblio # for at least 2 reasons : # - we need to read the biblio if NoZebra is set (to remove it from the indexes --- a/C4/Items.pm +++ a/C4/Items.pm @@ -33,6 +33,7 @@ use C4::Branch; require C4::Reserves; use C4::Charset; use C4::Acquisition; +use C4::Search; use List::MoreUtils qw/any/; use Data::Dumper; # used as part of logging item record changes, not just for # debugging; so please don't remove this --- a/C4/Reserves.pm +++ a/C4/Reserves.pm @@ -98,7 +98,7 @@ BEGIN { &GetReservesToBranch &GetReserveCount &GetReserveFee - &GetReserveInfo + &GetReserveInfo &GetReserveStatus &GetOtherReserves @@ -880,8 +880,8 @@ sub CancelExpiredReserves { Cancels a reserve. Use either C<$biblionumber> or C<$itemnumber> to specify the item to -cancel, but not both: if both are given, C<&CancelReserve> does -nothing. +cancel, but not both: if both are given, C<&CancelReserve> uses +C<$itemnumber>. C<$borrowernumber> is the borrower number of the patron on whose behalf the book was reserved. --- a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/batchMod-del.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/batchMod-del.tt @@ -133,6 +133,7 @@ for( x=0; x [% IF ( too_many_items ) %][% ELSE %] +

[% END %] Cancel @@ -146,7 +147,10 @@ for( x=0; x

[% deleted_items %] item(s) deleted.

+
+

[% deleted_items %] item(s) deleted.

+ [% IF delete_records %]

[% deleted_records %] record(s) deleted.

[% END %] +
[% IF ( not_deleted_items ) %]

[% not_deleted_items %] item(s) could not be deleted: [% FOREACH not_deleted_itemnumber IN not_deleted_itemnumbers %][% not_deleted_itemnumber.itemnumber %][% END %]

--- a/tools/batchMod.pl +++ a/tools/batchMod.pl @@ -41,6 +41,7 @@ my $error = $input->param('error'); my @itemnumbers = $input->param('itemnumber'); my $op = $input->param('op'); my $del = $input->param('del'); +my $del_records = $input->param('del_records'); my $completedJobID = $input->param('completedJobID'); my $runinbackground = $input->param('runinbackground'); @@ -76,8 +77,9 @@ my $items_display_hashref; my $frameworkcode=""; my $tagslib = &GetMarcStructure(1,$frameworkcode); -my $deleted_items = 0; # Numbers of deleted items -my $not_deleted_items = 0; # Numbers of items that could not be deleted +my $deleted_items = 0; # Number of deleted items +my $deleted_records = 0; # Number of deleted records ( with no items attached ) +my $not_deleted_items = 0; # Number of items that could not be deleted my @not_deleted; # List of the itemnumbers that could not be deleted my %cookies = parse CGI::Cookie($cookie); @@ -156,7 +158,7 @@ if ($op eq "action") { foreach my $itemnumber(@itemnumbers){ $job->progress($i) if $runinbackground; - my $itemdata=GetItem($itemnumber); + my $itemdata = GetItem($itemnumber); if ($input->param("del")){ my $return = DelItemCheck(C4::Context->dbh, $itemdata->{'biblionumber'}, $itemdata->{'itemnumber'}); if ($return == 1) { @@ -171,15 +173,24 @@ if ($op eq "action") { $return => 1 }; } + + # If there are no items left, delete the biblio + if ( $del_records ) { + my $itemscount = GetItemsCount($itemdata->{'biblionumber'}); + if ( $itemscount == 0 ) { + my $error = DelBiblio($itemdata->{'biblionumber'}); + $deleted_records++ unless ( $error ); + } + } } else { if ($values_to_modify || $values_to_blank) { my $localmarcitem = Item2Marc($itemdata); UpdateMarcWith( $marcitem, $localmarcitem ); eval{ - if ( my $item = ModItemFromMarc( $localmarcitem, $itemdata->{biblionumber}, $itemnumber ) ) { - LostItem($itemnumber, 'MARK RETURNED', 'CHARGE FEE') if $item->{itemlost}; - } - }; + if ( my $item = ModItemFromMarc( $localmarcitem, $itemdata->{biblionumber}, $itemnumber ) ) { + LostItem($itemnumber, 'MARK RETURNED', 'CHARGE FEE') if $item->{itemlost}; + } + }; } } $i++; @@ -432,6 +443,8 @@ if ($op eq "action") { $template->param( not_deleted_items => $not_deleted_items, deleted_items => $deleted_items, + delete_records => $del_records, + deleted_records => $deleted_records, not_deleted_loop => \@not_deleted ); } --