Bug 9076 - Add ability to delete borrowers by expiration date and category code to...
[koha.git] / tools / cleanborrowers.pl
1 #!/usr/bin/perl
2
3 # This file is part of Koha.
4 #
5 # Koha is free software; you can redistribute it and/or modify it under the
6 # terms of the GNU General Public License as published by the Free Software
7 # Foundation; either version 2 of the License, or (at your option) any later
8 # version.
9 #
10 # Koha is distributed in the hope that it will be useful, but WITHOUT ANY
11 # WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR
12 # A PARTICULAR PURPOSE.  See the GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU General Public License along with
15 # Koha; if not, write to the Free Software Foundation, Inc., 59 Temple Place,
16 # Suite 330, Boston, MA  02111-1307 USA
17 #
18 #   Written by Antoine Farnault antoine@koha-fr.org on Nov. 2006.
19
20
21 =head1 cleanborrowers.pl
22
23 This script allows to do 2 things.
24
25 =over 2
26
27 =item * Anonymise the borrowers' issues if issue is older than a given date. see C<datefilter1>.
28
29 =item * Delete the borrowers who has not borrowered since a given date. see C<datefilter2>.
30
31 =back
32
33 =cut
34
35 use strict;
36 #use warnings; FIXME - Bug 2505
37 use CGI;
38 use C4::Auth;
39 use C4::Output;
40 use C4::Dates qw/format_date format_date_in_iso/;
41 use C4::Members;        # GetBorrowersWhoHavexxxBorrowed.
42 use C4::Circulation;    # AnonymiseIssueHistory.
43 use C4::VirtualShelves (); #no import
44 use Date::Calc qw/Today Add_Delta_YM/;
45
46 my $cgi = new CGI;
47
48 # Fetch the paramater list as a hash in scalar context:
49 #  * returns paramater list as tied hash ref
50 #  * we can edit the values by changing the key
51 #  * multivalued CGI paramaters are returned as a packaged string separated by "\0" (null)
52 my $params = $cgi->Vars;
53
54 my $filterdate1;               # the date which filter on issue history.
55 my $filterdate2;               # the date which filter on borrowers last issue.
56 my $borrower_dateexpiry;
57 my $borrower_categorycode;
58
59 # getting the template
60 my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
61     {
62         template_name   => "tools/cleanborrowers.tmpl",
63         query           => $cgi,
64         type            => "intranet",
65         authnotrequired => 0,
66         flagsrequired   => { tools => 'delete_anonymize_patrons', catalogue => 1 },
67     }
68 );
69
70 if ( $params->{'step2'} ) {
71     $filterdate1 = format_date_in_iso($params->{'filterdate1'});
72     $filterdate2 = format_date_in_iso($params->{'filterdate2'});
73     $borrower_dateexpiry = format_date_in_iso($params->{'borrower_dateexpiry'});
74     $borrower_categorycode = $params->{'borrower_categorycode'};
75
76     my %checkboxes = map { $_ => 1 } split /\0/, $params->{'checkbox'};
77
78     my $totalDel;
79     my $membersToDelete;
80     if ($checkboxes{borrower}) {
81         $membersToDelete = GetBorrowersWhoHaveNotBorrowedSince({ not_borrowered_since => $filterdate1, expired_before => $borrower_dateexpiry, category_code => $borrower_categorycode });
82         $totalDel = scalar @$membersToDelete;
83             
84     }
85     my $totalAno;
86     my $membersToAnonymize;
87     if ($checkboxes{issue}) {
88         $membersToAnonymize =
89           GetBorrowersWithIssuesHistoryOlderThan($filterdate2);
90         $totalAno = scalar @$membersToAnonymize;
91     }
92
93     $template->param(
94         step2            => 1,
95         totalToDelete    => $totalDel,
96         totalToAnonymize => $totalAno,
97         memberstodelete_list => $membersToDelete,    
98         memberstoanonymize_list => $membersToAnonymize,    
99         filterdate1      => format_date($filterdate1),
100         filterdate2      => format_date($filterdate2),
101         borrower_dateexpiry => $borrower_dateexpiry,
102         borrower_categorycode => $borrower_categorycode,
103     );
104
105     ### TODO : Use GetBorrowersNamesAndLatestIssue function in order to get the borrowers to delete or anonymize.
106     output_html_with_http_headers $cgi, $cookie, $template->output;
107     exit;
108 }
109
110 if ( $params->{'step3'} ) {
111     $filterdate1 = format_date_in_iso($params->{'filterdate1'});
112     $filterdate2 = format_date_in_iso($params->{'filterdate2'});
113     $borrower_dateexpiry = format_date_in_iso($params->{'borrower_dateexpiry'});
114     $borrower_categorycode = $params->{'borrower_categorycode'};
115
116     my $do_delete = $params->{'do_delete'};
117     my $do_anonym = $params->{'do_anonym'};
118
119     my ( $totalDel, $totalAno, $radio ) = ( 0, 0, 0 );
120     
121     # delete members
122     if ($do_delete) {
123         my $membersToDelete = GetBorrowersWhoHaveNotBorrowedSince({ not_borrowered_since => $filterdate1, expired_before => $borrower_dateexpiry, category_code => $borrower_categorycode });
124         $totalDel = scalar(@$membersToDelete);
125         $radio    = $params->{'radio'};
126         if ( $radio eq 'trash' ) {
127             my $i;
128             for ( $i = 0 ; $i < $totalDel ; $i++ ) {
129                 MoveMemberToDeleted( $membersToDelete->[$i]->{'borrowernumber'} );
130                 C4::VirtualShelves::HandleDelBorrower($membersToDelete->[$i]->{'borrowernumber'});
131                 DelMember( $membersToDelete->[$i]->{'borrowernumber'} );
132             }
133         }
134         else {    # delete completly.
135             my $i;
136             for ( $i = 0 ; $i < $totalDel ; $i++ ) {
137                 C4::VirtualShelves::HandleDelBorrower($membersToDelete->[$i]->{'borrowernumber'});
138                 DelMember($membersToDelete->[$i]->{'borrowernumber'});
139             }
140         }
141         $template->param(
142             do_delete => '1',
143             TotalDel  => $totalDel
144         );
145     }
146     
147     # Anonymising all members
148     if ($do_anonym) {
149         $totalAno = AnonymiseIssueHistory($filterdate2);
150         $template->param(
151             filterdate1 => $filterdate2,
152             do_anonym   => '1',
153         );
154     }
155     
156     $template->param(
157         step3 => '1',
158         trash => ( $radio eq "trash" ) ? (1) : (0),
159     );
160
161     #writing the template
162     output_html_with_http_headers $cgi, $cookie, $template->output;
163     exit;
164 }
165
166 $template->param(
167     step1       => '1',
168     filterdate1 => $filterdate1,
169     filterdate2 => $filterdate2,
170     DHTMLcalendar_dateformat => C4::Dates->DHTMLcalendar(),
171     borrower_categorycodes => GetBorrowercategoryList(),
172 );
173
174 #writing the template
175 output_html_with_http_headers $cgi, $cookie, $template->output;