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

(-)a/C4/Members.pm (-36 / +2 lines)
Lines 104-114 BEGIN { Link Here
104
        &changepassword
104
        &changepassword
105
    );
105
    );
106
106
107
    #Delete data
108
    push @EXPORT, qw(
109
        &DelMember
110
    );
111
112
    #Insert data
107
    #Insert data
113
    push @EXPORT, qw(
108
    push @EXPORT, qw(
114
        &AddMember
109
        &AddMember
Lines 1520-1559 sub GetSortDetails { Link Here
1520
    return ($sortvalue) unless ($lib);
1515
    return ($sortvalue) unless ($lib);
1521
}
1516
}
1522
1517
1523
=head2 DelMember
1524
1525
    DelMember($borrowernumber);
1526
1527
This function remove directly a borrower whitout writing it on deleteborrower.
1528
+ Deletes reserves for the borrower
1529
1530
=cut
1531
1532
sub DelMember {
1533
    my $dbh            = C4::Context->dbh;
1534
    my $borrowernumber = shift;
1535
    #warn "in delmember with $borrowernumber";
1536
    return unless $borrowernumber;    # borrowernumber is mandatory.
1537
    # Delete Patron's holds
1538
    my @holds = Koha::Holds->search({ borrowernumber => $borrowernumber });
1539
    $_->delete for @holds;
1540
1541
    my $query = "
1542
       DELETE
1543
       FROM borrowers
1544
       WHERE borrowernumber = ?
1545
   ";
1546
    my $sth = $dbh->prepare($query);
1547
    $sth->execute($borrowernumber);
1548
    logaction("MEMBERS", "DELETE", $borrowernumber, "") if C4::Context->preference("BorrowersLog");
1549
    return $sth->rows;
1550
}
1551
1552
=head2 HandleDelBorrower
1518
=head2 HandleDelBorrower
1553
1519
1554
     HandleDelBorrower($borrower);
1520
     HandleDelBorrower($borrower);
1555
1521
1556
When a member is deleted (DelMember in Members.pm), you should call me first.
1522
When a member is deleted, you should call me first.
1557
This routine deletes/moves lists and entries for the deleted member/borrower.
1523
This routine deletes/moves lists and entries for the deleted member/borrower.
1558
Lists owned by the borrower are deleted, but entries from the borrower to
1524
Lists owned by the borrower are deleted, but entries from the borrower to
1559
other lists are kept.
1525
other lists are kept.
Lines 2075-2081 WHERE categorycode = ? AND DATEDIFF( NOW(), dateenrolled ) > ? |; Link Here
2075
    $sth->execute( $category_code, $delay );
2041
    $sth->execute( $category_code, $delay );
2076
    my $cnt=0;
2042
    my $cnt=0;
2077
    while ( my ($borrowernumber) = $sth->fetchrow_array() ) {
2043
    while ( my ($borrowernumber) = $sth->fetchrow_array() ) {
2078
        DelMember($borrowernumber);
2044
        Koha::Patrons->find($borrowernumber)->delete;
2079
        $cnt++;
2045
        $cnt++;
2080
    }
2046
    }
2081
    return $cnt;
2047
    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 150-156 output_html_with_http_headers $input, $cookie, $template->output; Link Here
150
    my $patron = Koha::Patrons->find( $member );
150
    my $patron = Koha::Patrons->find( $member );
151
    $patron->move_to_deleted;
151
    $patron->move_to_deleted;
152
    C4::Members::HandleDelBorrower($member);
152
    C4::Members::HandleDelBorrower($member);
153
    DelMember($member);
153
    $patron->delete;
154
    print $input->redirect("/cgi-bin/koha/members/members-home.pl");
154
    print $input->redirect("/cgi-bin/koha/members/members-home.pl");
155
}
155
}
156
156
(-)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 73-81 for my $member (@$members) { Link Here
73
    }
73
    }
74
74
75
    if ( $confirm ) {
75
    if ( $confirm ) {
76
        my $deleted = eval {
76
        my $patron = Koha::Patrons->find( $borrowernumber );
77
            Koha::Patrons->find( $borrowernumber )->move_to_deleted;
77
        my $deleted = eval { $patron->move_to_deleted; };
78
        };
79
        if ($@ or not $deleted) {
78
        if ($@ or not $deleted) {
80
            say "Failed to delete patron $borrowernumber, cannot move it" . ( $@ ? ": ($@)" : "" );
79
            say "Failed to delete patron $borrowernumber, cannot move it" . ( $@ ? ": ($@)" : "" );
81
            $dbh->rollback;
80
            $dbh->rollback;
Lines 90-101 for my $member (@$members) { Link Here
90
            $dbh->rollback;
89
            $dbh->rollback;
91
            next;
90
            next;
92
        }
91
        }
93
    }
92
        eval { $patron->delete if $confirm; };
94
    eval { C4::Members::DelMember( $borrowernumber ) if $confirm; };
93
        if ($@) {
95
    if ($@) {
94
            say "Failed to delete patron $borrowernumber: $@)";
96
        say "Failed to delete patron $borrowernumber: $@)";
95
            $dbh->rollback;
97
        $dbh->rollback;
96
            next;
98
        next;
97
        }
99
    }
98
    }
100
    $dbh->commit;
99
    $dbh->commit;
101
    $deleted++;
100
    $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 (-3 / +23 lines)
Lines 19-28 Link Here
19
19
20
use Modern::Perl;
20
use Modern::Perl;
21
21
22
use Test::More tests => 7;
22
use Test::More tests => 8;
23
use Test::Warn;
23
use Test::Warn;
24
24
25
use C4::Members;
25
use Koha::Holds;
26
use Koha::Patron;
26
use Koha::Patron;
27
use Koha::Patrons;
27
use Koha::Patrons;
28
use Koha::Database;
28
use Koha::Database;
Lines 138-144 subtest "move_to_deleted" => sub { Link Here
138
        ->search( { borrowernumber => $patron->{borrowernumber} }, { result_class => 'DBIx::Class::ResultClass::HashRefInflator' } )
138
        ->search( { borrowernumber => $patron->{borrowernumber} }, { result_class => 'DBIx::Class::ResultClass::HashRefInflator' } )
139
        ->next;
139
        ->next;
140
    is_deeply( $deleted_patron, $patron, 'Koha::Patron->move_to_deleted should have correctly moved the patron to the deleted table' );
140
    is_deeply( $deleted_patron, $patron, 'Koha::Patron->move_to_deleted should have correctly moved the patron to the deleted table' );
141
    C4::Members::DelMember( $patron->{borrowernumber} );    # Cleanup
141
    $retrieved_patron->delete( $patron->{borrowernumber} );    # Cleanup
142
};
143
144
subtest "delete" => sub {
145
    plan tests => 4;
146
    t::lib::Mocks::mock_preference( 'BorrowersLog', 1 );
147
    my $patron           = $builder->build( { source => 'Borrower' } );
148
    my $retrieved_patron = Koha::Patrons->find( $patron->{borrowernumber} );
149
    my $hold             = $builder->build(
150
        {   source => 'Reserve',
151
            value  => { borrowernumber => $patron->{borrowernumber} }
152
        }
153
    );
154
    my $deleted = $retrieved_patron->delete;
155
    is( $deleted, 1, 'Koha::Patron->delete should return 1 if the patron has been correctly deleted' );
156
    is( Koha::Patrons->find( $patron->{borrowernumber} ), undef, 'Koha::Patron->delete should have deleted the patron');
157
158
    is( Koha::Holds->search( { borrowernumber => $patron->{borrowernumber} } )->count, 0, q|Koha::Patron->delete should have deleted patron's holds| );
159
160
    my $number_of_logs = $schema->resultset('ActionLog')->search( { module => 'MEMBERS', action => 'DELETE', object => $retrieved_patron->borrowernumber } )->count;
161
    is( $number_of_logs, 1, 'With BorrowerLogs, Koha::Patron->delete should have logged' );
142
};
162
};
143
163
144
$retrieved_patron_1->delete;
164
$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 => 77;
20
use Test::More tests => 74;
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 129-137 elsif ( $step == 3 ) { Link Here
129
        for ( my $i = 0 ; $i < $totalDel ; $i++ ) {
129
        for ( my $i = 0 ; $i < $totalDel ; $i++ ) {
130
            $radio eq 'testrun' && last;
130
            $radio eq 'testrun' && last;
131
            my $borrowernumber = $patrons_to_delete->[$i]->{'borrowernumber'};
131
            my $borrowernumber = $patrons_to_delete->[$i]->{'borrowernumber'};
132
            $radio eq 'trash' && Koha::Patrons->find($borrowernumber)->move_to_deleted;
132
            my $patron = Koha::Patrons->find($borrowernumber);
133
            $radio eq 'trash' && $patron->move_to_deleted;
133
            C4::Members::HandleDelBorrower($borrowernumber);
134
            C4::Members::HandleDelBorrower($borrowernumber);
134
            DelMember($borrowernumber);
135
            $patron->delete;
135
        }
136
        }
136
        $template->param(
137
        $template->param(
137
            do_delete => '1',
138
            do_delete => '1',
138
- 

Return to bug 16907