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

(-)a/C4/Members.pm (-36 / +2 lines)
Lines 98-108 BEGIN { Link Here
98
        &changepassword
98
        &changepassword
99
    );
99
    );
100
100
101
    #Delete data
102
    push @EXPORT, qw(
103
        &DelMember
104
    );
105
106
    #Insert data
101
    #Insert data
107
    push @EXPORT, qw(
102
    push @EXPORT, qw(
108
        &AddMember
103
        &AddMember
Lines 1308-1347 sub SetAge{ Link Here
1308
    return $borrower;
1303
    return $borrower;
1309
}    # sub SetAge
1304
}    # sub SetAge
1310
1305
1311
=head2 DelMember
1312
1313
    DelMember($borrowernumber);
1314
1315
This function remove directly a borrower whitout writing it on deleteborrower.
1316
+ Deletes reserves for the borrower
1317
1318
=cut
1319
1320
sub DelMember {
1321
    my $dbh            = C4::Context->dbh;
1322
    my $borrowernumber = shift;
1323
    #warn "in delmember with $borrowernumber";
1324
    return unless $borrowernumber;    # borrowernumber is mandatory.
1325
    # Delete Patron's holds
1326
    my @holds = Koha::Holds->search({ borrowernumber => $borrowernumber });
1327
    $_->delete for @holds;
1328
1329
    my $query = "
1330
       DELETE
1331
       FROM borrowers
1332
       WHERE borrowernumber = ?
1333
   ";
1334
    my $sth = $dbh->prepare($query);
1335
    $sth->execute($borrowernumber);
1336
    logaction("MEMBERS", "DELETE", $borrowernumber, "") if C4::Context->preference("BorrowersLog");
1337
    return $sth->rows;
1338
}
1339
1340
=head2 HandleDelBorrower
1306
=head2 HandleDelBorrower
1341
1307
1342
     HandleDelBorrower($borrower);
1308
     HandleDelBorrower($borrower);
1343
1309
1344
When a member is deleted (DelMember in Members.pm), you should call me first.
1310
When a member is deleted, you should call me first.
1345
This routine deletes/moves lists and entries for the deleted member/borrower.
1311
This routine deletes/moves lists and entries for the deleted member/borrower.
1346
Lists owned by the borrower are deleted, but entries from the borrower to
1312
Lists owned by the borrower are deleted, but entries from the borrower to
1347
other lists are kept.
1313
other lists are kept.
Lines 1800-1806 WHERE categorycode = ? AND DATEDIFF( NOW(), dateenrolled ) > ? |; Link Here
1800
    $sth->execute( $category_code, $delay );
1766
    $sth->execute( $category_code, $delay );
1801
    my $cnt=0;
1767
    my $cnt=0;
1802
    while ( my ($borrowernumber) = $sth->fetchrow_array() ) {
1768
    while ( my ($borrowernumber) = $sth->fetchrow_array() ) {
1803
        DelMember($borrowernumber);
1769
        Koha::Patrons->find($borrowernumber)->delete;
1804
        $cnt++;
1770
        $cnt++;
1805
    }
1771
    }
1806
    return $cnt;
1772
    return $cnt;
(-)a/Koha/Patron.pm (+26 lines)
Lines 26-31 use C4::Context; Link Here
26
use C4::Log;
26
use C4::Log;
27
use Koha::Database;
27
use Koha::Database;
28
use Koha::DateUtils;
28
use Koha::DateUtils;
29
use Koha::Holds;
29
use Koha::Issues;
30
use Koha::Issues;
30
use Koha::OldIssues;
31
use Koha::OldIssues;
31
use Koha::Patron::Categories;
32
use Koha::Patron::Categories;
Lines 44-49 Koha::Patron - Koha Patron Object class Link Here
44
45
45
=cut
46
=cut
46
47
48
=head3 delete
49
50
$patron->delete
51
52
Delete a patron.
53
54
=cut
55
56
sub delete {
57
    my ($self) = @_;
58
59
    my $deleted;
60
    $self->_result->result_source->schema->txn_do(
61
        sub {
62
            # Delete Patron's holds
63
            # FIXME Should be $patron->get_holds
64
            $_->delete for Koha::Holds->search( { borrowernumber => $self->borrowernumber } );
65
66
            logaction( "MEMBERS", "DELETE", $self->borrowernumber, "" ) if C4::Context->preference("BorrowersLog");
67
            $deleted = $self->SUPER::delete;
68
        }
69
    );
70
    return $deleted;
71
}
72
47
=head3 guarantor
73
=head3 guarantor
48
74
49
Returns a Koha::Patron object for this patron's guarantor
75
Returns a Koha::Patron object for this patron's guarantor
(-)a/members/deletemem.pl (-1 / +1 lines)
Lines 164-170 if ( $op eq 'delete_confirm' or $countissues > 0 or $flags->{'CHARGES'} or $is_ Link Here
164
    my $patron = Koha::Patrons->find( $member );
164
    my $patron = Koha::Patrons->find( $member );
165
    $patron->move_to_deleted;
165
    $patron->move_to_deleted;
166
    C4::Members::HandleDelBorrower($member);
166
    C4::Members::HandleDelBorrower($member);
167
    DelMember($member);
167
    $patron->delete;
168
    # TODO Tell the user everything went ok
168
    # TODO Tell the user everything went ok
169
    print $input->redirect("/cgi-bin/koha/members/members-home.pl");
169
    print $input->redirect("/cgi-bin/koha/members/members-home.pl");
170
    exit 0; # Exit without error
170
    exit 0; # Exit without error
(-)a/misc/cronjobs/delete_expired_opac_registrations.pl (-1 lines)
Lines 29-35 BEGIN { Link Here
29
}
29
}
30
30
31
use C4::Context;
31
use C4::Context;
32
use C4::Members qw/ DelMember /;
33
32
34
my $help;
33
my $help;
35
my $confirm;
34
my $confirm;
(-)a/misc/cronjobs/delete_patrons.pl (-9 / +8 lines)
Lines 78-86 for my $member (@$members) { Link Here
78
    }
78
    }
79
79
80
    if ( $confirm ) {
80
    if ( $confirm ) {
81
        my $deleted = eval {
81
        my $patron = Koha::Patrons->find( $borrowernumber );
82
            Koha::Patrons->find( $borrowernumber )->move_to_deleted;
82
        my $deleted = eval { $patron->move_to_deleted; };
83
        };
84
        if ($@ or not $deleted) {
83
        if ($@ or not $deleted) {
85
            say "Failed to delete patron $borrowernumber, cannot move it" . ( $@ ? ": ($@)" : "" );
84
            say "Failed to delete patron $borrowernumber, cannot move it" . ( $@ ? ": ($@)" : "" );
86
            $dbh->rollback;
85
            $dbh->rollback;
Lines 95-106 for my $member (@$members) { Link Here
95
            $dbh->rollback;
94
            $dbh->rollback;
96
            next;
95
            next;
97
        }
96
        }
98
    }
97
        eval { $patron->delete if $confirm; };
99
    eval { C4::Members::DelMember( $borrowernumber ) if $confirm; };
98
        if ($@) {
100
    if ($@) {
99
            say "Failed to delete patron $borrowernumber: $@)";
101
        say "Failed to delete patron $borrowernumber: $@)";
100
            $dbh->rollback;
102
        $dbh->rollback;
101
            next;
103
        next;
102
        }
104
    }
103
    }
105
    $dbh->commit;
104
    $dbh->commit;
106
    $deleted++;
105
    $deleted++;
(-)a/misc/cronjobs/delete_unverified_opac_registrations.pl (-1 lines)
Lines 29-35 BEGIN { Link Here
29
}
29
}
30
30
31
use C4::Context;
31
use C4::Context;
32
use C4::Members qw/ DelMember /;
33
32
34
my $help;
33
my $help;
35
my $confirm;
34
my $confirm;
(-)a/t/db_dependent/Auth_with_ldap.t (-1 / +3 lines)
Lines 25-30 use Test::Warn; Link Here
25
25
26
use C4::Context;
26
use C4::Context;
27
27
28
use Koha::Patrons;
29
28
my $dbh = C4::Context->dbh;
30
my $dbh = C4::Context->dbh;
29
31
30
# Start transaction
32
# Start transaction
Lines 179-185 subtest 'checkpw_ldap tests' => sub { Link Here
179
181
180
        $update               = 0;
182
        $update               = 0;
181
        $desired_count_result = 0;    # user auth problem
183
        $desired_count_result = 0;    # user auth problem
182
        C4::Members::DelMember( $borrower->{borrowernumber} );
184
        Koha::Patrons->find( $borrower->{borrowernumber} )->delete;
183
        reload_ldap_module();
185
        reload_ldap_module();
184
        is(
186
        is(
185
            C4::Auth_with_ldap::checkpw_ldap( $dbh, 'hola', password => 'hey' ),
187
            C4::Auth_with_ldap::checkpw_ldap( $dbh, 'hola', password => 'hey' ),
(-)a/t/db_dependent/Koha/Patrons.t (-4 / +23 lines)
Lines 19-31 Link Here
19
19
20
use Modern::Perl;
20
use Modern::Perl;
21
21
22
use Test::More tests => 9;
22
use Test::More tests => 10;
23
use Test::Warn;
23
use Test::Warn;
24
24
25
use C4::Circulation;
26
27
use C4::Members;
25
use C4::Members;
28
26
27
use Koha::Holds;
29
use Koha::Patron;
28
use Koha::Patron;
30
use Koha::Patrons;
29
use Koha::Patrons;
31
use Koha::Database;
30
use Koha::Database;
Lines 220-226 subtest "move_to_deleted" => sub { Link Here
220
        ->search( { borrowernumber => $patron->{borrowernumber} }, { result_class => 'DBIx::Class::ResultClass::HashRefInflator' } )
219
        ->search( { borrowernumber => $patron->{borrowernumber} }, { result_class => 'DBIx::Class::ResultClass::HashRefInflator' } )
221
        ->next;
220
        ->next;
222
    is_deeply( $deleted_patron, $patron, 'Koha::Patron->move_to_deleted should have correctly moved the patron to the deleted table' );
221
    is_deeply( $deleted_patron, $patron, 'Koha::Patron->move_to_deleted should have correctly moved the patron to the deleted table' );
223
    C4::Members::DelMember( $patron->{borrowernumber} );    # Cleanup
222
    $retrieved_patron->delete( $patron->{borrowernumber} );    # Cleanup
223
};
224
225
subtest "delete" => sub {
226
    plan tests => 4;
227
    t::lib::Mocks::mock_preference( 'BorrowersLog', 1 );
228
    my $patron           = $builder->build( { source => 'Borrower' } );
229
    my $retrieved_patron = Koha::Patrons->find( $patron->{borrowernumber} );
230
    my $hold             = $builder->build(
231
        {   source => 'Reserve',
232
            value  => { borrowernumber => $patron->{borrowernumber} }
233
        }
234
    );
235
    my $deleted = $retrieved_patron->delete;
236
    is( $deleted, 1, 'Koha::Patron->delete should return 1 if the patron has been correctly deleted' );
237
    is( Koha::Patrons->find( $patron->{borrowernumber} ), undef, 'Koha::Patron->delete should have deleted the patron');
238
239
    is( Koha::Holds->search( { borrowernumber => $patron->{borrowernumber} } )->count, 0, q|Koha::Patron->delete should have deleted patron's holds| );
240
241
    my $number_of_logs = $schema->resultset('ActionLog')->search( { module => 'MEMBERS', action => 'DELETE', object => $retrieved_patron->borrowernumber } )->count;
242
    is( $number_of_logs, 1, 'With BorrowerLogs, Koha::Patron->delete should have logged' );
224
};
243
};
225
244
226
$retrieved_patron_1->delete;
245
$retrieved_patron_1->delete;
(-)a/t/db_dependent/Members.t (-17 / +2 lines)
Lines 17-23 Link Here
17
17
18
use Modern::Perl;
18
use Modern::Perl;
19
19
20
use Test::More tests => 82;
20
use Test::More tests => 79;
21
use Test::MockModule;
21
use Test::MockModule;
22
use Data::Dumper;
22
use Data::Dumper;
23
use C4::Context;
23
use C4::Context;
Lines 154-174 ModMember(borrowernumber => $member->{'borrowernumber'}, dateexpiry => '2001-01- Link Here
154
$member = GetMemberDetails($member->{'borrowernumber'});
154
$member = GetMemberDetails($member->{'borrowernumber'});
155
ok($member->{is_expired}, "GetMemberDetails() indicates that patron is expired");
155
ok($member->{is_expired}, "GetMemberDetails() indicates that patron is expired");
156
156
157
# Create a reserve for the patron
158
$builder->build({
159
    source => 'Reserve',
160
    value  => {
161
        borrowernumber => $member->{ borrowernumber }
162
    }
163
});
164
is( Koha::Holds->search({ borrowernumber => $member->{borrowernumber} })->count,
165
    1, 'Hold created correctly' );
166
DelMember($member->{borrowernumber});
167
my $borrower = GetMember( cardnumber => $CARDNUMBER );
168
is( $borrower, undef, 'DelMember should remove the patron' );
169
is( Koha::Holds->search({ borrowernumber => $member->{borrowernumber} })->count,
170
    0, 'Hold deleted correctly' );
171
172
# Check_Userid tests
157
# Check_Userid tests
173
%data = (
158
%data = (
174
    cardnumber   => "123456789",
159
    cardnumber   => "123456789",
Lines 192-198 is( Check_Userid( 'tomasito.none', '' ), 0, Link Here
192
is( Check_Userid( 'tomasitoxxx', '' ), 1,
177
is( Check_Userid( 'tomasitoxxx', '' ), 1,
193
    'non-existent userid -> unique (blank borrowernumber)' );
178
    'non-existent userid -> unique (blank borrowernumber)' );
194
179
195
$borrower = GetMember( borrowernumber => $borrowernumber );
180
my $borrower = GetMember( borrowernumber => $borrowernumber );
196
is( $borrower->{dateofbirth}, undef, 'AddMember should undef dateofbirth if empty string is given');
181
is( $borrower->{dateofbirth}, undef, 'AddMember should undef dateofbirth if empty string is given');
197
is( $borrower->{debarred}, undef, 'AddMember should undef debarred if empty string is given');
182
is( $borrower->{debarred}, undef, 'AddMember should undef debarred if empty string is given');
198
isnt( $borrower->{dateexpiry}, '0000-00-00', 'AddMember should not set dateexpiry to 0000-00-00 if empty string is given');
183
isnt( $borrower->{dateexpiry}, '0000-00-00', 'AddMember should not set dateexpiry to 0000-00-00 if empty string is given');
(-)a/tools/cleanborrowers.pl (-3 / +3 lines)
Lines 147-155 elsif ( $step == 3 ) { Link Here
147
        for ( my $i = 0 ; $i < $totalDel ; $i++ ) {
147
        for ( my $i = 0 ; $i < $totalDel ; $i++ ) {
148
            $radio eq 'testrun' && last;
148
            $radio eq 'testrun' && last;
149
            my $borrowernumber = $patrons_to_delete->[$i]->{'borrowernumber'};
149
            my $borrowernumber = $patrons_to_delete->[$i]->{'borrowernumber'};
150
            $radio eq 'trash' && Koha::Patrons->find($borrowernumber)->move_to_deleted;
150
            my $patron = Koha::Patrons->find($borrowernumber);
151
            $radio eq 'trash' && $patron->move_to_deleted;
151
            C4::Members::HandleDelBorrower($borrowernumber);
152
            C4::Members::HandleDelBorrower($borrowernumber);
152
            DelMember($borrowernumber);
153
            $patron->delete;
153
        }
154
        }
154
        $template->param(
155
        $template->param(
155
            do_delete => '1',
156
            do_delete => '1',
156
- 

Return to bug 16907