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

(-)a/C4/Members.pm (+14 lines)
Lines 40-45 use Koha::Borrower::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
use Module::Load::Conditional qw( can_load );
45
use Module::Load::Conditional qw( can_load );
45
if ( ! can_load( modules => { 'Koha::NorwegianPatronDB' => undef } ) ) {
46
if ( ! can_load( modules => { 'Koha::NorwegianPatronDB' => undef } ) ) {
Lines 1977-1982 sub GetHideLostItemsPreference { Link Here
1977
      not_borrowered_since => $not_borrowered_since,
1978
      not_borrowered_since => $not_borrowered_since,
1978
      expired_before       => $expired_before,
1979
      expired_before       => $expired_before,
1979
      category_code        => $category_code,
1980
      category_code        => $category_code,
1981
      patron_list_id       => $patron_list_id,
1980
      branchcode           => $branchcode
1982
      branchcode           => $branchcode
1981
  );
1983
  );
1982
1984
Lines 1985-1992 sub GetHideLostItemsPreference { Link Here
1985
=cut
1987
=cut
1986
1988
1987
sub GetBorrowersToExpunge {
1989
sub GetBorrowersToExpunge {
1990
1988
    my $params = shift;
1991
    my $params = shift;
1989
1992
1993
    if ( $params->{'patron_list_id'} ) {
1994
        my $patron_list_id = $params->{'patron_list_id'};
1995
        my @patron_list = GetPatronLists( {patron_list_id=>$patron_list_id});
1996
        my @patron_list_patrons = $patron_list[0]->patron_list_patrons();
1997
        my $issues;
1998
        @patron_list_patrons = map {
1999
            (undef, $issues, undef) = GetMemberIssuesAndFines( $_->{borrowernumber} || $_->get_column('borrowernumber') );
2000
            ($issues != 0) ? (): ($_);
2001
            } @patron_list_patrons;
2002
        return \@patron_list_patrons;
2003
    }
1990
    my $filterdate     = $params->{'not_borrowered_since'};
2004
    my $filterdate     = $params->{'not_borrowered_since'};
1991
    my $filterexpiry   = $params->{'expired_before'};
2005
    my $filterexpiry   = $params->{'expired_before'};
1992
    my $filtercategory = $params->{'category_code'};
2006
    my $filtercategory = $params->{'category_code'};
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/patron_lists/lists.tt (-2 / +22 lines)
Lines 47-52 Link Here
47
                    <th>&nbsp;</th>
47
                    <th>&nbsp;</th>
48
                    <th>&nbsp;</th>
48
                    <th>&nbsp;</th>
49
                    <th>&nbsp;</th>
49
                    <th>&nbsp;</th>
50
                    [% IF CAN_user_tools_edit_patrons %]
51
                        <th>&nbsp;</th>
52
                    [% END %]
53
                    [% IF CAN_user_tools_delete_anonymize_patrons %]
54
                        <th>&nbsp;</th>
55
                    [% END %]
50
                </tr>
56
                </tr>
51
            </thead>
57
            </thead>
52
58
Lines 57-63 Link Here
57
                        <td>[% l.patron_list_patrons_rs.count || 0 %]</td>
63
                        <td>[% l.patron_list_patrons_rs.count || 0 %]</td>
58
                        <td>
64
                        <td>
59
                            <a class="btn btn-mini" href="list.pl?patron_list_id=[% l.patron_list_id %]">
65
                            <a class="btn btn-mini" href="list.pl?patron_list_id=[% l.patron_list_id %]">
60
                                <i class="fa fa-plus-sign"></i> Add patrons <i class="fa fa-user"></i>
66
                                <i class="fa fa-plus"></i> Add patrons</i>
61
                            </a>
67
                            </a>
62
                        </td>
68
                        </td>
63
                        <td>
69
                        <td>
Lines 72-80 Link Here
72
                        </td>
78
                        </td>
73
                        <td>
79
                        <td>
74
                            <a class="btn btn-mini" href="#" onclick='GB_showCenter(_("Print patron cards from list"), "/cgi-bin/koha/patroncards/print.pl?patronlist_id=[% l.patron_list_id %]", 400, 800);return false;'>
80
                            <a class="btn btn-mini" href="#" onclick='GB_showCenter(_("Print patron cards from list"), "/cgi-bin/koha/patroncards/print.pl?patronlist_id=[% l.patron_list_id %]", 400, 800);return false;'>
75
                                <i class="icon-print"></i> Print patron cards
81
                                <i class="fa fa-print"></i> Print patron cards
76
                            </a>
82
                            </a>
77
                        </td>
83
                        </td>
84
                        [% IF CAN_user_tools_edit_patrons %]
85
                            <td>
86
                                <a class="btn btn-mini" href="/cgi-bin/koha/tools/modborrowers.pl?patron_list_id=[% l.patron_list_id %]&op=show">
87
                                    <i class="fa fa-edit"></i> Edit patrons</i>
88
                                </a>
89
                            </td>
90
                        [% END %]
91
                        [% IF CAN_user_tools_delete_anonymize_patrons %]
92
                            <td>
93
                                <a class="btn btn-mini" href="/cgi-bin/koha/tools/cleanborrowers.pl?step=2&patron_list_id=[% l.patron_list_id %]">
94
                                    <i class="fa fa-trash"></i> Delete patrons</i>
95
                                </a>
96
                            </td>
97
                        [% END %]
78
                    </tr>
98
                    </tr>
79
                [% END %]
99
                [% END %]
80
            </tbody>
100
            </tbody>
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/tools/cleanborrowers.tt (-8 / +22 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"><strong>Or</strong> use a 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
                    <span class="hint">If using a patron list, no other criteria will be used.</span>
101
                </li>
102
                [% END %]
91
            </ul>
103
            </ul>
92
        </fieldset>
104
        </fieldset>
105
93
        <fieldset>
106
        <fieldset>
94
        <legend>Anonymize checkout history</legend>
107
        <legend>Anonymize checkout history</legend>
95
        [% UNLESS Koha.Preference('AnonymousPatron') %]
108
        [% UNLESS Koha.Preference('AnonymousPatron') %]
Lines 121-132 Link Here
121
    <fieldset>
134
    <fieldset>
122
        <legend>Warnings</legend>
135
        <legend>Warnings</legend>
123
        <ul>
136
        <ul>
124
            <li>[% IF ( totalToDelete ) %][% totalToDelete %] [% ELSE %]0 [% END %] patrons will be deleted</li>
137
            <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>
138
            <li>[% patrons_to_anonymize.size || 0 %] patron's checkout histories will be anonymized</li>
126
        </ul>
139
        </ul>
127
140
128
        <br />
141
        <br />
129
            [% IF ( totalToDelete ) %]
142
            [% IF patrons_to_delete.size %]
130
                <fieldset><legend>What do you want to do for deleted patrons?</legend>
143
                <fieldset><legend>What do you want to do for deleted patrons?</legend>
131
                <input id="delete" type="radio" name="radio" value="delete" />
144
                <input id="delete" type="radio" name="radio" value="delete" />
132
                <label for="delete">Permanently delete these patrons</label>
145
                <label for="delete">Permanently delete these patrons</label>
Lines 136-147 Link Here
136
149
137
                <br /><input id="testrun" type="radio" name="radio" value="testrun" checked="checked" />
150
                <br /><input id="testrun" type="radio" name="radio" value="testrun" checked="checked" />
138
                <label for="testrun">Do not remove any patrons (test run)</label>
151
                <label for="testrun">Do not remove any patrons (test run)</label>
139
                <input type="hidden" name="do_delete" value="[% totalToDelete %]" /></fieldset>
152
                <input type="hidden" name="do_delete" value="[% patrons_to_delete.size %]" /></fieldset>
140
153
141
            [% END %]
154
            [% END %]
142
            [% IF ( totalToAnonymize ) %]
155
            [% IF patrons_to_anonymize.size %]
143
                Checkout history for [% totalToAnonymize %] patrons will be anonymized
156
                Checkout history for [% patrons_to_anonymize.size %] patrons will be anonymized
144
                <input type="hidden" name="do_anonym" value="[% totalToAnonymize %]" />
157
                <input type="hidden" name="do_anonym" value="[% patrons_to_anonymize.size %]" />
145
            [% END %]
158
            [% END %]
146
159
147
            <input type="hidden" name="step" value="3" />
160
            <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 %]" />
162
            <input type="hidden" name="last_issue_date" value="[% last_issue_date | $KohaDates %]" />
150
            <input type="hidden" name="borrower_dateexpiry" value="[% borrower_dateexpiry | $KohaDates %]" />
163
            <input type="hidden" name="borrower_dateexpiry" value="[% borrower_dateexpiry | $KohaDates %]" />
151
            <input type="hidden" name="borrower_categorycode" value="[% borrower_categorycode %]" />
164
            <input type="hidden" name="borrower_categorycode" value="[% borrower_categorycode %]" />
165
            <input type="hidden" name="patron_list_id" value="[% patron_list_id %]" />
152
    </fieldset>
166
    </fieldset>
153
    <fieldset class="action"><input type="submit" value="Finish" /> <a class="cancel" href="/cgi-bin/koha/tools/cleanborrowers.pl">Cancel</a></fieldset>
167
    <fieldset class="action"><input type="submit" value="Finish" /> <a class="cancel" href="/cgi-bin/koha/tools/cleanborrowers.pl">Cancel</a></fieldset>
154
        </form>
168
        </form>
(-)a/tools/cleanborrowers.pl (-27 / +43 lines)
Lines 40-46 use C4::Output; Link Here
40
use C4::Members;        # GetBorrowersWhoHavexxxBorrowed.
40
use C4::Members;        # GetBorrowersWhoHavexxxBorrowed.
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 Koha::Database;
43
use Date::Calc qw/Today Add_Delta_YM/;
44
use Date::Calc qw/Today Add_Delta_YM/;
45
use Koha::List::Patron;
44
46
45
my $cgi = new CGI;
47
my $cgi = new CGI;
46
48
Lines 63-68 my $borrower_dateexpiry = Link Here
63
  $params->{borrower_dateexpiry}
65
  $params->{borrower_dateexpiry}
64
  ? dt_from_string $params->{borrower_dateexpiry}
66
  ? dt_from_string $params->{borrower_dateexpiry}
65
  : undef;
67
  : undef;
68
my $patron_list_id = $params->{patron_list_id};
66
69
67
my $borrower_categorycode = $params->{'borrower_categorycode'} || q{};
70
my $borrower_categorycode = $params->{'borrower_categorycode'} || q{};
68
71
Lines 80-107 if ( $step == 2 ) { Link Here
80
83
81
    my %checkboxes = map { $_ => 1 } split /\0/, $params->{'checkbox'};
84
    my %checkboxes = map { $_ => 1 } split /\0/, $params->{'checkbox'};
82
85
83
    my $totalDel;
86
    my $patrons_to_delete;
84
    my $membersToDelete;
85
    if ( $checkboxes{borrower} ) {
87
    if ( $checkboxes{borrower} ) {
86
        $membersToDelete = GetBorrowersToExpunge(
88
        $patrons_to_delete = GetBorrowersToExpunge(
87
            _get_selection_params($not_borrowered_since, $borrower_dateexpiry, $borrower_categorycode)
89
             _get_selection_params(
90
                  $not_borrowered_since,
91
                  $borrower_dateexpiry,
92
                  $borrower_categorycode,
93
                  $patron_list_id,
94
             )
88
        );
95
        );
89
        _skip_borrowers_with_nonzero_balance( $membersToDelete );
96
    }    
90
        $totalDel = scalar @$membersToDelete;
97
    _skip_borrowers_with_nonzero_balance($patrons_to_delete);
91
98
92
    }
99
    my $members_to_anonymize;
93
    my $totalAno;
94
    my $membersToAnonymize;
95
    if ( $checkboxes{issue} ) {
100
    if ( $checkboxes{issue} ) {
96
        $membersToAnonymize = GetBorrowersWithIssuesHistoryOlderThan($last_issue_date);
101
        $members_to_anonymize = GetBorrowersWithIssuesHistoryOlderThan($last_issue_date);
97
        $totalAno           = scalar @$membersToAnonymize;
98
    }
102
    }
99
103
100
    $template->param(
104
    $template->param(
101
        totalToDelete           => $totalDel,
105
        patrons_to_delete    => $patrons_to_delete,
102
        totalToAnonymize        => $totalAno,
106
        patrons_to_anonymize => $members_to_anonymize,
103
        memberstodelete_list    => $membersToDelete,
107
        patron_list_id          => $patron_list_id,
104
        memberstoanonymize_list => $membersToAnonymize,
105
    );
108
    );
106
}
109
}
107
110
Lines 113-130 elsif ( $step == 3 ) { Link Here
113
116
114
    # delete members
117
    # delete members
115
    if ($do_delete) {
118
    if ($do_delete) {
116
        my $membersToDelete = GetBorrowersToExpunge(
119
        my $patrons_to_delete = GetBorrowersToExpunge(
117
            _get_selection_params($not_borrowered_since, $borrower_dateexpiry, $borrower_categorycode)
120
                _get_selection_params(
118
        );
121
                    $not_borrowered_since, $borrower_dateexpiry,
119
        _skip_borrowers_with_nonzero_balance( $membersToDelete );
122
                    $borrower_categorycode, $patron_list_id
120
        $totalDel = scalar(@$membersToDelete);
123
                )
124
            );
125
        _skip_borrowers_with_nonzero_balance($patrons_to_delete);
126
127
        $totalDel = scalar(@$patrons_to_delete);
121
        $radio    = $params->{'radio'};
128
        $radio    = $params->{'radio'};
122
        for ( my $i = 0 ; $i < $totalDel ; $i++ ) {
129
        for ( my $i = 0 ; $i < $totalDel ; $i++ ) {
123
            $radio eq 'testrun' && last;
130
            $radio eq 'testrun' && last;
124
            my $borrowernumber = $membersToDelete->[$i]->{'borrowernumber'};
131
            my $borrowernumber = $patrons_to_delete->[$i]->{'borrowernumber'}
125
            $radio eq 'trash' && MoveMemberToDeleted( $borrowernumber );
132
              || $patrons_to_delete->[$i]->get_column('borrowernumber');
126
            C4::Members::HandleDelBorrower( $borrowernumber );
133
            $radio eq 'trash' && MoveMemberToDeleted($borrowernumber);
127
            DelMember( $borrowernumber );
134
            C4::Members::HandleDelBorrower($borrowernumber);
135
            DelMember($borrowernumber);
128
        }
136
        }
129
        $template->param(
137
        $template->param(
130
            do_delete => '1',
138
            do_delete => '1',
Lines 145-150 elsif ( $step == 3 ) { Link Here
145
        trash => ( $radio eq "trash" ) ? (1) : (0),
153
        trash => ( $radio eq "trash" ) ? (1) : (0),
146
        testrun => ( $radio eq "testrun" ) ? 1: 0,
154
        testrun => ( $radio eq "testrun" ) ? 1: 0,
147
    );
155
    );
156
} else { # $step == 1
157
    my @all_lists = GetPatronLists();
158
    my @non_empty_lists;
159
    foreach my $list (@all_lists){
160
    my @patrons = $list->patron_list_patrons();
161
        if( scalar @patrons ) { push(@non_empty_lists,$list) }
162
    }
163
    $template->param( patron_lists => [ @non_empty_lists ] );
148
}
164
}
149
165
150
$template->param(
166
$template->param(
Lines 163-175 sub _skip_borrowers_with_nonzero_balance { Link Here
163
    my $borrowers = shift;
179
    my $borrowers = shift;
164
    my $balance;
180
    my $balance;
165
    @$borrowers = map {
181
    @$borrowers = map {
166
        (undef, undef, $balance) = GetMemberIssuesAndFines( $_->{borrowernumber} );
182
        (undef, undef, $balance) = GetMemberIssuesAndFines( $_->{borrowernumber} || $_->get_column('borrowernumber') );
167
        ($balance != 0) ? (): ($_);
183
        ($balance != 0) ? (): ($_);
168
    } @$borrowers;
184
    } @$borrowers;
169
}
185
}
170
186
171
sub _get_selection_params {
187
sub _get_selection_params {
172
    my ($not_borrowered_since, $borrower_dateexpiry, $borrower_categorycode) = @_;
188
    my ($not_borrowered_since, $borrower_dateexpiry, $borrower_categorycode, $patron_list_id) = @_;
173
189
174
    my $params = {};
190
    my $params = {};
175
    $params->{not_borrowered_since} = output_pref({
191
    $params->{not_borrowered_since} = output_pref({
Lines 183-188 sub _get_selection_params { Link Here
183
        dateonly   => 1
199
        dateonly   => 1
184
    }) if $borrower_dateexpiry;
200
    }) if $borrower_dateexpiry;
185
    $params->{category_code} = $borrower_categorycode if $borrower_categorycode;
201
    $params->{category_code} = $borrower_categorycode if $borrower_categorycode;
202
    $params->{patron_list_id} = $patron_list_id if $patron_list_id;
186
203
187
    return $params;
204
    return $params;
188
};
205
};
189
- 

Return to bug 10612