Bug 9076 - Add ability to delete borrowers by expiration date and category code to...
authorKyle M Hall <kyle@bywatersolutions.com>
Wed, 14 Nov 2012 16:40:21 +0000 (11:40 -0500)
committerJared Camins-Esakov <jcamins@cpbibliography.com>
Tue, 8 Jan 2013 03:01:35 +0000 (22:01 -0500)
Signed-off-by: Liz Rea <liz@catalyst.net.nz>
Tested per plan, works. Staff category is not shown, and patch passes automated testing.

Signed-off-by: Jonathan Druart <jonathan.druart@biblibre.com>
Signed-off-by: Jared Camins-Esakov <jcamins@cpbibliography.com>
C4/Members.pm
koha-tmpl/intranet-tmpl/prog/en/modules/tools/cleanborrowers.tt
tools/cleanborrowers.pl

index 90b3f73..b89d721 100644 (file)
@@ -1940,50 +1940,63 @@ WHERE roadtypeid=?|;
 
 =head2 GetBorrowersWhoHaveNotBorrowedSince
 
-  &GetBorrowersWhoHaveNotBorrowedSince($date)
+  $borrowers = &GetBorrowersWhoHaveNotBorrowedSince(
+      not_borrowered_since => $not_borrowered_since,
+      expired_before       => $expired_before,
+      category_code        => $category_code,
+      branchcode           => $branchcode
+  );
 
-this function get all borrowers who haven't borrowed since the date given on input arg.
+  This function get all borrowers based on the given criteria.
 
 =cut
 
 sub GetBorrowersWhoHaveNotBorrowedSince {
-    my $filterdate = shift||POSIX::strftime("%Y-%m-%d",localtime());
-    my $filterexpiry = shift;
-    my $filterbranch = shift || 
+    my $params = shift;
+
+    my $filterdate     = $params->{'not_borrowered_since'};
+    my $filterexpiry   = $params->{'expired_before'};
+    my $filtercategory = $params->{'category_code'};
+    my $filterbranch   = $params->{'branchcode'} ||
                         ((C4::Context->preference('IndependantBranches') 
                              && C4::Context->userenv 
                              && C4::Context->userenv->{flags} % 2 !=1 
                              && C4::Context->userenv->{branch})
                          ? C4::Context->userenv->{branch}
                          : "");  
+
     my $dbh   = C4::Context->dbh;
     my $query = "
         SELECT borrowers.borrowernumber,
-               max(old_issues.timestamp) as latestissue,
-               max(issues.timestamp) as currentissue
+               MAX(old_issues.timestamp) AS latestissue,
+               MAX(issues.timestamp) AS currentissue
         FROM   borrowers
         JOIN   categories USING (categorycode)
         LEFT JOIN old_issues USING (borrowernumber)
         LEFT JOIN issues USING (borrowernumber) 
         WHERE  category_type <> 'S'
-        AND borrowernumber NOT IN (SELECT guarantorid FROM borrowers WHERE guarantorid IS NOT NULL AND guarantorid <> 0) 
+        AND borrowernumber NOT IN (SELECT guarantorid FROM borrowers WHERE guarantorid IS NOT NULL AND guarantorid <> 0)
    ";
     my @query_params;
-    if ($filterbranch && $filterbranch ne ""){ 
-        $query.=" AND borrowers.branchcode= ?";
-        push @query_params,$filterbranch;
+    if ( $filterbranch && $filterbranch ne "" ) {
+        $query.= " AND borrowers.branchcode = ? ";
+        push( @query_params, $filterbranch );
     }
-    if($filterexpiry){
+    if ( $filterexpiry ) {
         $query .= " AND dateexpiry < ? ";
-        push @query_params,$filterdate;
+        push( @query_params, $filterexpiry );
     }
-    $query.=" GROUP BY borrowers.borrowernumber";
-    if ($filterdate){ 
-        $query.=" HAVING (latestissue < ? OR latestissue IS NULL) 
-                  AND currentissue IS NULL";
+    if ( $filtercategory ) {
+        $query .= " AND categorycode = ? ";
+        push( @query_params, $filtercategory );
+    }
+    $query.=" GROUP BY borrowers.borrowernumber HAVING currentissue IS NULL ";
+    if ( $filterdate ) {
+        $query.=" AND ( latestissue < ? OR latestissue IS NULL ) ";
         push @query_params,$filterdate;
     }
     warn $query if $debug;
+
     my $sth = $dbh->prepare($query);
     if (scalar(@query_params)>0){  
         $sth->execute(@query_params);
index f7193e3..0b745ce 100644 (file)
@@ -10,8 +10,8 @@
          */
           function checkForm(form) {
               if((form.checkbox[0].checked)){
-                  if(!(form.date1.value)){
-                    alert(_("please enter a date !"));
+                  if ( (!form.date1.value) && (!form.borrower_dateexpiry.value) && (!form.borrower_categorycode.value) ){
+                    alert(_("Please enter at least one criterion for deletion!"));
                     document.form.date1.focus();
                     return false;
                   }
     <form name="f1" onsubmit="return checkForm(this);" action="/cgi-bin/koha/tools/cleanborrowers.pl" method="post">
     <fieldset>
     <legend>What do you want to do ?</legend>
-        <p><input id="checkborrower" type="checkbox" name="checkbox" value="borrower" checked="checked" />
-        <label for="checkborrower">Delete borrower who has not borrowed since:</label>
-        <input size="10" id="date1" name="filterdate1" value="[% filterdate1 %]" type="text" class="datepicker" />
+        <h3><input id="checkborrower" type="checkbox" name="checkbox" value="borrower" /> Delete borrowers</h3>
+
+        <label for="checkborrower">Who have not borrowed since:</label>
+        <input size="10" id="date1" name="filterdate1" type="text" class="datepicker" />
+        <span class="hint">[% INCLUDE 'date-format.inc' %]</span></p>
+
+        <label for="borrower_dateexpiry">Whose expiration date is before:</label>
+        <input size="10" id=borrower_dateexpiry" name="borrower_dateexpiry" type="text" class="datepicker" />
         <span class="hint">[% INCLUDE 'date-format.inc' %]</span></p>
 
-        <p><input id="checkissue" type="checkbox" name="checkbox" value="issue" checked="checked" />
+        <label for="borrower_categorycode">Whose patron category is:</label>
+        <select id="borrower_categorycode" name="borrower_categorycode">
+            <option value="" selected="selected">Any</option>
+            [% FOREACH bc IN borrower_categorycodes %]
+                [% UNLESS bc.categorycode == 'S' %]
+                    <option value="[% bc.categorycode %]">[% bc.description %]</option>
+                [% END %]
+            [% END %]
+        </select>
+
+        <h3><input id="checkissue" type="checkbox" name="checkbox" value="issue" /> Anonymize history</h3>
         <label for="checkissue">Anonymize check-out history older than</label>
-        <input size="10" id="date2" name="filterdate2" value="[% filterdate2 %]" type="text" class="datepicker" />
+        <input size="10" id="date2" name="filterdate2" type="text" class="datepicker" />
         <span class="hint">[% INCLUDE 'date-format.inc' %]</span></p>
 
             <!-- hidden here -->
             <input type="hidden" name="step3" value="1" />
             <input type="hidden" name="filterdate1" value="[% filterdate1 %]" />
             <input type="hidden" name="filterdate2" value="[% filterdate2 %]" />
+            <input type="hidden" name="borrower_dateexpiry" value="[% borrower_dateexpiry %]" />
+            <input type="hidden" name="borrower_categorycode" value="[% borrower_categorycode %]" />
     </fieldset>
        <fieldset class="action"><input type="submit" value="Finish" /> <a class="cancel" href="/cgi-bin/koha/tools/cleanborrowers.pl">Cancel</a></fieldset>
         </form>
index 0b37c20..6a9729c 100755 (executable)
@@ -53,6 +53,8 @@ my $params = $cgi->Vars;
 
 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(
@@ -68,12 +70,15 @@ my ( $template, $loggedinuser, $cookie ) = get_template_and_user(
 if ( $params->{'step2'} ) {
     $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;
     my $membersToDelete;
     if ($checkboxes{borrower}) {
-        $membersToDelete = GetBorrowersWhoHaveNotBorrowedSince($filterdate1, 1);
+        $membersToDelete = GetBorrowersWhoHaveNotBorrowedSince({ not_borrowered_since => $filterdate1, expired_before => $borrower_dateexpiry, category_code => $borrower_categorycode });
         $totalDel = scalar @$membersToDelete;
             
     }
@@ -93,10 +98,11 @@ if ( $params->{'step2'} ) {
         memberstoanonymize_list => $membersToAnonymize,    
         filterdate1      => format_date($filterdate1),
         filterdate2      => format_date($filterdate2),
+        borrower_dateexpiry => $borrower_dateexpiry,
+        borrower_categorycode => $borrower_categorycode,
     );
-### TODO : Use GetBorrowersNamesAndLatestIssue function in order to get the borrowers to delete or anonymize.
-### Now, we are only using total, which is not enough imlo
-    #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;
 }
@@ -104,6 +110,9 @@ if ( $params->{'step2'} ) {
 if ( $params->{'step3'} ) {
     $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'};
 
@@ -111,7 +120,7 @@ if ( $params->{'step3'} ) {
     
     # delete members
     if ($do_delete) {
-        my $membersToDelete = GetBorrowersWhoHaveNotBorrowedSince($filterdate1, 1);
+        my $membersToDelete = GetBorrowersWhoHaveNotBorrowedSince({ not_borrowered_since => $filterdate1, expired_before => $borrower_dateexpiry, category_code => $borrower_categorycode });
         $totalDel = scalar(@$membersToDelete);
         $radio    = $params->{'radio'};
         if ( $radio eq 'trash' ) {
@@ -154,16 +163,12 @@ if ( $params->{'step3'} ) {
     exit;
 }
 
-#default value set to the template are the 'CNIL' value.
-my ( $year, $month, $day ) = &Today();
-$filterdate1 = format_date(sprintf("%-04.4d-%-02.2d-%02.2d", Add_Delta_YM($year, $month, $day, -1, 0)));
-$filterdate2 = format_date(sprintf("%-04.4d-%-02.2d-%02.2d", Add_Delta_YM($year, $month, $day, 0, -3)));
-
 $template->param(
     step1       => '1',
     filterdate1 => $filterdate1,
     filterdate2 => $filterdate2,
     DHTMLcalendar_dateformat => C4::Dates->DHTMLcalendar(),
+    borrower_categorycodes => GetBorrowercategoryList(),
 );
 
 #writing the template