Merge branch 'bug_10230' into 3.14-master
[koha.git] / tools / cleanborrowers.pl
index d845d1d..0d48b99 100755 (executable)
@@ -17,8 +17,6 @@
 #
 #   Written by Antoine Farnault antoine@koha-fr.org on Nov. 2006.
 
-# $Id$
-
 =head1 cleanborrowers.pl
 
 This script allows to do 2 things.
@@ -34,14 +32,16 @@ This script allows to do 2 things.
 =cut
 
 use strict;
+
+#use warnings; FIXME - Bug 2505
 use CGI;
 use C4::Auth;
-use C4::Interface::CGI::Output;
-
-
-use C4::Members;               # GetBorrowersWhoHavexxxBorrowed.
-use C4::Circulation::Circ2;    # AnonymiseIssueHistory.
-use Date::Calc qw/Date_to_Days Today/;
+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;
 
@@ -51,76 +51,90 @@ my $cgi = new CGI;
 #  * multivalued CGI paramaters are returned as a packaged string separated by "\0" (null)
 my $params = $cgi->Vars;
 
-my $filterdate1;               # the date which filter on issue history.
-my $filterdate2;               # the date which filter on borrowers last issue.
+my $filterdate1;              # the date which filter on issue history.
+my $filterdate2;              # the date which filter on borrowers last issue.
+my $borrower_dateexpiry;
+my $borrower_categorycode;
 
 # getting the template
 my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
-    {
-        template_name   => "tools/cleanborrowers.tmpl",
+    {   template_name   => "tools/cleanborrowers.tmpl",
         query           => $cgi,
         type            => "intranet",
         authnotrequired => 0,
-        flagsrequired   => { tools => 1, catalogue => 1 },
+        flagsrequired   => { tools => 'delete_anonymize_patrons', catalogue => 1 },
     }
 );
 
 if ( $params->{'step2'} ) {
-    $filterdate1 = $params->{'filterdate1'};
-    $filterdate2 = $params->{'filterdate2'};
-    my $checkbox = $params->{'checkbox'};
+    $filterdate1           = format_date_in_iso( $params->{'filterdate1'} );
+    $filterdate2           = format_date_in_iso( $params->{'filterdate2'} );
+    $borrower_dateexpiry   = format_date_in_iso( $params->{'borrower_dateexpiry'} );
+    $borrower_categorycode = $params->{'borrower_categorycode'};
+
+    my %checkboxes = map { $_ => 1 } split /\0/, $params->{'checkbox'};
 
     my $totalDel;
-    if ($checkbox eq "borrower") {
-        $filterdate1 = $params->{'filterdate1'};
-        my $membersToDelete = GetBorrowersWhoHaveNotBorrowedSince($filterdate1);
+    my $membersToDelete;
+    if ( $checkboxes{borrower} ) {
+        $membersToDelete =
+          GetBorrowersToExpunge( { not_borrowered_since => $filterdate1, expired_before => $borrower_dateexpiry, category_code => $borrower_categorycode } );
         $totalDel = scalar @$membersToDelete;
-    }
 
+    }
     my $totalAno;
-    if ($checkbox eq "issue") {
-        $filterdate2 = $params->{'filterdate2'};
-        my $membersToAnonymize =
-          GetBorrowersWithIssuesHistoryOlderThan($filterdate2);
-        $totalAno = scalar @$membersToAnonymize;
+    my $membersToAnonymize;
+    if ( $checkboxes{issue} ) {
+        $membersToAnonymize = GetBorrowersWithIssuesHistoryOlderThan($filterdate2);
+        $totalAno           = scalar @$membersToAnonymize;
     }
 
     $template->param(
-        step2            => 1,
-        totalToDelete    => $totalDel,
-        totalToAnonymize => $totalAno,
-        filterdate1      => $filterdate1,
-        filterdate2      => $filterdate2
+        step2                   => 1,
+        totalToDelete           => $totalDel,
+        totalToAnonymize        => $totalAno,
+        memberstodelete_list    => $membersToDelete,
+        memberstoanonymize_list => $membersToAnonymize,
+        filterdate1             => format_date($filterdate1),
+        filterdate2             => format_date($filterdate2),
+        borrower_dateexpiry     => $borrower_dateexpiry,
+        borrower_categorycode   => $borrower_categorycode,
     );
 
-    #writing the template
+    ### TODO : Use GetBorrowersNamesAndLatestIssue function in order to get the borrowers to delete or anonymize.
     output_html_with_http_headers $cgi, $cookie, $template->output;
     exit;
 }
 
 if ( $params->{'step3'} ) {
-    $filterdate1 = $params->{'filterdate1'};
-    $filterdate2 = $params->{'filterdate2'};
+    $filterdate1           = format_date_in_iso( $params->{'filterdate1'} );
+    $filterdate2           = format_date_in_iso( $params->{'filterdate2'} );
+    $borrower_dateexpiry   = format_date_in_iso( $params->{'borrower_dateexpiry'} );
+    $borrower_categorycode = $params->{'borrower_categorycode'};
+
     my $do_delete = $params->{'do_delete'};
     my $do_anonym = $params->{'do_anonym'};
 
     my ( $totalDel, $totalAno, $radio ) = ( 0, 0, 0 );
-    
+
     # delete members
     if ($do_delete) {
-        my $membersToDelete = GetBorrowersWhoHaveNotBorrowedSince($filterdate1);
+        my $membersToDelete =
+          GetBorrowersToExpunge( { not_borrowered_since => $filterdate1, expired_before => $borrower_dateexpiry, category_code => $borrower_categorycode } );
         $totalDel = scalar(@$membersToDelete);
         $radio    = $params->{'radio'};
         if ( $radio eq 'trash' ) {
             my $i;
             for ( $i = 0 ; $i < $totalDel ; $i++ ) {
-                DeleteBorrower( $membersToDelete->[$i]->{'borrowernumber'} );
+                MoveMemberToDeleted( $membersToDelete->[$i]->{'borrowernumber'} );
+                C4::VirtualShelves::HandleDelBorrower( $membersToDelete->[$i]->{'borrowernumber'} );
+                DelMember( $membersToDelete->[$i]->{'borrowernumber'} );
             }
-        }
-        else {    # delete completly.
+        } else {    # delete completly.
             my $i;
             for ( $i = 0 ; $i < $totalDel ; $i++ ) {
-               DelBorrowerCompletly($membersToDelete->[$i]->{'borrowernumber'});
+                C4::VirtualShelves::HandleDelBorrower( $membersToDelete->[$i]->{'borrowernumber'} );
+                DelMember( $membersToDelete->[$i]->{'borrowernumber'} );
             }
         }
         $template->param(
@@ -128,16 +142,17 @@ if ( $params->{'step3'} ) {
             TotalDel  => $totalDel
         );
     }
-    
+
     # Anonymising all members
     if ($do_anonym) {
-        $totalAno = AnonymiseIssueHistory($filterdate2);
+        #FIXME: anonymisation errors are not handled
+        ($totalAno,my $anonymisation_error) = AnonymiseIssueHistory($filterdate2);
         $template->param(
             filterdate1 => $filterdate2,
             do_anonym   => '1',
         );
     }
-    
+
     $template->param(
         step3 => '1',
         trash => ( $radio eq "trash" ) ? (1) : (0),
@@ -148,17 +163,11 @@ if ( $params->{'step3'} ) {
     exit;
 }
 
-#default value set to the template are the 'CNIL' value.
-my ( $year, $month, $day ) = &Today();
-my $tmpyear  = $year - 1;
-my $tmpmonth = $month - 3;
-$filterdate1 = $year . "-" . $tmpmonth . "-" . $day;
-$filterdate2 = $tmpyear . "-" . $month . "-" . $day;
-
 $template->param(
-    step1       => '1',
-    filterdate1 => $filterdate1,
-    filterdate2 => $filterdate2
+    step1                    => '1',
+    filterdate1              => $filterdate1,
+    filterdate2              => $filterdate2,
+    borrower_categorycodes   => GetBorrowercategoryList(),
 );
 
 #writing the template