Revision b6fada0c
Von Moritz Bunkus vor fast 2 Jahren hinzugefügt
SL/MT940.pm | ||
---|---|---|
sub _join_entries {
|
||
my ($parts, $from, $to, $separator) = @_;
|
||
|
||
$separator //= ' ';
|
||
$separator //= '';
|
||
|
||
return
|
||
join $separator,
|
||
grep { $_ }
|
||
map { s{^\s+|\s+$}{}g; $_ }
|
||
grep { $_ }
|
||
map { $parts->{$_} }
|
||
($from..$to);
|
||
}
|
||
|
||
sub _join_entries_sepa {
|
||
my ($parts) = @_;
|
||
|
||
my $line = '';
|
||
|
||
foreach my $field (grep { $_ } map { $parts->{$_} } (20..29)) {
|
||
if (($line ne '') && ($field =~ m{^[A-Z]+\+})) {
|
||
$line .= ' ';
|
||
}
|
||
$line .= $field;
|
||
}
|
||
|
||
return $line;
|
||
}
|
||
|
||
sub _join_entries_austria {
|
||
my ($parts) = @_;
|
||
|
||
return _join_entries($parts, 20, 23, ' ');
|
||
}
|
||
|
||
sub parse {
|
||
my ($class, $file_name, %params) = @_;
|
||
|
||
... | ... | |
);
|
||
|
||
} elsif (%transaction && ($line->[0] =~ m{^:86:})) {
|
||
if ($line->[0] =~ m{^:86:\d+([^\d])(.+)}) {
|
||
if ($line->[0] =~ m{^:86:(\d{3})([^\d])(.+)}) {
|
||
# structured
|
||
my ($separator, $rest) = ($1, $2);
|
||
my %parts = map { ((substr($_, 0, 2) // '0') * 1 => substr($_, 2)) } split quotemeta($separator), $rest;
|
||
|
||
$transaction{purpose} = _join_entries(\%parts, 20, 29);
|
||
$transaction{remote_name} = _join_entries(\%parts, 32, 33, '');
|
||
my $code = $1;
|
||
my $separator = $2;
|
||
my $rest = $3;
|
||
my $is_austria = $separator eq '~';
|
||
my $is_sepa = !$is_austria && ($code =~ m{^1});
|
||
my %parts = map { ((substr($_, 0, 2) // '0') * 1 => substr($_, 2)) } split quotemeta($separator), $rest;
|
||
|
||
$transaction{purpose} = $is_sepa ? _join_entries_sepa(\%parts)
|
||
: $is_austria ? _join_entries(\%parts, 20, 23, ' ')
|
||
: _join_entries(\%parts, 20, 29);
|
||
$transaction{remote_name} = _join_entries(\%parts, 32, 33);
|
||
$transaction{remote_bank_code} = $parts{30};
|
||
$transaction{remote_account_number} = $parts{31};
|
||
|
Auch abrufbar als: Unified diff
MT940: SEPA-Unterfelder im Verwendungszweck
1. Bei SEPA-Transaktionen ist das strukturierte Feld 86 noch mal mit
Sonder-Codes unterteilt, die aus vier Großbuchstaben und einem +
bestehen. Für so einen Fall die Felder anders mit Leerzeichen
zusammenfügen.
2. Allgemein im Verwendungszweck jetzt doch kein forciertes
Leerzeichen zwischen den Elementen 20…29 des Verwendungszwecks
einfügen.