sub generate_last_digit {
my ($number) = @_;
- #XXX doesn't work for Isracard, should die
+ die "invalid operation" if length($number) == 8 || length($number) == 9;
my ($i, $sum, $weight);
$number =~ s/\D//g;
- return 1 if $number =~ /^[\dx]{8,9}$/; #XXX Isracard does not use LUHN,
- # validation not yet implemented
+ if ( $number =~ /^[\dx]{8,9}$/ ) { # Isracard
+ $number = "0$number" if length($number) == 8;
+ for($i=1;$i<length($number);$i++){
+ $sum += substr($number,9-$i,1) * $i;
+ }
+ return 1 if $sum%11 == 0;
+ return 0;
+ }
return 0 unless length($number) >= 13 && 0+$number;
--- /dev/null
+
+use Test::More tests => 1;
+use Business::CreditCard;
+
+ok( test_card_validation() );
+
+sub test_card_validation {
+ my %test_table=(
+ '10830529' => 'Isracard',
+ '010830529' => 'Isracard',
+ );
+ while( my ($k, $v)=each(%test_table) ){
+ if(!validate($k)){
+ warn "Card $k - should be a valid $v but validation failed\n";
+ return;
+ }
+ }
+ return 1;
+}
+