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

(-)a/C4/Members.pm (-36 / +2 lines)
Lines 99-109 BEGIN { Link Here
99
        &changepassword
99
        &changepassword
100
    );
100
    );
101
101
102
    #Delete data
103
    push @EXPORT, qw(
104
        &DelMember
105
    );
106
107
    #Insert data
102
    #Insert data
108
    push @EXPORT, qw(
103
    push @EXPORT, qw(
109
        &AddMember
104
        &AddMember
Lines 1352-1391 sub SetAge{ Link Here
1352
    return $borrower;
1347
    return $borrower;
1353
}    # sub SetAge
1348
}    # sub SetAge
1354
1349
1355
=head2 DelMember
1356
1357
    DelMember($borrowernumber);
1358
1359
This function remove directly a borrower whitout writing it on deleteborrower.
1360
+ Deletes reserves for the borrower
1361
1362
=cut
1363
1364
sub DelMember {
1365
    my $dbh            = C4::Context->dbh;
1366
    my $borrowernumber = shift;
1367
    #warn "in delmember with $borrowernumber";
1368
    return unless $borrowernumber;    # borrowernumber is mandatory.
1369
    # Delete Patron's holds
1370
    my @holds = Koha::Holds->search({ borrowernumber => $borrowernumber });
1371
    $_->delete for @holds;
1372
1373
    my $query = "
1374
       DELETE
1375
       FROM borrowers
1376
       WHERE borrowernumber = ?
1377
   ";
1378
    my $sth = $dbh->prepare($query);
1379
    $sth->execute($borrowernumber);
1380
    logaction("MEMBERS", "DELETE", $borrowernumber, "") if C4::Context->preference("BorrowersLog");
1381
    return $sth->rows;
1382
}
1383
1384
=head2 HandleDelBorrower
1350
=head2 HandleDelBorrower
1385
1351
1386
     HandleDelBorrower($borrower);
1352
     HandleDelBorrower($borrower);
1387
1353
1388
When a member is deleted (DelMember in Members.pm), you should call me first.
1354
When a member is deleted, you should call me first.
1389
This routine deletes/moves lists and entries for the deleted member/borrower.
1355
This routine deletes/moves lists and entries for the deleted member/borrower.
1390
Lists owned by the borrower are deleted, but entries from the borrower to
1356
Lists owned by the borrower are deleted, but entries from the borrower to
1391
other lists are kept.
1357
other lists are kept.
Lines 1844-1850 WHERE categorycode = ? AND DATEDIFF( NOW(), dateenrolled ) > ? |; Link Here
1844
    $sth->execute( $category_code, $delay );
1810
    $sth->execute( $category_code, $delay );
1845
    my $cnt=0;
1811
    my $cnt=0;
1846
    while ( my ($borrowernumber) = $sth->fetchrow_array() ) {
1812
    while ( my ($borrowernumber) = $sth->fetchrow_array() ) {
1847
        DelMember($borrowernumber);
1813
        Koha::Patrons->find($borrowernumber)->delete;
1848
        $cnt++;
1814
        $cnt++;
1849
    }
1815
    }
1850
    return $cnt;
1816
    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