Projekt

Allgemein

Profil

Herunterladen (2,9 KB) Statistiken
| Zweig: | Markierung: | Revision:
07a768c3 Moritz Bunkus
package SL::DB::Helper::IBANValidation;

use strict;

use Algorithm::CheckDigits ();
use Carp;
use SL::Locale::String qw(t8);

828e417c Geoffrey Richardson
my $_validator;
07a768c3 Moritz Bunkus
my %_countries = (
AT => { len => 20, name => t8('Austria') },
BE => { len => 16, name => t8('Belgium') },
CH => { len => 21, name => t8('Switzerland') },
CZ => { len => 24, name => t8('Czech Republic') },
DE => { len => 22, name => t8('Germany') },
DK => { len => 18, name => t8('Denmark') },
FR => { len => 27, name => t8('France') },
IT => { len => 27, name => t8('Italy') },
LU => { len => 20, name => t8('Luxembourg') },
NL => { len => 18, name => t8('Netherlands') },
PL => { len => 28, name => t8('Poland') },
);

sub _validate {
my ($self, $attribute) = @_;

my $iban = $self->$attribute // '';
$iban =~ s{\s+}{}g;

return () unless length($iban);

828e417c Geoffrey Richardson
$_validator //= Algorithm::CheckDigits::CheckDigits('iban');
07a768c3 Moritz Bunkus
828e417c Geoffrey Richardson
return ($::locale->text("The value '#1' is not a valid IBAN.", $iban)) if !$_validator->is_valid($iban);
07a768c3 Moritz Bunkus
my $country = $_countries{substr($iban, 0, 2)};

return () if !$country || (length($iban) == $country->{len});

return ($::locale->text("The IBAN '#1' is not valid as IBANs in #2 must be exactly #3 characters long.", $iban, $country->{name}, $country->{len}));
}

sub import {
my ($package, @attributes) = @_;

my $caller_package = caller;
@attributes = qw(iban) unless @attributes;

no strict 'refs';

*{ $caller_package . '::validate_ibans' } = sub {
my ($self) = @_;

return map { SL::DB::Helper::IBANValidation::_validate($self, $_) } @attributes;
};
}

1;

__END__

=pod

=encoding utf8

=head1 NAME

SL::DB::Helper::IBANValidation - Mixin for validating IBAN attributes

=head1 SYNOPSIS

package SL::DB::SomeObject;
use SL::DB::Helper::IBANValidation [ ATTRIBUTES ];

sub validate {
my ($self) = @_;

my @errors;
push @errors, $self->validate_ibans;

return @errors;
}

c19bf55e Geoffrey Richardson
This mixin provides a function C<validate_ibans> that returns a list
07a768c3 Moritz Bunkus
of error messages, one for each attribute that fails the IBAN
validation. If all attributes are valid or empty then an empty list
is returned.

c19bf55e Geoffrey Richardson
The names of attributes to check can be given as an import list to the
07a768c3 Moritz Bunkus
mixin package. If no attributes are given the single attribute C<iban>
is used.

=head1 FUNCTIONS

=over 4

=item C<validate_ibans>

This function iterates over all configured attributes and validates
their content according to the IBAN standard. An attribute that is
undefined, empty or consists solely of whitespace is considered valid,
too.

The function returns a list of human-readable error messages suitable
for use in a general C<validate> function (see SYNOPSIS). For each
attribute failing the check the list will include one error message.

If all attributes are valid then an empty list is returned.

=back

=head1 BUGS

Nothing here yet.

=head1 AUTHOR

Moritz Bunkus E<lt>m.bunkus@linet-services.deE<gt>

=cut