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

(-)a/C4/Members.pm (-36 / +2 lines)
Lines 105-115 BEGIN { Link Here
105
        &changepassword
105
        &changepassword
106
    );
106
    );
107
107
108
    #Delete data
109
    push @EXPORT, qw(
110
        &DelMember
111
    );
112
113
    #Insert data
108
    #Insert data
114
    push @EXPORT, qw(
109
    push @EXPORT, qw(
115
        &AddMember
110
        &AddMember
Lines 1623-1662 sub GetSortDetails { Link Here
1623
    return ($sortvalue) unless ($lib);
1618
    return ($sortvalue) unless ($lib);
1624
}
1619
}
1625
1620
1626
=head2 DelMember
1627
1628
    DelMember($borrowernumber);
1629
1630
This function remove directly a borrower whitout writing it on deleteborrower.
1631
+ Deletes reserves for the borrower
1632
1633
=cut
1634
1635
sub DelMember {
1636
    my $dbh            = C4::Context->dbh;
1637
    my $borrowernumber = shift;
1638
    #warn "in delmember with $borrowernumber";
1639
    return unless $borrowernumber;    # borrowernumber is mandatory.
1640
    # Delete Patron's holds
1641
    my @holds = Koha::Holds->search({ borrowernumber => $borrowernumber });
1642
    $_->delete for @holds;
1643
1644
    my $query = "
1645
       DELETE
1646
       FROM borrowers
1647
       WHERE borrowernumber = ?
1648
   ";
1649
    my $sth = $dbh->prepare($query);
1650
    $sth->execute($borrowernumber);
1651
    logaction("MEMBERS", "DELETE", $borrowernumber, "") if C4::Context->preference("BorrowersLog");
1652
    return $sth->rows;
1653
}
1654
1655
=head2 HandleDelBorrower
1621
=head2 HandleDelBorrower
1656
1622
1657
     HandleDelBorrower($borrower);
1623
     HandleDelBorrower($borrower);
1658
1624
1659
When a member is deleted (DelMember in Members.pm), you should call me first.
1625
When a member is deleted, you should call me first.
1660
This routine deletes/moves lists and entries for the deleted member/borrower.
1626
This routine deletes/moves lists and entries for the deleted member/borrower.
1661
Lists owned by the borrower are deleted, but entries from the borrower to
1627
Lists owned by the borrower are deleted, but entries from the borrower to
1662
other lists are kept.
1628
other lists are kept.
Lines 2225-2231 WHERE categorycode = ? AND DATEDIFF( NOW(), dateenrolled ) > ? |; Link Here
2225
    $sth->execute( $category_code, $delay );
2191
    $sth->execute( $category_code, $delay );
2226
    my $cnt=0;
2192
    my $cnt=0;
2227
    while ( my ($borrowernumber) = $sth->fetchrow_array() ) {
2193
    while ( my ($borrowernumber) = $sth->fetchrow_array() ) {
2228
        DelMember($borrowernumber);
2194
        Koha::Patrons->find($borrowernumber)->delete;
2229
        $cnt++;
2195
        $cnt++;
2230
    }
2196
    }
2231
    return $cnt;
2197
    return $cnt;
(-)a/Koha/Patron.pm (+27 lines)
Lines 23-29 use Modern::Perl; Link Here
23
use Carp;
23
use Carp;
24
24
25
use C4::Context;
25
use C4::Context;
26
use C4::Log;
26
use Koha::Database;
27
use Koha::Database;
28
use Koha::Holds;
27
use Koha::Issues;
29
use Koha::Issues;
28
use Koha::OldIssues;
30
use Koha::OldIssues;
29
use Koha::Patron::Categories;
31
use Koha::Patron::Categories;
Lines 42-47 Koha::Patron - Koha Patron Object class Link Here
42
44
43
=cut
45
=cut
44
46
47
=head3 delete
48
49
$patron->delete
50
51
Delete a patron.
52
53
=cut
54
55
sub delete {
56
    my ($self) = @_;
57
58
    my $deleted;
59
    $self->_result->result_source->schema->txn_do(
60
        sub {
61
            # Delete Patron's holds
62
            # FIXME Should be $patron->get_holds
63
            $_->delete for Koha::Holds->search( { borrowernumber => $self->borrowernumber } );
64
65
            logaction( "MEMBERS", "DELETE", $self->borrowernumber, "" ) if C4::Context->preference("BorrowersLog");
66
            $deleted = $self->SUPER::delete;
67
        }
68
    );
69
    return $deleted;
70
}
71
45
=head3 guarantor
72
=head3 guarantor
46
73
47
Returns a Koha::Patron object for this patron's guarantor
74
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 / +24 lines)
Lines 19-32 Link Here
19
19
20
use Modern::Perl;
20
use Modern::Perl;
21
21
22
use Test::More tests => 6;
22
use Test::More tests => 7;
23
23
24
use C4::Members;
24
use Koha::Holds;
25
use Koha::Patron;
25
use Koha::Patron;
26
use Koha::Patrons;
26
use Koha::Patrons;
27
use Koha::Database;
27
use Koha::Database;
28
28
29
use t::lib::TestBuilder;
29
use t::lib::TestBuilder;
30
use t::lib::Mocks;
30
31
31
my $schema = Koha::Database->new->schema;
32
my $schema = Koha::Database->new->schema;
32
$schema->storage->txn_begin;
33
$schema->storage->txn_begin;
Lines 109-115 subtest "move_to_deleted" => sub { Link Here
109
        ->search( { borrowernumber => $patron->{borrowernumber} }, { result_class => 'DBIx::Class::ResultClass::HashRefInflator' } )
110
        ->search( { borrowernumber => $patron->{borrowernumber} }, { result_class => 'DBIx::Class::ResultClass::HashRefInflator' } )
110
        ->next;
111
        ->next;
111
    is_deeply( $deleted_patron, $patron, 'Koha::Patron->move_to_deleted should have correctly moved the patron to the deleted table' );
112
    is_deeply( $deleted_patron, $patron, 'Koha::Patron->move_to_deleted should have correctly moved the patron to the deleted table' );
112
    C4::Members::DelMember( $patron->{borrowernumber} );    # Cleanup
113
    $retrieved_patron->delete( $patron->{borrowernumber} );    # Cleanup
114
};
115
116
subtest "delete" => sub {
117
    plan tests => 4;
118
    t::lib::Mocks::mock_preference( 'BorrowersLog', 1 );
119
    my $patron           = $builder->build( { source => 'Borrower' } );
120
    my $retrieved_patron = Koha::Patrons->find( $patron->{borrowernumber} );
121
    my $hold             = $builder->build(
122
        {   source => 'Reserve',
123
            value  => { borrowernumber => $patron->{borrowernumber} }
124
        }
125
    );
126
    my $deleted = $retrieved_patron->delete;
127
    is( $deleted, 1, 'Koha::Patron->delete should return 1 if the patron has been correctly deleted' );
128
    is( Koha::Patrons->find( $patron->{borrowernumber} ), undef, 'Koha::Patron->delete should have deleted the patron');
129
130
    is( Koha::Holds->search( { borrowernumber => $patron->{borrowernumber} } )->count, 0, q|Koha::Patron->delete should have deleted patron's holds| );
131
132
    my $number_of_logs = $schema->resultset('ActionLog')->search( { module => 'MEMBERS', action => 'DELETE', object => $retrieved_patron->borrowernumber } )->count;
133
    is( $number_of_logs, 1, 'With BorrowerLogs, Koha::Patron->delete should have logged' );
113
};
134
};
114
135
115
$retrieved_patron_1->delete;
136
$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