Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision b6fada0c

Von Moritz Bunkus vor etwa 1 Jahr 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
12 12
sub _join_entries {
13 13
  my ($parts, $from, $to, $separator) = @_;
14 14

  
15
  $separator //= ' ';
15
  $separator //= '';
16 16

  
17 17
  return
18 18
    join $separator,
19 19
    grep { $_ }
20
    map  { s{^\s+|\s+$}{}g; $_ }
21
    grep { $_ }
22 20
    map  { $parts->{$_} }
23 21
    ($from..$to);
24 22
}
25 23

  
24
sub _join_entries_sepa {
25
  my ($parts) = @_;
26

  
27
  my $line = '';
28

  
29
  foreach my $field (grep { $_ } map  { $parts->{$_} } (20..29)) {
30
    if (($line ne '') && ($field =~ m{^[A-Z]+\+})) {
31
      $line .= ' ';
32
    }
33
    $line .= $field;
34
  }
35

  
36
  return $line;
37
}
38

  
39
sub _join_entries_austria {
40
  my ($parts) = @_;
41

  
42
  return _join_entries($parts, 20, 23, ' ');
43
}
44

  
26 45
sub parse {
27 46
  my ($class, $file_name, %params) = @_;
28 47

  
......
112 131
      );
113 132

  
114 133
    } elsif (%transaction && ($line->[0] =~ m{^:86:})) {
115
      if ($line->[0] =~ m{^:86:\d+([^\d])(.+)}) {
134
      if ($line->[0] =~ m{^:86:(\d{3})([^\d])(.+)}) {
116 135
        # structured
117
        my ($separator, $rest) = ($1, $2);
118
        my %parts              = map { ((substr($_, 0, 2) // '0') * 1 => substr($_, 2)) } split quotemeta($separator), $rest;
119

  
120
        $transaction{purpose}               = _join_entries(\%parts, 20, 29);
121
        $transaction{remote_name}           = _join_entries(\%parts, 32, 33, '');
136
        my $code       = $1;
137
        my $separator  = $2;
138
        my $rest       = $3;
139
        my $is_austria = $separator eq '~';
140
        my $is_sepa    = !$is_austria && ($code =~ m{^1});
141
        my %parts      = map { ((substr($_, 0, 2) // '0') * 1 => substr($_, 2)) } split quotemeta($separator), $rest;
142

  
143
        $transaction{purpose}               = $is_sepa    ? _join_entries_sepa(\%parts)
144
                                            : $is_austria ? _join_entries(\%parts, 20, 23, ' ')
145
                                            :               _join_entries(\%parts, 20, 29);
146
        $transaction{remote_name}           = _join_entries(\%parts, 32, 33);
122 147
        $transaction{remote_bank_code}      = $parts{30};
123 148
        $transaction{remote_account_number} = $parts{31};
124 149

  

Auch abrufbar als: Unified diff