Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision b6fada0c

Von Moritz Bunkus vor fast 2 Jahren hinzugefügt

  • ID b6fada0c73a0a0a3cfe9dedc653fd9262f39f10f
  • Vorgänger 2a2c09d6
  • Nachfolger 8bb3b201

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.

Unterschiede anzeigen:

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