@@ -, +, @@ --- C4/VirtualShelves.pm | 40 ++++++++++++++++++++++++++++++++++++++-- members/deletemem.pl | 2 ++ tools/cleanborrowers.pl | 5 ++++- 3 files changed, 44 insertions(+), 3 deletions(-) --- a/C4/VirtualShelves.pm +++ a/C4/VirtualShelves.pm @@ -522,8 +522,10 @@ sub DelFromShelf { } } if($del_oth) { - $query = qq(DELETE FROM virtualshelfcontents - WHERE shelfnumber=? AND biblionumber=? AND borrowernumber<>?); + #includes a check if borrowernumber is null (deleted patron) + $query = qq/DELETE FROM virtualshelfcontents + WHERE shelfnumber=? AND biblionumber=? AND + (borrowernumber IS NULL OR borrowernumber<>?)/; $sth= $dbh->prepare($query); foreach my $biblionumber (@$bibref) { $sth->execute($shelfnumber, $biblionumber, $user); @@ -591,6 +593,40 @@ sub ShelvesMax { return SHELVES_MASTHEAD_MAX; } +sub HandleDelBorrower { +#when a member is deleted (DelMember in Members.pm), you should call me first +#this routine deletes/moves lists and entries for the deleted member/borrower +#you could just delete everything (and lose more than you want) +#instead we now try to save all public/shared stuff and keep others happy + my ($borrower)= @_; + my $query; + my $dbh = C4::Context->dbh; + + #Delete shares of this borrower (not lists !) + $query="DELETE FROM virtualshelfshares WHERE borrowernumber=?"; + $dbh->do($query,undef,($borrower)); + + #Delete private lists without owner that now have no shares anymore + $query="DELETE vs.* FROM virtualshelves vs LEFT JOIN virtualshelfshares sh USING (shelfnumber) WHERE category=1 AND vs.owner IS NULL AND sh.shelfnumber IS NULL"; + $dbh->do($query); + + #Change owner for private lists which have shares + $query="UPDATE virtualshelves LEFT JOIN virtualshelfshares sh USING (shelfnumber) SET owner=NULL where owner=? AND category=1 AND sh.borrowernumber IS NOT NULL"; + $dbh->do($query,undef,($borrower)); + + #Delete unshared private lists + $query="DELETE FROM virtualshelves WHERE owner=? AND category=1"; + $dbh->do($query,undef,($borrower)); + + #Handle public lists owned by borrower + $query="UPDATE virtualshelves SET owner=NULL WHERE owner=? AND category=2"; + $dbh->do($query,undef,($borrower)); + + #Handle entries added by borrower to lists of others + $query="UPDATE virtualshelfcontents SET borrowernumber=NULL WHERE borrowernumber=?"; + $dbh->do($query,undef,($borrower)); +} + # internal subs sub _shelf_count { --- a/members/deletemem.pl +++ a/members/deletemem.pl @@ -30,6 +30,7 @@ use C4::Output; use C4::Auth; use C4::Members; use C4::Branch; # GetBranches +use C4::VirtualShelves (); #no import my $input = new CGI; @@ -117,6 +118,7 @@ output_html_with_http_headers $input, $cookie, $template->output; } else { MoveMemberToDeleted($member); + C4::VirtualShelves::HandleDelBorrower($member); DelMember($member); print $input->redirect("/cgi-bin/koha/members/members-home.pl"); } --- a/tools/cleanborrowers.pl +++ a/tools/cleanborrowers.pl @@ -40,6 +40,7 @@ use C4::Output; use C4::Dates qw/format_date format_date_in_iso/; use C4::Members; # GetBorrowersWhoHavexxxBorrowed. use C4::Circulation; # AnonymiseIssueHistory. +use C4::VirtualShelves (); #no import use Date::Calc qw/Today Add_Delta_YM/; my $cgi = new CGI; @@ -117,13 +118,15 @@ if ( $params->{'step3'} ) { my $i; for ( $i = 0 ; $i < $totalDel ; $i++ ) { MoveMemberToDeleted( $membersToDelete->[$i]->{'borrowernumber'} ); + C4::VirtualShelves::HandleDelBorrower($membersToDelete->[$i]->{'borrowernumber'}); DelMember( $membersToDelete->[$i]->{'borrowernumber'} ); } } else { # delete completly. my $i; for ( $i = 0 ; $i < $totalDel ; $i++ ) { - DelMember($membersToDelete->[$i]->{'borrowernumber'}); + C4::VirtualShelves::HandleDelBorrower($membersToDelete->[$i]->{'borrowernumber'}); + DelMember($membersToDelete->[$i]->{'borrowernumber'}); } } $template->param( --