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

(-)a/C4/Members.pm (-13 / +20 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 ) = ( 1, 16 ); # borrowers.cardnumber is a varchar(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
1362
                if $cardnumber_length >= $min
1353
        ) {
1363
                    and $cardnumber_length <= $max;
1354
            return 0
1355
        }
1364
        }
1356
        # Else assuming it is a range
1365
        # Else assuming it is a range
1357
        else {
1366
        elsif ( $cardnumber_length =~ m|(\d*),(\d*)| ) {
1358
            my $qr = qr|^\d{$length}$|;
1367
            $min = $1 if $1 and $min < $1;
1359
            return 0
1368
            $max = $2 if $2 and $max > $2;
1360
                if $cardnumber =~ $qr;
1361
        }
1369
        }
1362
        return 1
1370
1363
    }
1371
    }
1364
    return 0;
1372
    return ( $min, $max );
1365
}
1373
}
1366
1374
1367
1368
=head2 getzipnamecity (OUEST-PROVENCE)
1375
=head2 getzipnamecity (OUEST-PROVENCE)
1369
1376
1370
take all info from table city for the fields city and  zip
1377
take all info from table city for the fields city and  zip
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/members/memberentrygen.tt (-4 / +9 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-895 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 %]
892
          [% IF minlength_cardnumber == maxlength_cardnumber %]
893
              <input type="text" id="cardnumber" name="cardnumber" size="20" value="[% cardnumber %]" pattern=".{[% minlength_cardnumber %]}" title="Exactly [% minlength_cardnumber %] characters" />
894
          [% ELSIF 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" />
895
              <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 %]
896
          [% ELSE %]
892
              <input type="text" id="cardnumber" name="cardnumber" size="20" value="[% cardnumber %]" />
897
               <input type="text" id="cardnumber" name="cardnumber" size="20" value="[% cardnumber %]" />
893
          [% END %]
898
          [% END %]
894
          [% IF ( mandatorycardnumber ) %]<span class="required">Required</span>[% END %]
899
          [% IF ( mandatorycardnumber ) %]<span class="required">Required</span>[% END %]
895
        </li>
900
        </li>
(-)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/cardnumber.t (+80 lines)
Line 0 Link Here
1
#!/usr/bin/env perl
2
3
use Modern::Perl;
4
use Test::More tests => 22;
5
6
use Test::MockModule;
7
use DBD::Mock;
8
9
use_ok('C4::Members');
10
11
my $module_context = new Test::MockModule('C4::Context');
12
$module_context->mock(
13
    '_new_dbh',
14
    sub {
15
        my $dbh = DBI->connect( 'DBI:Mock:', '', '' )
16
          || die "Cannot create handle: $DBI::errstr\n";
17
        return $dbh;
18
    }
19
);
20
21
my $dbh = C4::Context->dbh;
22
my $rs = [];
23
24
my $pref = "10";
25
set_pref( $module_context, $pref );
26
is_deeply( [ C4::Members::get_cardnumber_length() ], [ 10, 10 ], '10 => min=10 and max=10');
27
$dbh->{mock_add_resultset} = $rs;
28
is( C4::Members::checkcardnumber( q{123456789} ), 2, "123456789 is shorter than $pref");
29
$dbh->{mock_add_resultset} = $rs;
30
is( C4::Members::checkcardnumber( q{1234567890123456} ), 2, "1234567890123456 is longer than $pref");
31
$dbh->{mock_add_resultset} = $rs;
32
is( C4::Members::checkcardnumber( q{1234567890} ), 0, "1234567890 is equal to $pref");
33
34
$pref = q|10,10|; # Same as before !
35
set_pref( $module_context, $pref );
36
is_deeply( [ C4::Members::get_cardnumber_length() ], [ 10, 10 ], '10,10 => min=10 and max=10');
37
$dbh->{mock_add_resultset} = $rs;
38
is( C4::Members::checkcardnumber( q{123456789} ), 2, "123456789 is shorter than $pref");
39
$dbh->{mock_add_resultset} = $rs;
40
is( C4::Members::checkcardnumber( q{1234567890123456} ), 2, "1234567890123456 is longer than $pref");
41
$dbh->{mock_add_resultset} = $rs;
42
is( C4::Members::checkcardnumber( q{1234567890} ), 0, "1234567890 is equal to $pref");
43
44
$pref = q|8,10|; # between 8 and 10 chars
45
set_pref( $module_context, $pref );
46
is_deeply( [ C4::Members::get_cardnumber_length() ], [ 8, 10 ], '8,10 => min=8 and max=10');
47
$dbh->{mock_add_resultset} = $rs;
48
is( C4::Members::checkcardnumber( q{12345678} ), 0, "12345678 matches $pref");
49
$dbh->{mock_add_resultset} = $rs;
50
is( C4::Members::checkcardnumber( q{1234567890123456} ), 2, "1234567890123456 is longer than $pref");
51
$dbh->{mock_add_resultset} = $rs;
52
is( C4::Members::checkcardnumber( q{1234567} ), 2, "1234567 is shorter than $pref");
53
$dbh->{mock_add_resultset} = $rs;
54
is( C4::Members::checkcardnumber( q{1234567890} ), 0, "1234567890 matches $pref");
55
56
$pref = q|8,|; # At least 8 chars
57
set_pref( $module_context, $pref );
58
is_deeply( [ C4::Members::get_cardnumber_length() ], [ 8, 16 ], '8, => min=8 and max=16');
59
$dbh->{mock_add_resultset} = $rs;
60
is( C4::Members::checkcardnumber( q{1234567} ), 2, "1234567 is shorter than $pref");
61
$dbh->{mock_add_resultset} = $rs;
62
is( C4::Members::checkcardnumber( q{1234567890123456} ), 0, "1234567890123456 matches $pref");
63
$dbh->{mock_add_resultset} = $rs;
64
is( C4::Members::checkcardnumber( q{1234567890} ), 0, "1234567890 matches $pref");
65
66
$pref = q|,8|; # max 8 chars
67
set_pref( $module_context, $pref );
68
is_deeply( [ C4::Members::get_cardnumber_length() ], [ 1, 8 ], ',8 => min=1 and max=8');
69
$dbh->{mock_add_resultset} = $rs;
70
is( C4::Members::checkcardnumber( q{1234567} ), 0, "1234567 matches $pref");
71
$dbh->{mock_add_resultset} = $rs;
72
is( C4::Members::checkcardnumber( q{1234567890123456} ), 2, "1234567890123456 is longer than $pref");
73
$dbh->{mock_add_resultset} = $rs;
74
is( C4::Members::checkcardnumber( q{1234567890} ), 2, "1234567890 is longer than $pref");
75
76
77
sub set_pref {
78
    my ( $module, $value ) = @_;
79
    $module->mock('preference', sub { return $value } );
80
}
(-)a/t/Members/checkcardnumber.t (-67 lines)
Lines 1-66 Link Here
1
#!/usr/bin/env perl
2
3
use Modern::Perl;
4
use Test::More tests =>14;
5
6
use Test::MockModule;
7
use DBD::Mock;
8
9
use_ok('C4::Members');
10
11
my $module_context = new Test::MockModule('C4::Context');
12
$module_context->mock(
13
    '_new_dbh',
14
    sub {
15
        my $dbh = DBI->connect( 'DBI:Mock:', '', '' )
16
          || die "Cannot create handle: $DBI::errstr\n";
17
        return $dbh;
18
    }
19
);
20
21
my $dbh = C4::Context->dbh;
22
my $rs = [];
23
24
my $pref = "10";
25
set_pref( $module_context, $pref );
26
27
$dbh->{mock_add_resultset} = $rs;
28
is( C4::Members::checkcardnumber( q{123456789} ), 1, "123456789 is shorter than $pref");
29
$dbh->{mock_add_resultset} = $rs;
30
is( C4::Members::checkcardnumber( q{12345678901234567890} ), 1, "12345678901234567890 is longer than $pref");
31
$dbh->{mock_add_resultset} = $rs;
32
is( C4::Members::checkcardnumber( q{1234567890} ), 0, "1234567890 is equal to $pref");
33
34
$pref = q|10,10|; # Same as before !
35
set_pref( $module_context, $pref );
36
$dbh->{mock_add_resultset} = $rs;
37
is( C4::Members::checkcardnumber( q{123456789} ), 1, "123456789 is shorter than $pref");
38
$dbh->{mock_add_resultset} = $rs;
39
is( C4::Members::checkcardnumber( q{12345678901234567890} ), 1, "12345678901234567890 is longer than $pref");
40
$dbh->{mock_add_resultset} = $rs;
41
is( C4::Members::checkcardnumber( q{1234567890} ), 0, "1234567890 is equal to $pref");
42
43
$pref = q|8,10|; # between 8 and 10 chars
44
set_pref( $module_context, $pref );
45
$dbh->{mock_add_resultset} = $rs;
46
is( C4::Members::checkcardnumber( q{12345678} ), 0, "12345678 matches $pref");
47
$dbh->{mock_add_resultset} = $rs;
48
is( C4::Members::checkcardnumber( q{12345678901234567890} ), 1, "12345678901234567890 is longer than $pref");
49
$dbh->{mock_add_resultset} = $rs;
50
is( C4::Members::checkcardnumber( q{1234567} ), 1, "1234567 is shorter than $pref");
51
$dbh->{mock_add_resultset} = $rs;
52
is( C4::Members::checkcardnumber( q{1234567890} ), 0, "1234567890 matches $pref");
53
54
$pref = q|8,|; # At least 8 chars
55
set_pref( $module_context, $pref );
56
$dbh->{mock_add_resultset} = $rs;
57
is( C4::Members::checkcardnumber( q{1234567} ), 1, "1234567 is shorter than $pref");
58
$dbh->{mock_add_resultset} = $rs;
59
is( C4::Members::checkcardnumber( q{12345678901234567890} ), 0, "12345678901234567890 matches $pref");
60
$dbh->{mock_add_resultset} = $rs;
61
is( C4::Members::checkcardnumber( q{1234567890} ), 0, "12345678 matches $pref");
62
63
sub set_pref {
64
    my ( $module, $value ) = @_;
65
    $module->mock('preference', sub { return $value } );
66
}
67
- 

Return to bug 10861