@@ -, +, @@ deletion tool --- C4/Members.pm | 14 +++++ .../prog/en/modules/patron_lists/lists.tt | 24 +++++++- .../prog/en/modules/tools/cleanborrowers.tt | 30 +++++++--- tools/cleanborrowers.pl | 69 ++++++++++++++-------- 4 files changed, 101 insertions(+), 36 deletions(-) --- a/C4/Members.pm +++ a/C4/Members.pm @@ -40,6 +40,7 @@ use Koha::Borrower::Debarments qw(IsDebarred); use Text::Unaccent qw( unac_string ); use Koha::AuthUtils qw(hash_password); use Koha::Database; +use Koha::List::Patron; use Module::Load::Conditional qw( can_load ); if ( ! can_load( modules => { 'Koha::NorwegianPatronDB' => undef } ) ) { @@ -1977,6 +1978,7 @@ sub GetHideLostItemsPreference { not_borrowered_since => $not_borrowered_since, expired_before => $expired_before, category_code => $category_code, + patron_list_id => $patron_list_id, branchcode => $branchcode ); @@ -1985,8 +1987,20 @@ sub GetHideLostItemsPreference { =cut sub GetBorrowersToExpunge { + my $params = shift; + if ( $params->{'patron_list_id'} ) { + my $patron_list_id = $params->{'patron_list_id'}; + my @patron_list = GetPatronLists( {patron_list_id=>$patron_list_id}); + my @patron_list_patrons = $patron_list[0]->patron_list_patrons(); + my $issues; + @patron_list_patrons = map { + (undef, $issues, undef) = GetMemberIssuesAndFines( $_->{borrowernumber} || $_->get_column('borrowernumber') ); + ($issues != 0) ? (): ($_); + } @patron_list_patrons; + return \@patron_list_patrons; + } my $filterdate = $params->{'not_borrowered_since'}; my $filterexpiry = $params->{'expired_before'}; my $filtercategory = $params->{'category_code'}; --- a/koha-tmpl/intranet-tmpl/prog/en/modules/patron_lists/lists.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/patron_lists/lists.tt @@ -47,6 +47,12 @@       + [% IF CAN_user_tools_edit_patrons %] +   + [% END %] + [% IF CAN_user_tools_delete_anonymize_patrons %] +   + [% END %] @@ -57,7 +63,7 @@ [% l.patron_list_patrons_rs.count || 0 %] - Add patrons + Add patrons @@ -72,9 +78,23 @@ - Print patron cards + Print patron cards + [% IF CAN_user_tools_edit_patrons %] + + + Edit patrons + + + [% END %] + [% IF CAN_user_tools_delete_anonymize_patrons %] + + + Delete patrons + + + [% END %] [% END %] --- a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/cleanborrowers.tt +++ a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/cleanborrowers.tt @@ -12,7 +12,7 @@ */ function checkForm(form) { if((form.checkbox[0].checked)){ - if ( (!form.date1.value) && (!form.borrower_dateexpiry.value) && (!form.borrower_categorycode.value) ){ + if ( (!form.date1.value) && (!form.borrower_dateexpiry.value) && (!form.borrower_categorycode.value) && (!form.patron_list_id.value)){ alert(_("Please enter at least one criterion for deletion!")); return false; } @@ -88,8 +88,21 @@ [% END %] + [% IF patron_lists %] +
  • + + + If using a patron list, no other criteria will be used. +
  • + [% END %] +
    Anonymize checkout history [% UNLESS Koha.Preference('AnonymousPatron') %] @@ -121,12 +134,12 @@
    Warnings
    - [% IF ( totalToDelete ) %] + [% IF patrons_to_delete.size %]
    What do you want to do for deleted patrons? @@ -136,12 +149,12 @@
    -
    +
    [% END %] - [% IF ( totalToAnonymize ) %] - Checkout history for [% totalToAnonymize %] patrons will be anonymized - + [% IF patrons_to_anonymize.size %] + Checkout history for [% patrons_to_anonymize.size %] patrons will be anonymized + [% END %] @@ -149,6 +162,7 @@ +
    Cancel
    --- a/tools/cleanborrowers.pl +++ a/tools/cleanborrowers.pl @@ -40,7 +40,9 @@ use C4::Output; use C4::Members; # GetBorrowersWhoHavexxxBorrowed. use C4::Circulation; # AnonymiseIssueHistory. use Koha::DateUtils qw( dt_from_string output_pref ); +use Koha::Database; use Date::Calc qw/Today Add_Delta_YM/; +use Koha::List::Patron; my $cgi = new CGI; @@ -63,6 +65,7 @@ my $borrower_dateexpiry = $params->{borrower_dateexpiry} ? dt_from_string $params->{borrower_dateexpiry} : undef; +my $patron_list_id = $params->{patron_list_id}; my $borrower_categorycode = $params->{'borrower_categorycode'} || q{}; @@ -80,28 +83,28 @@ if ( $step == 2 ) { my %checkboxes = map { $_ => 1 } split /\0/, $params->{'checkbox'}; - my $totalDel; - my $membersToDelete; + my $patrons_to_delete; if ( $checkboxes{borrower} ) { - $membersToDelete = GetBorrowersToExpunge( - _get_selection_params($not_borrowered_since, $borrower_dateexpiry, $borrower_categorycode) + $patrons_to_delete = GetBorrowersToExpunge( + _get_selection_params( + $not_borrowered_since, + $borrower_dateexpiry, + $borrower_categorycode, + $patron_list_id, + ) ); - _skip_borrowers_with_nonzero_balance( $membersToDelete ); - $totalDel = scalar @$membersToDelete; + } + _skip_borrowers_with_nonzero_balance($patrons_to_delete); - } - my $totalAno; - my $membersToAnonymize; + my $members_to_anonymize; if ( $checkboxes{issue} ) { - $membersToAnonymize = GetBorrowersWithIssuesHistoryOlderThan($last_issue_date); - $totalAno = scalar @$membersToAnonymize; + $members_to_anonymize = GetBorrowersWithIssuesHistoryOlderThan($last_issue_date); } $template->param( - totalToDelete => $totalDel, - totalToAnonymize => $totalAno, - memberstodelete_list => $membersToDelete, - memberstoanonymize_list => $membersToAnonymize, + patrons_to_delete => $patrons_to_delete, + patrons_to_anonymize => $members_to_anonymize, + patron_list_id => $patron_list_id, ); } @@ -113,18 +116,23 @@ elsif ( $step == 3 ) { # delete members if ($do_delete) { - my $membersToDelete = GetBorrowersToExpunge( - _get_selection_params($not_borrowered_since, $borrower_dateexpiry, $borrower_categorycode) - ); - _skip_borrowers_with_nonzero_balance( $membersToDelete ); - $totalDel = scalar(@$membersToDelete); + my $patrons_to_delete = GetBorrowersToExpunge( + _get_selection_params( + $not_borrowered_since, $borrower_dateexpiry, + $borrower_categorycode, $patron_list_id + ) + ); + _skip_borrowers_with_nonzero_balance($patrons_to_delete); + + $totalDel = scalar(@$patrons_to_delete); $radio = $params->{'radio'}; for ( my $i = 0 ; $i < $totalDel ; $i++ ) { $radio eq 'testrun' && last; - my $borrowernumber = $membersToDelete->[$i]->{'borrowernumber'}; - $radio eq 'trash' && MoveMemberToDeleted( $borrowernumber ); - C4::Members::HandleDelBorrower( $borrowernumber ); - DelMember( $borrowernumber ); + my $borrowernumber = $patrons_to_delete->[$i]->{'borrowernumber'} + || $patrons_to_delete->[$i]->get_column('borrowernumber'); + $radio eq 'trash' && MoveMemberToDeleted($borrowernumber); + C4::Members::HandleDelBorrower($borrowernumber); + DelMember($borrowernumber); } $template->param( do_delete => '1', @@ -145,6 +153,14 @@ elsif ( $step == 3 ) { trash => ( $radio eq "trash" ) ? (1) : (0), testrun => ( $radio eq "testrun" ) ? 1: 0, ); +} else { # $step == 1 + my @all_lists = GetPatronLists(); + my @non_empty_lists; + foreach my $list (@all_lists){ + my @patrons = $list->patron_list_patrons(); + if( scalar @patrons ) { push(@non_empty_lists,$list) } + } + $template->param( patron_lists => [ @non_empty_lists ] ); } $template->param( @@ -163,13 +179,13 @@ sub _skip_borrowers_with_nonzero_balance { my $borrowers = shift; my $balance; @$borrowers = map { - (undef, undef, $balance) = GetMemberIssuesAndFines( $_->{borrowernumber} ); + (undef, undef, $balance) = GetMemberIssuesAndFines( $_->{borrowernumber} || $_->get_column('borrowernumber') ); ($balance != 0) ? (): ($_); } @$borrowers; } sub _get_selection_params { - my ($not_borrowered_since, $borrower_dateexpiry, $borrower_categorycode) = @_; + my ($not_borrowered_since, $borrower_dateexpiry, $borrower_categorycode, $patron_list_id) = @_; my $params = {}; $params->{not_borrowered_since} = output_pref({ @@ -183,6 +199,7 @@ sub _get_selection_params { dateonly => 1 }) if $borrower_dateexpiry; $params->{category_code} = $borrower_categorycode if $borrower_categorycode; + $params->{patron_list_id} = $patron_list_id if $patron_list_id; return $params; }; --