File Coverage

blib/lib/Algorithm/CheckDigits/M11_006.pm
Criterion Covered Total %
statement 46 50 92.0
branch 7 14 50.0
condition 1 3 33.3
subroutine 12 12 100.0
pod 4 5 80.0
total 70 84 83.3


line stmt bran cond sub pod time code
1             package Algorithm::CheckDigits::M11_006;
2              
3 1     1   20 use 5.006;
  1         3  
4 1     1   5 use strict;
  1         2  
  1         34  
5 1     1   6 use warnings;
  1         2  
  1         26  
6 1     1   5 use integer;
  1         2  
  1         5  
7              
8 1     1   33 use version; our $VERSION = 'v1.3.5';
  1         3  
  1         4  
9              
10             our @ISA = qw(Algorithm::CheckDigits);
11              
12             my @weight = ( 6, 3, 7, 9, 10, 5, 8, 4, 2, 1 );
13              
14             sub new {
15 1     1 0 3 my $proto = shift;
16 1         2 my $type = shift;
17 1   33     6 my $class = ref($proto) || $proto;
18 1         3 my $self = bless({}, $class);
19 1         8 $self->{type} = lc($type);
20 1         5 return $self;
21             } # new()
22              
23             sub is_valid {
24 2     2 1 9 my ($self,$number) = @_;
25 2 50       15 if ($number =~ /^(\d{4}-?\d{4})-?(\d\d)-?(\d{10})$/) {
26 2         9 return uc($2) eq $self->_compute_checkdigits($1,$3);
27             }
28 0         0 return ''
29             } # is_valid()
30              
31             sub complete {
32 1     1 1 97 my ($self,$number) = @_;
33 1 50       8 if ($number =~ /^(\d{4}-?\d{4})[-\s]+(\d{10})$/) {
34 1         5 return "$1-"
35             . $self->_compute_checkdigits($1,$2)
36             . "-$2";
37             }
38 0         0 return '';
39             } # complete()
40              
41             sub basenumber {
42 1     1 1 3 my ($self,$number) = @_;
43 1 50       9 if ($number =~ /^(\d{4}-?\d{4})-?(\d\d)-?(\d{10})$/) {
44 1 50       4 return "$1- -$3" if ($2 eq $self->_compute_checkdigits($1,$3));
45             }
46 0         0 return '';
47             } # basenumber()
48              
49             sub checkdigit {
50 1     1 1 4 my ($self,$number) = @_;
51 1 50       9 if ($number =~ /^(\d{4}-?\d{4})-?(\d\d)-?(\d{10})$/) {
52 1 50       4 return $2 if ($2 eq $self->_compute_checkdigits($1,$3));
53             }
54 0         0 return '';
55             } # checkdigit()
56              
57             sub _compute_checkdigits {
58 5     5   10 my $self = shift;
59 5         10 my $bank = shift;
60 5         10 my $account = shift;
61              
62 5         19 $bank =~ s/-//g;
63              
64             my $calc = sub {
65 10     10   40 my @digits = split(//,shift);
66 10         14 my $sum = 0;
67 10         26 for (my $i = 0; $i <= $#digits; $i++) {
68 90         186 $sum += $weight[$i] * $digits[$#digits - $i];
69             }
70 10         13 $sum %= 11;
71 10 50       32 return $sum ? 11 - $sum : 0;
72 5         25 };
73 5         11 my $first = $calc->($bank);
74 5         12 my $second = $calc->($account);
75              
76 5         60 return sprintf("%d%d",$first,$second);
77             } # _compute_checkdigit()
78              
79             # Preloaded methods go here.
80              
81             1;
82             __END__