View | Details | Raw Unified | Return to bug 10612
Collapse All | Expand All

(-)a/C4/Members.pm (-10 / +19 lines)
Lines 40-45 use Koha::Patron::Debarments qw(IsDebarred); Link Here
40
use Text::Unaccent qw( unac_string );
40
use Text::Unaccent qw( unac_string );
41
use Koha::AuthUtils qw(hash_password);
41
use Koha::AuthUtils qw(hash_password);
42
use Koha::Database;
42
use Koha::Database;
43
use Koha::List::Patron;
43
44
44
our (@ISA,@EXPORT,@EXPORT_OK,$debug);
45
our (@ISA,@EXPORT,@EXPORT_OK,$debug);
45
46
Lines 1740-1745 sub GetHideLostItemsPreference { Link Here
1740
      not_borrowered_since => $not_borrowered_since,
1741
      not_borrowered_since => $not_borrowered_since,
1741
      expired_before       => $expired_before,
1742
      expired_before       => $expired_before,
1742
      category_code        => $category_code,
1743
      category_code        => $category_code,
1744
      patron_list_id       => $patron_list_id,
1743
      branchcode           => $branchcode
1745
      branchcode           => $branchcode
1744
  );
1746
  );
1745
1747
Lines 1748-1765 sub GetHideLostItemsPreference { Link Here
1748
=cut
1750
=cut
1749
1751
1750
sub GetBorrowersToExpunge {
1752
sub GetBorrowersToExpunge {
1751
    my $params = shift;
1752
1753
1753
    my $filterdate     = $params->{'not_borrowered_since'};
1754
    my $params = shift;
1754
    my $filterexpiry   = $params->{'expired_before'};
1755
    my $filterdate       = $params->{'not_borrowered_since'};
1755
    my $filtercategory = $params->{'category_code'};
1756
    my $filterexpiry     = $params->{'expired_before'};
1756
    my $filterbranch   = $params->{'branchcode'} ||
1757
    my $filtercategory   = $params->{'category_code'};
1758
    my $filterbranch     = $params->{'branchcode'} ||
1757
                        ((C4::Context->preference('IndependentBranches')
1759
                        ((C4::Context->preference('IndependentBranches')
1758
                             && C4::Context->userenv 
1760
                             && C4::Context->userenv 
1759
                             && !C4::Context->IsSuperLibrarian()
1761
                             && !C4::Context->IsSuperLibrarian()
1760
                             && C4::Context->userenv->{branch})
1762
                             && C4::Context->userenv->{branch})
1761
                         ? C4::Context->userenv->{branch}
1763
                         ? C4::Context->userenv->{branch}
1762
                         : "");  
1764
                         : "");  
1765
    my $filterpatronlist = $params->{'patron_list_id'};
1763
1766
1764
    my $dbh   = C4::Context->dbh;
1767
    my $dbh   = C4::Context->dbh;
1765
    my $query = q|
1768
    my $query = q|
Lines 1775-1785 sub GetBorrowersToExpunge { Link Here
1775
                AND guarantorid <> 0
1778
                AND guarantorid <> 0
1776
        ) as tmp ON borrowers.borrowernumber=tmp.guarantorid
1779
        ) as tmp ON borrowers.borrowernumber=tmp.guarantorid
1777
        LEFT JOIN old_issues USING (borrowernumber)
1780
        LEFT JOIN old_issues USING (borrowernumber)
1778
        LEFT JOIN issues USING (borrowernumber) 
1781
        LEFT JOIN issues USING (borrowernumber)|;
1779
        WHERE  category_type <> 'S'
1782
    if ( $filterpatronlist  ){
1783
        $query .= q| LEFT JOIN patron_list_patrons USING (borrowernumber)|;
1784
    }
1785
    $query .= q| WHERE  category_type <> 'S'
1780
        AND tmp.guarantorid IS NULL
1786
        AND tmp.guarantorid IS NULL
1781
   |;
1787
   |;
1782
1783
    my @query_params;
1788
    my @query_params;
1784
    if ( $filterbranch && $filterbranch ne "" ) {
1789
    if ( $filterbranch && $filterbranch ne "" ) {
1785
        $query.= " AND borrowers.branchcode = ? ";
1790
        $query.= " AND borrowers.branchcode = ? ";
Lines 1793-1798 sub GetBorrowersToExpunge { Link Here
1793
        $query .= " AND categorycode = ? ";
1798
        $query .= " AND categorycode = ? ";
1794
        push( @query_params, $filtercategory );
1799
        push( @query_params, $filtercategory );
1795
    }
1800
    }
1801
    if ( $filterpatronlist ){
1802
        $query.=" AND patron_list_id = ? ";
1803
        push( @query_params, $filterpatronlist );
1804
    }
1796
    $query.=" GROUP BY borrowers.borrowernumber HAVING currentissue IS NULL ";
1805
    $query.=" GROUP BY borrowers.borrowernumber HAVING currentissue IS NULL ";
1797
    if ( $filterdate ) {
1806
    if ( $filterdate ) {
1798
        $query.=" AND ( latestissue < ? OR latestissue IS NULL ) ";
1807
        $query.=" AND ( latestissue < ? OR latestissue IS NULL ) ";
Lines 1803-1812 sub GetBorrowersToExpunge { Link Here
1803
    my $sth = $dbh->prepare($query);
1812
    my $sth = $dbh->prepare($query);
1804
    if (scalar(@query_params)>0){  
1813
    if (scalar(@query_params)>0){  
1805
        $sth->execute(@query_params);
1814
        $sth->execute(@query_params);
1806
    } 
1815
    }
1807
    else {
1816
    else {
1808
        $sth->execute;
1817
        $sth->execute;
1809
    }      
1818
    }
1810
    
1819
    
1811
    my @results;
1820
    my @results;
1812
    while ( my $data = $sth->fetchrow_hashref ) {
1821
    while ( my $data = $sth->fetchrow_hashref ) {
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/patron_lists/lists.tt (+20 lines)
Lines 51-56 Link Here
51
                    <th>Name</th>
51
                    <th>Name</th>
52
                    <th>Patrons in list</th>
52
                    <th>Patrons in list</th>
53
                    <th>&nbsp;</th>
53
                    <th>&nbsp;</th>
54
                    [% IF CAN_user_tools_edit_patrons %]
55
                        <th>&nbsp;</th>
56
                    [% END %]
57
                    [% IF CAN_user_tools_delete_anonymize_patrons %]
58
                        <th>&nbsp;</th>
59
                    [% END %]
54
                </tr>
60
                </tr>
55
            </thead>
61
            </thead>
56
62
Lines 72-77 Link Here
72
                                </ul>
78
                                </ul>
73
                            </div>
79
                            </div>
74
                        </td>
80
                        </td>
81
                        [% IF CAN_user_tools_edit_patrons %]
82
                            <td>
83
                                <a class="btn btn-mini" href="/cgi-bin/koha/tools/modborrowers.pl?patron_list_id=[% l.patron_list_id %]&op=show">
84
                                    <i class="fa fa-edit"></i> Edit patrons</i>
85
                                </a>
86
                            </td>
87
                        [% END %]
88
                        [% IF CAN_user_tools_delete_anonymize_patrons %]
89
                            <td>
90
                                <a class="btn btn-mini" href="/cgi-bin/koha/tools/cleanborrowers.pl?step=2&patron_list_id=[% l.patron_list_id %]&checkbox=borrower">
91
                                    <i class="fa fa-trash"></i> Delete patrons</i>
92
                                </a>
93
                            </td>
94
                        [% END %]
75
                    </tr>
95
                    </tr>
76
                [% END %]
96
                [% END %]
77
            </tbody>
97
            </tbody>
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/cleanborrowers.tt (-8 / +21 lines)
Lines 12-18 Link Here
12
         */
12
         */
13
          function checkForm(form) {
13
          function checkForm(form) {
14
              if((form.checkbox[0].checked)){
14
              if((form.checkbox[0].checked)){
15
                  if ( (!form.date1.value) && (!form.borrower_dateexpiry.value) && (!form.borrower_categorycode.value) ){
15
                  if ( (!form.date1.value) && (!form.borrower_dateexpiry.value) && (!form.borrower_categorycode.value) && (!form.patron_list_id.value)){
16
                    alert(_("Please enter at least one criterion for deletion!"));
16
                    alert(_("Please enter at least one criterion for deletion!"));
17
                    return false;
17
                    return false;
18
                  }
18
                  }
Lines 88-95 Link Here
88
                        [% END %]
88
                        [% END %]
89
                    </select>
89
                    </select>
90
                </li>
90
                </li>
91
                [% IF patron_lists %]
92
                <li>
93
                    <label for="patron_list_id">who are in patron list: </label>
94
                    <select id="patron_list_id" name="patron_list_id">
95
                        <option value=""></option>
96
                        [% FOREACH pl IN patron_lists %]
97
                            <option value="[% pl.patron_list_id %]">[% pl.name %]</option>
98
                        [% END %]
99
                    </select>
100
                </li>
101
                [% END %]
91
            </ul>
102
            </ul>
92
        </fieldset>
103
        </fieldset>
104
93
        <fieldset>
105
        <fieldset>
94
        <legend>Anonymize checkout history</legend>
106
        <legend>Anonymize checkout history</legend>
95
        [% UNLESS Koha.Preference('AnonymousPatron') %]
107
        [% UNLESS Koha.Preference('AnonymousPatron') %]
Lines 121-132 Link Here
121
    <fieldset>
133
    <fieldset>
122
        <legend>Warnings</legend>
134
        <legend>Warnings</legend>
123
        <ul>
135
        <ul>
124
            <li>[% IF ( totalToDelete ) %][% totalToDelete %] [% ELSE %]0 [% END %] patrons will be deleted</li>
136
            <li>[% patrons_to_delete.size || 0 %] patrons will be deleted</li>
125
            <li>[% IF ( totalToAnonymize ) %][% totalToAnonymize %] [% ELSE %]0 [% END %] checkout history will be anonymized</li>
137
            <li>[% patrons_to_anonymize.size || 0 %] patron's checkout histories will be anonymized</li>
126
        </ul>
138
        </ul>
127
139
128
        <br />
140
        <br />
129
            [% IF ( totalToDelete ) %]
141
            [% IF patrons_to_delete.size %]
130
                <fieldset><legend>What do you want to do for deleted patrons?</legend>
142
                <fieldset><legend>What do you want to do for deleted patrons?</legend>
131
                <input id="delete" type="radio" name="radio" value="delete" />
143
                <input id="delete" type="radio" name="radio" value="delete" />
132
                <label for="delete">Permanently delete these patrons</label>
144
                <label for="delete">Permanently delete these patrons</label>
Lines 136-147 Link Here
136
148
137
                <br /><input id="testrun" type="radio" name="radio" value="testrun" checked="checked" />
149
                <br /><input id="testrun" type="radio" name="radio" value="testrun" checked="checked" />
138
                <label for="testrun">Do not remove any patrons (test run)</label>
150
                <label for="testrun">Do not remove any patrons (test run)</label>
139
                <input type="hidden" name="do_delete" value="[% totalToDelete %]" /></fieldset>
151
                <input type="hidden" name="do_delete" value="[% patrons_to_delete.size %]" /></fieldset>
140
152
141
            [% END %]
153
            [% END %]
142
            [% IF ( totalToAnonymize ) %]
154
            [% IF patrons_to_anonymize.size %]
143
                Checkout history for [% totalToAnonymize %] patrons will be anonymized
155
                Checkout history for [% patrons_to_anonymize.size %] patrons will be anonymized
144
                <input type="hidden" name="do_anonym" value="[% totalToAnonymize %]" />
156
                <input type="hidden" name="do_anonym" value="[% patrons_to_anonymize.size %]" />
145
            [% END %]
157
            [% END %]
146
158
147
            <input type="hidden" name="step" value="3" />
159
            <input type="hidden" name="step" value="3" />
Lines 149-154 Link Here
149
            <input type="hidden" name="last_issue_date" value="[% last_issue_date | $KohaDates %]" />
161
            <input type="hidden" name="last_issue_date" value="[% last_issue_date | $KohaDates %]" />
150
            <input type="hidden" name="borrower_dateexpiry" value="[% borrower_dateexpiry | $KohaDates %]" />
162
            <input type="hidden" name="borrower_dateexpiry" value="[% borrower_dateexpiry | $KohaDates %]" />
151
            <input type="hidden" name="borrower_categorycode" value="[% borrower_categorycode %]" />
163
            <input type="hidden" name="borrower_categorycode" value="[% borrower_categorycode %]" />
164
            <input type="hidden" name="patron_list_id" value="[% patron_list_id %]" />
152
    </fieldset>
165
    </fieldset>
153
    <fieldset class="action"><input type="submit" value="Finish" /> <a class="cancel" href="/cgi-bin/koha/tools/cleanborrowers.pl">Cancel</a></fieldset>
166
    <fieldset class="action"><input type="submit" value="Finish" /> <a class="cancel" href="/cgi-bin/koha/tools/cleanborrowers.pl">Cancel</a></fieldset>
154
        </form>
167
        </form>
(-)a/tools/cleanborrowers.pl (-26 / +40 lines)
Lines 41-46 use C4::Members; # GetBorrowersWhoHavexxxBorrowed. Link Here
41
use C4::Circulation;    # AnonymiseIssueHistory.
41
use C4::Circulation;    # AnonymiseIssueHistory.
42
use Koha::DateUtils qw( dt_from_string output_pref );
42
use Koha::DateUtils qw( dt_from_string output_pref );
43
use Date::Calc qw/Today Add_Delta_YM/;
43
use Date::Calc qw/Today Add_Delta_YM/;
44
use Koha::List::Patron;
44
45
45
my $cgi = new CGI;
46
my $cgi = new CGI;
46
47
Lines 63-68 my $borrower_dateexpiry = Link Here
63
  $params->{borrower_dateexpiry}
64
  $params->{borrower_dateexpiry}
64
  ? dt_from_string $params->{borrower_dateexpiry}
65
  ? dt_from_string $params->{borrower_dateexpiry}
65
  : undef;
66
  : undef;
67
my $patron_list_id = $params->{patron_list_id};
66
68
67
my $borrower_categorycode = $params->{'borrower_categorycode'} || q{};
69
my $borrower_categorycode = $params->{'borrower_categorycode'} || q{};
68
70
Lines 80-107 if ( $step == 2 ) { Link Here
80
82
81
    my %checkboxes = map { $_ => 1 } split /\0/, $params->{'checkbox'};
83
    my %checkboxes = map { $_ => 1 } split /\0/, $params->{'checkbox'};
82
84
83
    my $totalDel;
85
    my $patrons_to_delete;
84
    my $membersToDelete;
85
    if ( $checkboxes{borrower} ) {
86
    if ( $checkboxes{borrower} ) {
86
        $membersToDelete = GetBorrowersToExpunge(
87
        $patrons_to_delete = GetBorrowersToExpunge(
87
            _get_selection_params($not_borrowered_since, $borrower_dateexpiry, $borrower_categorycode)
88
             _get_selection_params(
89
                  $not_borrowered_since,
90
                  $borrower_dateexpiry,
91
                  $borrower_categorycode,
92
                  $patron_list_id,
93
             )
88
        );
94
        );
89
        _skip_borrowers_with_nonzero_balance( $membersToDelete );
90
        $totalDel = scalar @$membersToDelete;
91
92
    }
95
    }
93
    my $totalAno;
96
    _skip_borrowers_with_nonzero_balance($patrons_to_delete);
94
    my $membersToAnonymize;
97
98
    my $members_to_anonymize;
95
    if ( $checkboxes{issue} ) {
99
    if ( $checkboxes{issue} ) {
96
        $membersToAnonymize = GetBorrowersWithIssuesHistoryOlderThan($last_issue_date);
100
        $members_to_anonymize = GetBorrowersWithIssuesHistoryOlderThan($last_issue_date);
97
        $totalAno           = scalar @$membersToAnonymize;
98
    }
101
    }
99
102
100
    $template->param(
103
    $template->param(
101
        totalToDelete           => $totalDel,
104
        patrons_to_delete    => $patrons_to_delete,
102
        totalToAnonymize        => $totalAno,
105
        patrons_to_anonymize => $members_to_anonymize,
103
        memberstodelete_list    => $membersToDelete,
106
        patron_list_id          => $patron_list_id,
104
        memberstoanonymize_list => $membersToAnonymize,
105
    );
107
    );
106
}
108
}
107
109
Lines 113-130 elsif ( $step == 3 ) { Link Here
113
115
114
    # delete members
116
    # delete members
115
    if ($do_delete) {
117
    if ($do_delete) {
116
        my $membersToDelete = GetBorrowersToExpunge(
118
        my $patrons_to_delete = GetBorrowersToExpunge(
117
            _get_selection_params($not_borrowered_since, $borrower_dateexpiry, $borrower_categorycode)
119
                _get_selection_params(
118
        );
120
                    $not_borrowered_since, $borrower_dateexpiry,
119
        _skip_borrowers_with_nonzero_balance( $membersToDelete );
121
                    $borrower_categorycode, $patron_list_id
120
        $totalDel = scalar(@$membersToDelete);
122
                )
123
            );
124
        _skip_borrowers_with_nonzero_balance($patrons_to_delete);
125
126
        $totalDel = scalar(@$patrons_to_delete);
121
        $radio    = $params->{'radio'};
127
        $radio    = $params->{'radio'};
122
        for ( my $i = 0 ; $i < $totalDel ; $i++ ) {
128
        for ( my $i = 0 ; $i < $totalDel ; $i++ ) {
123
            $radio eq 'testrun' && last;
129
            $radio eq 'testrun' && last;
124
            my $borrowernumber = $membersToDelete->[$i]->{'borrowernumber'};
130
            my $borrowernumber = $patrons_to_delete->[$i]->{'borrowernumber'};
125
            $radio eq 'trash' && MoveMemberToDeleted( $borrowernumber );
131
            $radio eq 'trash' && MoveMemberToDeleted($borrowernumber);
126
            C4::Members::HandleDelBorrower( $borrowernumber );
132
            C4::Members::HandleDelBorrower($borrowernumber);
127
            DelMember( $borrowernumber );
133
            DelMember($borrowernumber);
128
        }
134
        }
129
        $template->param(
135
        $template->param(
130
            do_delete => '1',
136
            do_delete => '1',
Lines 145-150 elsif ( $step == 3 ) { Link Here
145
        trash => ( $radio eq "trash" ) ? (1) : (0),
151
        trash => ( $radio eq "trash" ) ? (1) : (0),
146
        testrun => ( $radio eq "testrun" ) ? 1: 0,
152
        testrun => ( $radio eq "testrun" ) ? 1: 0,
147
    );
153
    );
154
} else { # $step == 1
155
    my @all_lists = GetPatronLists();
156
    my @non_empty_lists;
157
    foreach my $list (@all_lists){
158
    my @patrons = $list->patron_list_patrons();
159
        if( scalar @patrons ) { push(@non_empty_lists,$list) }
160
    }
161
    $template->param( patron_lists => [ @non_empty_lists ] );
148
}
162
}
149
163
150
$template->param(
164
$template->param(
Lines 169-175 sub _skip_borrowers_with_nonzero_balance { Link Here
169
}
183
}
170
184
171
sub _get_selection_params {
185
sub _get_selection_params {
172
    my ($not_borrowered_since, $borrower_dateexpiry, $borrower_categorycode) = @_;
186
    my ($not_borrowered_since, $borrower_dateexpiry, $borrower_categorycode, $patron_list_id) = @_;
173
187
174
    my $params = {};
188
    my $params = {};
175
    $params->{not_borrowered_since} = output_pref({
189
    $params->{not_borrowered_since} = output_pref({
Lines 183-188 sub _get_selection_params { Link Here
183
        dateonly   => 1
197
        dateonly   => 1
184
    }) if $borrower_dateexpiry;
198
    }) if $borrower_dateexpiry;
185
    $params->{category_code} = $borrower_categorycode if $borrower_categorycode;
199
    $params->{category_code} = $borrower_categorycode if $borrower_categorycode;
200
    $params->{patron_list_id} = $patron_list_id if $patron_list_id;
186
201
187
    return $params;
202
    return $params;
188
};
203
};
189
- 

Return to bug 10612