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

(-)a/C4/Members.pm (-13 / +18 lines)
Lines 1345-1370 sub checkcardnumber { Link Here
1345
1345
1346
    return 1 if $sth->fetchrow_hashref;
1346
    return 1 if $sth->fetchrow_hashref;
1347
1347
1348
    if ( my $length = C4::Context->preference('CardnumberLength') ) {
1348
    my ( $min_length, $max_length ) = get_cardnumber_length();
1349
    return 2
1350
        if length $cardnumber > $max_length
1351
        or length $cardnumber < $min_length;
1352
1353
    return 0;
1354
}
1355
1356
sub get_cardnumber_length {
1357
    my ( $min, $max ) = ( 0, 16 );
1358
    if ( my $cardnumber_length = C4::Context->preference('CardnumberLength') ) {
1349
        # Is integer and length match
1359
        # Is integer and length match
1350
        if (
1360
        if ( $cardnumber_length =~ m|^\d+$| ) {
1351
            $length =~ m|^\d+$|
1361
            $min = $max = $cardnumber_length;
1352
                and length $cardnumber == $length
1353
        ) {
1354
            return 0
1355
        }
1362
        }
1356
        # Else assuming it is a range
1363
        # Else assuming it is a range
1357
        else {
1364
        elsif ( $cardnumber_length =~ m|(\d+),(\d*)| ) {
1358
            my $qr = qr|^\d{$length}$|;
1365
            $min = $1;
1359
            return 0
1366
            $max = $2 || 16; # borrowers.cardnumber is a varchar(16)
1360
                if $cardnumber =~ $qr;
1361
        }
1367
        }
1362
        return 1
1368
1363
    }
1369
    }
1364
    return 0;
1370
    return ( $min, $max );
1365
}
1371
}
1366
1372
1367
1368
=head2 getzipnamecity (OUEST-PROVENCE)
1373
=head2 getzipnamecity (OUEST-PROVENCE)
1369
1374
1370
take all info from table city for the fields city and  zip
1375
take all info from table city for the fields city and  zip
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/members/memberentrygen.tt (-6 / +5 lines)
Lines 178-185 Link Here
178
			[% IF ( ERROR_login_exist ) %]
178
			[% IF ( ERROR_login_exist ) %]
179
				<li id="ERROR_login_exist">Username/password already exists.</li>
179
				<li id="ERROR_login_exist">Username/password already exists.</li>
180
			[% END %]
180
			[% END %]
181
            [% IF ( ERROR_cardnumber ) %]
181
            [% IF ERROR_cardnumber_already_exists %]
182
                <li id="ERROR_cardnumber">Cardnumber already in use or not in a good format.</li>
182
                <li id="ERROR_cardnumber">Cardnumber already in use.</li>
183
            [% END %]
184
            [% IF ERROR_cardnumber_length %]
185
                <li id="ERROR_cardnumber">Cardnumber length is incorrect.</li>
183
            [% END %]
186
            [% END %]
184
			[% IF ( ERROR_age_limitations ) %]
187
			[% IF ( ERROR_age_limitations ) %]
185
				<li id="ERROR_age_limitations">Patron's age is incorrect for their category.  
188
				<li id="ERROR_age_limitations">Patron's age is incorrect for their category.  
Lines 886-896 Link Here
886
            <label for="cardnumber">
889
            <label for="cardnumber">
887
          [% END %]
890
          [% END %]
888
          Card number: </label>
891
          Card number: </label>
889
          [% IF minlength_cardnumber && maxlength_cardnumber %]
890
              <input type="text" id="cardnumber" name="cardnumber" size="20" value="[% cardnumber %]" pattern=".{[% minlength_cardnumber %],[% maxlength_cardnumber %]}" title="between [% minlength_cardnumber %] and [% maxlength_cardnumber %] characters" />
891
          [% ELSE %]
892
              <input type="text" id="cardnumber" name="cardnumber" size="20" value="[% cardnumber %]" />
892
              <input type="text" id="cardnumber" name="cardnumber" size="20" value="[% cardnumber %]" />
893
          [% END %]
894
          [% IF ( mandatorycardnumber ) %]<span class="required">Required</span>[% END %]
893
          [% IF ( mandatorycardnumber ) %]<span class="required">Required</span>[% END %]
895
        </li>
894
        </li>
896
      [% END %]
895
      [% END %]
(-)a/members/memberentry.pl (-20 / +15 lines)
Lines 294-302 if ($op eq 'save' || $op eq 'insert'){ Link Here
294
    # If the cardnumber is blank, treat it as null.
294
    # If the cardnumber is blank, treat it as null.
295
    $newdata{'cardnumber'} = undef if $newdata{'cardnumber'} =~ /^\s*$/;
295
    $newdata{'cardnumber'} = undef if $newdata{'cardnumber'} =~ /^\s*$/;
296
296
297
    if (checkcardnumber($newdata{cardnumber},$newdata{borrowernumber})){ 
297
    if (my $error_code = checkcardnumber($newdata{cardnumber},$newdata{borrowernumber})){
298
        push @errors, 'ERROR_cardnumber';
298
        push @errors, $error_code == 1
299
    } 
299
            ? 'ERROR_cardnumber_already_exists'
300
            : $error_code == 2
301
                ? 'ERROR_cardnumber_length'
302
                : ()
303
    }
304
300
    if ($newdata{dateofbirth} && $dateofbirthmandatory) {
305
    if ($newdata{dateofbirth} && $dateofbirthmandatory) {
301
        my $age = GetAge($newdata{dateofbirth});
306
        my $age = GetAge($newdata{dateofbirth});
302
        my $borrowercategory=GetBorrowercategory($newdata{'categorycode'});   
307
        my $borrowercategory=GetBorrowercategory($newdata{'categorycode'});   
Lines 751-773 if(defined($data{'contacttitle'})){ Link Here
751
  $template->param("contacttitle_" . $data{'contacttitle'} => "SELECTED");
756
  $template->param("contacttitle_" . $data{'contacttitle'} => "SELECTED");
752
}
757
}
753
758
754
if ( my $cardnumber_length = C4::Context->preference('CardnumberLength') ) {
759
755
    my ( $min, $max );
760
my ( $min, $max ) = C4::Members::get_cardnumber_length();
756
    # Is integer and length match
761
if ( defined $min ) {
757
    if ( $cardnumber_length =~ m|^\d+$| ) {
762
    $template->param(
758
        $min = $max = $cardnumber_length;
763
        minlength_cardnumber => $min,
759
    }
764
        maxlength_cardnumber => $max
760
    # Else assuming it is a range
765
    );
761
    elsif ( $cardnumber_length =~ m|(\d+),(\d*)| ) {
762
        $min = $1;
763
        $max = $2 || 16; # borrowers.cardnumber is a varchar(16)
764
    }
765
    if ( defined $min ) {
766
        $template->param(
767
            minlength_cardnumber => $min,
768
            maxlength_cardnumber => $max
769
        );
770
    }
771
}
766
}
772
767
773
output_html_with_http_headers $input, $cookie, $template->output;
768
output_html_with_http_headers $input, $cookie, $template->output;
(-)a/t/Members/checkcardnumber.t (-11 / +15 lines)
Lines 1-7 Link Here
1
#!/usr/bin/env perl
1
#!/usr/bin/env perl
2
2
3
use Modern::Perl;
3
use Modern::Perl;
4
use Test::More tests =>14;
4
use Test::More tests =>18;
5
5
6
use Test::MockModule;
6
use Test::MockModule;
7
use DBD::Mock;
7
use DBD::Mock;
Lines 23-65 my $rs = []; Link Here
23
23
24
my $pref = "10";
24
my $pref = "10";
25
set_pref( $module_context, $pref );
25
set_pref( $module_context, $pref );
26
26
is_deeply( [ C4::Members::get_cardnumber_length() ], [ 10, 10 ], '10 => min=10 and max=10');
27
$dbh->{mock_add_resultset} = $rs;
27
$dbh->{mock_add_resultset} = $rs;
28
is( C4::Members::checkcardnumber( q{123456789} ), 1, "123456789 is shorter than $pref");
28
is( C4::Members::checkcardnumber( q{123456789} ), 2, "123456789 is shorter than $pref");
29
$dbh->{mock_add_resultset} = $rs;
29
$dbh->{mock_add_resultset} = $rs;
30
is( C4::Members::checkcardnumber( q{12345678901234567890} ), 1, "12345678901234567890 is longer than $pref");
30
is( C4::Members::checkcardnumber( q{1234567890123456} ), 2, "1234567890123456 is longer than $pref");
31
$dbh->{mock_add_resultset} = $rs;
31
$dbh->{mock_add_resultset} = $rs;
32
is( C4::Members::checkcardnumber( q{1234567890} ), 0, "1234567890 is equal to $pref");
32
is( C4::Members::checkcardnumber( q{1234567890} ), 0, "1234567890 is equal to $pref");
33
33
34
$pref = q|10,10|; # Same as before !
34
$pref = q|10,10|; # Same as before !
35
set_pref( $module_context, $pref );
35
set_pref( $module_context, $pref );
36
is_deeply( [ C4::Members::get_cardnumber_length() ], [ 10, 10 ], '10,10 => min=10 and max=10');
36
$dbh->{mock_add_resultset} = $rs;
37
$dbh->{mock_add_resultset} = $rs;
37
is( C4::Members::checkcardnumber( q{123456789} ), 1, "123456789 is shorter than $pref");
38
is( C4::Members::checkcardnumber( q{123456789} ), 2, "123456789 is shorter than $pref");
38
$dbh->{mock_add_resultset} = $rs;
39
$dbh->{mock_add_resultset} = $rs;
39
is( C4::Members::checkcardnumber( q{12345678901234567890} ), 1, "12345678901234567890 is longer than $pref");
40
is( C4::Members::checkcardnumber( q{1234567890123456} ), 2, "1234567890123456 is longer than $pref");
40
$dbh->{mock_add_resultset} = $rs;
41
$dbh->{mock_add_resultset} = $rs;
41
is( C4::Members::checkcardnumber( q{1234567890} ), 0, "1234567890 is equal to $pref");
42
is( C4::Members::checkcardnumber( q{1234567890} ), 0, "1234567890 is equal to $pref");
42
43
43
$pref = q|8,10|; # between 8 and 10 chars
44
$pref = q|8,10|; # between 8 and 10 chars
44
set_pref( $module_context, $pref );
45
set_pref( $module_context, $pref );
46
is_deeply( [ C4::Members::get_cardnumber_length() ], [ 8, 10 ], '8,10 => min=8 and max=10');
45
$dbh->{mock_add_resultset} = $rs;
47
$dbh->{mock_add_resultset} = $rs;
46
is( C4::Members::checkcardnumber( q{12345678} ), 0, "12345678 matches $pref");
48
is( C4::Members::checkcardnumber( q{12345678} ), 0, "12345678 matches $pref");
47
$dbh->{mock_add_resultset} = $rs;
49
$dbh->{mock_add_resultset} = $rs;
48
is( C4::Members::checkcardnumber( q{12345678901234567890} ), 1, "12345678901234567890 is longer than $pref");
50
is( C4::Members::checkcardnumber( q{1234567890123456} ), 2, "1234567890123456 is longer than $pref");
49
$dbh->{mock_add_resultset} = $rs;
51
$dbh->{mock_add_resultset} = $rs;
50
is( C4::Members::checkcardnumber( q{1234567} ), 1, "1234567 is shorter than $pref");
52
is( C4::Members::checkcardnumber( q{1234567} ), 2, "1234567 is shorter than $pref");
51
$dbh->{mock_add_resultset} = $rs;
53
$dbh->{mock_add_resultset} = $rs;
52
is( C4::Members::checkcardnumber( q{1234567890} ), 0, "1234567890 matches $pref");
54
is( C4::Members::checkcardnumber( q{1234567890} ), 0, "1234567890 matches $pref");
53
55
54
$pref = q|8,|; # At least 8 chars
56
$pref = q|8,|; # At least 8 chars
55
set_pref( $module_context, $pref );
57
set_pref( $module_context, $pref );
58
is_deeply( [ C4::Members::get_cardnumber_length() ], [ 8, 16 ], '8, => min=8 and max=16');
56
$dbh->{mock_add_resultset} = $rs;
59
$dbh->{mock_add_resultset} = $rs;
57
is( C4::Members::checkcardnumber( q{1234567} ), 1, "1234567 is shorter than $pref");
60
is( C4::Members::checkcardnumber( q{1234567} ), 2, "1234567 is shorter than $pref");
58
$dbh->{mock_add_resultset} = $rs;
61
$dbh->{mock_add_resultset} = $rs;
59
is( C4::Members::checkcardnumber( q{12345678901234567890} ), 0, "12345678901234567890 matches $pref");
62
is( C4::Members::checkcardnumber( q{1234567890123456} ), 0, "1234567890123456 matches $pref");
60
$dbh->{mock_add_resultset} = $rs;
63
$dbh->{mock_add_resultset} = $rs;
61
is( C4::Members::checkcardnumber( q{1234567890} ), 0, "12345678 matches $pref");
64
is( C4::Members::checkcardnumber( q{1234567890} ), 0, "12345678 matches $pref");
62
65
66
67
63
sub set_pref {
68
sub set_pref {
64
    my ( $module, $value ) = @_;
69
    my ( $module, $value ) = @_;
65
    $module->mock('preference', sub { return $value } );
70
    $module->mock('preference', sub { return $value } );
66
- 

Return to bug 10861