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

(-)a/C4/Members.pm (-36 / +2 lines)
Lines 103-113 BEGIN { Link Here
103
        &changepassword
103
        &changepassword
104
    );
104
    );
105
105
106
    #Delete data
107
    push @EXPORT, qw(
108
        &DelMember
109
    );
110
111
    #Insert data
106
    #Insert data
112
    push @EXPORT, qw(
107
    push @EXPORT, qw(
113
        &AddMember
108
        &AddMember
Lines 1519-1558 sub GetSortDetails { Link Here
1519
    return ($sortvalue) unless ($lib);
1514
    return ($sortvalue) unless ($lib);
1520
}
1515
}
1521
1516
1522
=head2 DelMember
1523
1524
    DelMember($borrowernumber);
1525
1526
This function remove directly a borrower whitout writing it on deleteborrower.
1527
+ Deletes reserves for the borrower
1528
1529
=cut
1530
1531
sub DelMember {
1532
    my $dbh            = C4::Context->dbh;
1533
    my $borrowernumber = shift;
1534
    #warn "in delmember with $borrowernumber";
1535
    return unless $borrowernumber;    # borrowernumber is mandatory.
1536
    # Delete Patron's holds
1537
    my @holds = Koha::Holds->search({ borrowernumber => $borrowernumber });
1538
    $_->delete for @holds;
1539
1540
    my $query = "
1541
       DELETE
1542
       FROM borrowers
1543
       WHERE borrowernumber = ?
1544
   ";
1545
    my $sth = $dbh->prepare($query);
1546
    $sth->execute($borrowernumber);
1547
    logaction("MEMBERS", "DELETE", $borrowernumber, "") if C4::Context->preference("BorrowersLog");
1548
    return $sth->rows;
1549
}
1550
1551
=head2 HandleDelBorrower
1517
=head2 HandleDelBorrower
1552
1518
1553
     HandleDelBorrower($borrower);
1519
     HandleDelBorrower($borrower);
1554
1520
1555
When a member is deleted (DelMember in Members.pm), you should call me first.
1521
When a member is deleted, you should call me first.
1556
This routine deletes/moves lists and entries for the deleted member/borrower.
1522
This routine deletes/moves lists and entries for the deleted member/borrower.
1557
Lists owned by the borrower are deleted, but entries from the borrower to
1523
Lists owned by the borrower are deleted, but entries from the borrower to
1558
other lists are kept.
1524
other lists are kept.
Lines 2054-2060 WHERE categorycode = ? AND DATEDIFF( NOW(), dateenrolled ) > ? |; Link Here
2054
    $sth->execute( $category_code, $delay );
2020
    $sth->execute( $category_code, $delay );
2055
    my $cnt=0;
2021
    my $cnt=0;
2056
    while ( my ($borrowernumber) = $sth->fetchrow_array() ) {
2022
    while ( my ($borrowernumber) = $sth->fetchrow_array() ) {
2057
        DelMember($borrowernumber);
2023
        Koha::Patrons->find($borrowernumber)->delete;
2058
        $cnt++;
2024
        $cnt++;
2059
    }
2025
    }
2060
    return $cnt;
2026
    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