package Mojolicious::Plugin::Vparam::RU;
use Mojo::Base -strict;
use Mojolicious::Plugin::Vparam::Common;
sub check_inn($) {
return 'Value not defined' unless defined $_[0];
return 'Value not set' unless length $_[0];
return 'Wrong format' unless $_[0] =~ m{^(?:\d{10}|\d{12})$};
my @str = split '', $_[0];
if( @str == 10 ) {
return 'Checksum error'
unless $str[9] eq
(((
2 * $str[0] + 4 * $str[1] + 10 * $str[2] + 3 * $str[3] +
5 * $str[4] + 9 * $str[5] + 4 * $str[6] + 6 * $str[7] +
8 * $str[8]
) % 11 ) % 10);
return 0;
} elsif( @str == 12 ) {
return 'Checksum error'
unless $str[10] eq
(((
7 * $str[0] + 2 * $str[1] + 4 * $str[2] + 10 * $str[3] +
3 * $str[4] + 5 * $str[5] + 9 * $str[6] + 4 * $str[7] +
6 * $str[8] + 8 * $str[9]
) % 11 ) % 10)
&& $str[11] eq
(((
3 * $str[0] + 7 * $str[1] + 2 * $str[2] + 4 * $str[3] +
10 * $str[4] + 3 * $str[5] + 5 * $str[6] + 9 * $str[7] +
4 * $str[8] + 6 * $str[9] + 8 * $str[10]
) % 11 ) % 10);
return 0;
}
return 'Must be 10 or 12 digits';
}
sub check_kpp($) {
return 'Value not defined' unless defined $_[0];
return 'Value not set' unless length $_[0];
return 'Wrong format' unless $_[0] =~ m{^\d{9}$};
return 0;
}
sub register {
my ($class, $self, $app, $conf) = @_;
$app->vtype(
inn =>
pre => sub { trim $_[1] },
valid => sub { check_inn $_[1] },
);
$app->vtype(
kpp =>
pre => sub { trim $_[1] },
valid => sub { check_kpp $_[1] },
);
return;
}
1;