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

(-)a/C4/Members.pm (-37 / +3 lines)
Lines 86-92 BEGIN { Link Here
86
    #Check data
86
    #Check data
87
    push @EXPORT, qw(
87
    push @EXPORT, qw(
88
        &checkuserpassword
88
        &checkuserpassword
89
        &fixup_cardnumber
90
        &checkcardnumber
89
        &checkcardnumber
91
    );
90
    );
92
}
91
}
Lines 426-437 sub AddMember { Link Here
426
        $data{'dateenrolled'} = output_pref( { dt => dt_from_string, dateonly => 1, dateformat => 'iso' } );
425
        $data{'dateenrolled'} = output_pref( { dt => dt_from_string, dateonly => 1, dateformat => 'iso' } );
427
    }
426
    }
428
427
429
    if ( C4::Context->preference("autoMemberNum") ) {
430
        if ( not exists $data{cardnumber} or not defined $data{cardnumber} or $data{cardnumber} eq '' ) {
431
            $data{cardnumber} = fixup_cardnumber( $data{cardnumber} );
432
        }
433
    }
434
435
    $data{'privacy'} =
428
    $data{'privacy'} =
436
        $category->default_privacy() eq 'default' ? 1
429
        $category->default_privacy() eq 'default' ? 1
437
      : $category->default_privacy() eq 'never'   ? 2
430
      : $category->default_privacy() eq 'never'   ? 2
Lines 481-512 sub AddMember { Link Here
481
    return $data{borrowernumber};
474
    return $data{borrowernumber};
482
}
475
}
483
476
484
=head2 fixup_cardnumber
485
486
Warning: The caller is responsible for locking the members table in write
487
mode, to avoid database corruption.
488
489
=cut
490
491
sub fixup_cardnumber {
492
    my ($cardnumber) = @_;
493
    my $autonumber_members = C4::Context->boolean_preference('autoMemberNum') || 0;
494
495
    # Find out whether member numbers should be generated
496
    # automatically. Should be either "1" or something else.
497
    # Defaults to "0", which is interpreted as "no".
498
499
    ($autonumber_members) or return $cardnumber;
500
    my $dbh = C4::Context->dbh;
501
502
    my $sth = $dbh->prepare(
503
        'SELECT MAX( CAST( cardnumber AS SIGNED ) ) FROM borrowers WHERE cardnumber REGEXP "^-?[0-9]+$"'
504
    );
505
    $sth->execute;
506
    my ($result) = $sth->fetchrow;
507
    return $result + 1;
508
}
509
510
=head2 GetAllIssues
477
=head2 GetAllIssues
511
478
512
  $issues = &GetAllIssues($borrowernumber, $sortkey, $limit);
479
  $issues = &GetAllIssues($borrowernumber, $sortkey, $limit);
Lines 879-889 sub IssueSlip { Link Here
879
sub AddMember_Auto {
846
sub AddMember_Auto {
880
    my ( %borrower ) = @_;
847
    my ( %borrower ) = @_;
881
848
882
    $borrower{'cardnumber'} ||= fixup_cardnumber();
883
884
    $borrower{'borrowernumber'} = AddMember(%borrower);
849
    $borrower{'borrowernumber'} = AddMember(%borrower);
885
850
    my $patron = Koha::Patrons->find( $borrower{borrowernumber} )->unblessed;
886
    return ( %borrower );
851
    $patron->{password} = $borrower{password};
852
    return %$patron;
887
}
853
}
888
854
889
=head2 AddMember_Opac
855
=head2 AddMember_Opac
(-)a/Koha/Patron.pm (+43 lines)
Lines 83-88 Koha::Patron - Koha Patron Object class Link Here
83
83
84
=cut
84
=cut
85
85
86
=head3 new
87
88
=cut
89
90
sub new {
91
    my ( $class, $params ) = @_;
92
93
    return $class->SUPER::new($params);
94
}
95
96
sub fixup_cardnumber {
97
    my ( $self ) = @_;
98
    my $max = Koha::Patrons->search({
99
        cardnumber => {-regexp => '^-?[0-9]+$'}
100
    }, {
101
        select => \'CAST(cardnumber AS SIGNED)',
102
        as => ['cast_cardnumber']
103
    })->_resultset->get_column('cast_cardnumber')->max;
104
    $self->cardnumber($max+1);
105
}
106
107
sub store {
108
    my( $self ) = @_;
109
110
    $self->_result->result_source->schema->txn_do(
111
        sub {
112
            if (
113
                C4::Context->preference("autoMemberNum")
114
                and ( not defined $self->cardnumber
115
                    or $self->cardnumber eq '' )
116
              )
117
            {
118
                # Warning: The caller is responsible for locking the members table in write
119
                # mode, to avoid database corruption.
120
                # We are in a transaction but the table is not locked
121
                $self->fixup_cardnumber;
122
            }
123
124
            $self->SUPER::store;
125
        }
126
    );
127
}
128
86
=head3 delete
129
=head3 delete
87
130
88
$patron->delete
131
$patron->delete
(-)a/Koha/Patrons/Import.pm (-5 lines)
Lines 295-305 sub import_patrons { Link Here
295
            );
295
            );
296
        }
296
        }
297
        else {
297
        else {
298
            # FIXME: fixup_cardnumber says to lock table, but the web interface doesn't so this doesn't either.
299
            # At least this is closer to AddMember than in members/memberentry.pl
300
            if ( !$borrower{'cardnumber'} ) {
301
                $borrower{'cardnumber'} = fixup_cardnumber(undef);
302
            }
303
            if ( $borrowernumber = AddMember(%borrower) ) {
298
            if ( $borrowernumber = AddMember(%borrower) ) {
304
299
305
                if ( $borrower{debarred} ) {
300
                if ( $borrower{debarred} ) {
(-)a/opac/svc/auth/googleopenidconnect (-2 lines)
Lines 186-192 elsif ( defined $query->param('code') ) { Link Here
186
                my $auto_registration = C4::Context->preference('GoogleOpenIDConnectAutoRegister') // q{0};
186
                my $auto_registration = C4::Context->preference('GoogleOpenIDConnectAutoRegister') // q{0};
187
                my $borrower = Koha::Patrons->find( { email => $email } );
187
                my $borrower = Koha::Patrons->find( { email => $email } );
188
                if (! $borrower && $auto_registration==1) {
188
                if (! $borrower && $auto_registration==1) {
189
                    my $cardnumber = fixup_cardnumber();
190
                    my $firstname = $claims_json->{'given_name'} // q{};
189
                    my $firstname = $claims_json->{'given_name'} // q{};
191
                    my $surname = $claims_json->{'family_name'} // q{};
190
                    my $surname = $claims_json->{'family_name'} // q{};
192
                    my $delimiter = $firstname ? q{.} : q{};
191
                    my $delimiter = $firstname ? q{.} : q{};
Lines 198-204 elsif ( defined $query->param('code') ) { Link Here
198
                    if (defined $patron_category && defined $library) {
197
                    if (defined $patron_category && defined $library) {
199
                        my $password = undef;
198
                        my $password = undef;
200
                        my $borrowernumber = C4::Members::AddMember(
199
                        my $borrowernumber = C4::Members::AddMember(
201
                            cardnumber   => $cardnumber,
202
                            firstname    => $firstname,
200
                            firstname    => $firstname,
203
                            surname      => $surname,
201
                            surname      => $surname,
204
                            email        => $email,
202
                            email        => $email,
(-)a/t/db_dependent/Members.t (-4 / +1 lines)
Lines 388-400 is( $borrower->{password} eq $hashed_up, 1, 'Check password hash equals hash of Link Here
388
388
389
subtest 'Trivial test for AddMember_Auto' => sub {
389
subtest 'Trivial test for AddMember_Auto' => sub {
390
    plan tests => 3;
390
    plan tests => 3;
391
    my $members_mock = Test::MockModule->new( 'C4::Members' );
392
    $members_mock->mock( 'fixup_cardnumber', sub { 12345; } );
393
    my $library = $builder->build({ source => 'Branch' });
391
    my $library = $builder->build({ source => 'Branch' });
394
    my $category = $builder->build({ source => 'Category' });
392
    my $category = $builder->build({ source => 'Category' });
395
    my %borr = AddMember_Auto( surname=> 'Dick3', firstname => 'Philip', branchcode => $library->{branchcode}, categorycode => $category->{categorycode}, password => '34567890' );
393
    my %borr = AddMember_Auto( surname=> 'Dick3', firstname => 'Philip', branchcode => $library->{branchcode}, categorycode => $category->{categorycode}, password => '34567890' );
396
    ok( $borr{borrowernumber}, 'Borrower hash contains borrowernumber' );
394
    ok( $borr{borrowernumber}, 'Borrower hash contains borrowernumber' );
397
    is( $borr{cardnumber}, 12345, 'Borrower hash contains cardnumber' );
395
    like( $borr{cardnumber}, qr/^\d+$/, 'Borrower hash contains cardnumber' );
398
    my $patron = Koha::Patrons->find( $borr{borrowernumber} );
396
    my $patron = Koha::Patrons->find( $borr{borrowernumber} );
399
    isnt( $patron, undef, 'Patron found' );
397
    isnt( $patron, undef, 'Patron found' );
400
};
398
};
401
- 

Return to bug 20287