Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 07a768c3

Von Moritz Bunkus vor fast 9 Jahren hinzugefügt

  • ID 07a768c3e250b258f8abcbf6c3a430bbddbfe664
  • Vorgänger f9b53d4a
  • Nachfolger 07fe79dd

IBAN-Validierung bei Kunden-/Lieferantenstammdaten sowie bei Bankkonten

Unterschiede anzeigen:

SL/DB/BankAccount.pm
1
# This file has been auto-generated only because it didn't exist.
2
# Feel free to modify it at will; it will not be overwritten automatically.
3

  
4 1
package SL::DB::BankAccount;
5 2

  
6 3
use strict;
......
8 5
use SL::DB::MetaSetup::BankAccount;
9 6
use SL::DB::Manager::BankAccount;
10 7
use SL::DB::Helper::ActsAsList;
8
use SL::DB::Helper::IBANValidation;
11 9

  
12 10
__PACKAGE__->meta->initialize;
13 11

  
......
39 37
  };
40 38

  
41 39
  push @errors, $::locale->text('The IBAN is missing.') unless $self->{iban};
40
  push @errors, $self->validate_ibans;
42 41

  
43 42
  return @errors;
44 43
}
SL/DB/Customer.pm
6 6

  
7 7
use SL::DB::MetaSetup::Customer;
8 8
use SL::DB::Manager::Customer;
9
use SL::DB::Helper::IBANValidation;
9 10
use SL::DB::Helper::TransNumberGenerator;
10 11
use SL::DB::Helper::CustomVariables (
11 12
  module      => 'CT',
......
46 47

  
47 48
  my @errors;
48 49
  push @errors, $::locale->text('The customer name is missing.') if !$self->name;
50
  push @errors, $self->validate_ibans;
49 51

  
50 52
  return @errors;
51 53
}
SL/DB/Helper/IBANValidation.pm
1
package SL::DB::Helper::IBANValidation;
2

  
3
use strict;
4

  
5
use Algorithm::CheckDigits ();
6
use Carp;
7
use SL::Locale::String qw(t8);
8

  
9
my $_validater;
10
my %_countries = (
11
  AT => { len => 20, name => t8('Austria') },
12
  BE => { len => 16, name => t8('Belgium') },
13
  CH => { len => 21, name => t8('Switzerland') },
14
  CZ => { len => 24, name => t8('Czech Republic') },
15
  DE => { len => 22, name => t8('Germany') },
16
  DK => { len => 18, name => t8('Denmark') },
17
  FR => { len => 27, name => t8('France') },
18
  IT => { len => 27, name => t8('Italy') },
19
  LU => { len => 20, name => t8('Luxembourg') },
20
  NL => { len => 18, name => t8('Netherlands') },
21
  PL => { len => 28, name => t8('Poland') },
22
);
23

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

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

  
30
  return () unless length($iban);
31

  
32
  $_validater //= Algorithm::CheckDigits::CheckDigits('iban');
33

  
34
  return ($::locale->text("The value '#1' is not a valid IBAN.", $iban)) if !$_validater->is_valid($iban);
35

  
36
  my $country = $_countries{substr($iban, 0, 2)};
37

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

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

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

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

  
49
  no strict 'refs';
50

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

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

  
58
1;
59

  
60
__END__
61

  
62
=pod
63

  
64
=encoding utf8
65

  
66
=head1 NAME
67

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

  
70
=head1 SYNOPSIS
71

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

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

  
78
    my @errors;
79
80
    push @errors, $self->validate_ibans;
81

  
82
    return @errors;
83
  }
84

  
85
This mixin provides a function C<validate_ibans> that returns an list
86
of error messages, one for each attribute that fails the IBAN
87
validation. If all attributes are valid or empty then an empty list
88
is returned.
89

  
90
The names of attributes to check can be given as a import list to the
91
mixin package. If no attributes are given the single attribute C<iban>
92
is used.
93

  
94
=head1 FUNCTIONS
95

  
96
=over 4
97

  
98
=item C<validate_ibans>
99

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

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

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

  
111
=back
112

  
113
=head1 BUGS
114

  
115
Nothing here yet.
116

  
117
=head1 AUTHOR
118

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

  
121
=cut
SL/DB/Vendor.pm
6 6

  
7 7
use SL::DB::MetaSetup::Vendor;
8 8
use SL::DB::Manager::Vendor;
9
use SL::DB::Helper::IBANValidation;
9 10
use SL::DB::Helper::TransNumberGenerator;
10 11
use SL::DB::Helper::CustomVariables (
11 12
  module      => 'CT',
......
46 47

  
47 48
  my @errors;
48 49
  push @errors, $::locale->text('The vendor name is missing.') if !$self->name;
50
  push @errors, $self->validate_ibans;
49 51

  
50 52
  return @errors;
51 53
}
SL/InstallationCheck.pm
17 17
#   dist_name: name of the package in cpan if it differs from name (ex.: LWP != libwww-perl)
18 18
@required_modules = (
19 19
  { name => "parent",                              url => "http://search.cpan.org/~corion/",    debian => 'libparent-perl' },
20
  { name => "Algorithm::CheckDigits",              url => "http://search.cpan.org/dist/Algorithm-CheckDigits/", debian => 'libalgorithm-checkdigits-perl' },
20 21
  { name => "Archive::Zip",    version => '1.16',  url => "http://search.cpan.org/~phred/",     debian => 'libarchive-zip-perl' },
21 22
  { name => "CGI",             version => '3.43',  url => "http://search.cpan.org/~leejo/",     debian => 'libcgi-perl' }, # 3.43 is core 5.10.1
22 23
  { name => "Clone",                               url => "http://search.cpan.org/~rdf/",       debian => 'libclone-perl' },
doc/UPGRADE
9 9

  
10 10
* Neue Perl-Modul-Abhängigkeiten:
11 11

  
12
  * Algorithm::CheckDigits
12 13
  * PBKDF2::Tiny
13 14

  
14 15
  Wie immer bitte vor dem ersten Aufrufen einmal die Pakete überprüfen:
doc/changelog
42 42

  
43 43
Kleinere neue Features und Detailverbesserungen:
44 44

  
45
  - IBANs werden beim Speichern auf Gültigkeit geprüft (betrifft
46
    Kunden-/Lieferantenstammdaten sowie Bankkonten)
47

  
45 48
  - Konkurrierende Schreibprozesse beim Speichern von Belegen verhindern.
46 49

  
47 50
  - SelfTest um einen Test erweitert. Hauptbuch-Nettowert weicht vom Nebenbuch-Netto-Wert ab
locale/de/all
310 310
  'Audit Control'               => 'Bücherkontrolle',
311 311
  'Aug'                         => 'Aug',
312 312
  'August'                      => 'August',
313
  'Austria'                     => 'Österreich',
313 314
  'Authentification database creation' => 'Anlegen der Datenbank zur Benutzerauthentifizierung',
314 315
  'Authentification tables creation' => 'Anlegen der Tabellen zur Benutzerauthentifizierung',
315 316
  'Auto Send?'                  => 'Auto. Versand?',
......
376 377
  'Because the useability gets worse if one partnumber is used for several parts (for example if you are searching a position for an invoice), partnumbers should be unique.' => 'Da die Benutzerfreundlichkeit durch doppelte Artikelnummern erheblich verschlechtert wird (zum Beispiel, wenn man einen Artikel für eine Rechnung sucht), sollten Artikelnummern eindeutig vergeben sein.',
377 378
  'Before saving a sales order, this article will be checked and a warning is generated.' => 'Vor dem Speichern eines Angebots oder Auftrags wird überprüft, ob die hier definierte Artikelnummer vorhanden ist (Versandkosten01, etc.) und eine entsprechende Hinweiswarnung angezeigt',
378 379
  'Belegnummer'                 => 'Buchungsnummer',
380
  'Belgium'                     => 'Belgien',
379 381
  'Beratername'                 => 'Beratername',
380 382
  'Beraternummer'               => 'Beraternummer',
381 383
  'Best Before'                 => 'Mindesthaltbarkeit',
......
758 760
  'Customers'                   => 'Kunden',
759 761
  'Customers and vendors'       => 'Kunden und Lieferanten',
760 762
  'Customized Report'           => 'Vorgewählte Zeiträume',
763
  'Czech Republic'              => 'Tschechien',
761 764
  'DATEV - Export Assistent'    => 'DATEV-Exportassistent',
762 765
  'DATEV Angaben'               => 'DATEV-Angaben',
763 766
  'DATEV Export'                => 'DATEV-Export',
......
874 877
  'Delivery terms'              => 'Lieferbedingungen',
875 878
  'Delivery terms (database ID)' => 'Lieferbedingungen (Datenbank-ID)',
876 879
  'Delivery terms (name)'       => 'Lieferbedingungen (Name)',
880
  'Denmark'                     => 'Dänemark',
877 881
  'Department'                  => 'Abteilung',
878 882
  'Department (database ID)'    => 'Abeilung (Datenbank-ID)',
879 883
  'Department (description)'    => 'Abteilung (Beschreibung)',
......
1259 1263
  'Formula'                     => 'Formel',
1260 1264
  'Found #1 errors.'            => '#1 Fehler gefunden.',
1261 1265
  'Found #1 objects of which #2 can be imported.' => 'Es wurden #1 Objekte gefunden, von denen #2 importiert werden können.',
1266
  'France'                      => 'Frankreich',
1262 1267
  'Free report period'          => 'Freier Zeitraum',
1263 1268
  'Free-form text'              => 'Textzeile',
1264 1269
  'Fristsetzung'                => 'Fristsetzung',
......
1288 1293
  'General ledger corrections'  => 'Korrekturen im Hauptbuch',
1289 1294
  'General settings'            => 'Allgemeine Einstellungen',
1290 1295
  'Generic Tax Report'          => 'USTVA Bericht',
1296
  'Germany'                     => 'Deutschland',
1291 1297
  'Git revision: #1, #2 #3'     => 'Git-Revision: #1, #2 #3',
1292 1298
  'Given Name'                  => 'Vorname',
1293 1299
  'Global Record BCC'           => 'Globale BCC-Adresse',
......
1468 1474
  'It is possible to make a quick DATEV export everytime you post a record to ensure things work nicely with their data requirements. This will result in a slight overhead though you can enable this for each type of record independently.' => 'Es ist möglich, bei jeder Buchung einen schnellen DATEV-Export durchzuführen, um sicherzustellen, dass die Datensätze den DATEV-Anforderungen genügen. Da dies einen kleinen Overhead bedeutet, lässt sich die Einstellung für jeden Buchungstyp getrennt einstellen.',
1469 1475
  'It will not be further modified by any other source, and will be offered in records like this.' => 'Er wird nicht weiter verändert werden und genau so im Beleg vorgeschlagen werden.',
1470 1476
  'It will simply set the taxkey to 0 (meaning "no taxes") which is the correct value for such inventory transactions.' => 'Es wird einfach die Steuerschlüssel auf  0 setzen, was "keine Steuer" bedeutet und für solche Warenbestandsbuchungen der richtige Wert ist.',
1477
  'Italy'                       => 'Italien',
1471 1478
  'Item deleted!'               => 'Artikel gelöscht!',
1472 1479
  'Item mode'                   => 'Artikelmodus',
1473 1480
  'Item multi selection with qty' => 'Artikel-Mehrfachauswahl mit Menge',
......
1583 1590
  'Logout now'                  => 'kivitendo jetzt verlassen',
1584 1591
  'Long Dates'                  => 'Lange Monatsnamen',
1585 1592
  'Long Description'            => 'Langtext',
1593
  'Luxembourg'                  => 'Luxemburg',
1586 1594
  'MAILED'                      => 'Gesendet',
1587 1595
  'MD'                          => 'PT',
1588 1596
  'MIME type'                   => 'MIME-Typ',
......
1672 1680
  'Net value in Order'          => 'Netto Auftrag',
1673 1681
  'Net value transferred in / out' => 'Netto ein- /ausgelagert',
1674 1682
  'Net value without delivery orders' => 'Netto ohne Lieferschein',
1683
  'Netherlands'                 => 'Niederlande',
1675 1684
  'Netto Terms'                 => 'Zahlungsziel netto',
1676 1685
  'New Password'                => 'Neues Passwort',
1677 1686
  'New Purchase Price Rule'     => 'Neue Einkaufspreisregel',
......
1992 2001
  'Please set another taxnumber for the following taxes and run the update again:' => 'Bitte wählen Sie ein anderes Steuerautomatik-Konto für die folgenden Steuern aus uns starten Sie dann das Update erneut.',
1993 2002
  'Please specify a description for the warehouse designated for these goods.' => 'Bitte geben Sie den Namen des Ziellagers f&uuml;r die &uuml;bernommenen Daten ein.',
1994 2003
  'Plural'                      => 'Plural',
2004
  'Poland'                      => 'Polen',
1995 2005
  'Port'                        => 'Port',
1996 2006
  'Portrait'                    => 'Hochformat',
1997 2007
  'Position type in quotation/order' => 'Positionstyp in Angebot/Auftrag',
......
2554 2564
  'Summen- und Saldenliste'     => 'Summen- und Saldenliste',
2555 2565
  'Superuser name'              => 'Datenbankadministrator',
2556 2566
  'Supplies'                    => 'Lieferungen',
2567
  'Switzerland'                 => 'Schweiz',
2557 2568
  'System'                      => 'System',
2558 2569
  'System currently down for maintenance!' => 'kivitendo ist momentan zwecks Wartungsarbeiten nicht zugänglich.',
2559 2570
  'TODO list'                   => 'Aufgabenliste',
......
2637 2648
  'The Buchungsgruppe has been saved.' => 'Die Buchungsgruppe wurde gespeichert.',
2638 2649
  'The Buchungsgruppe needs an inventory account.' => 'Die Buchungsgruppe braucht ein Warenbestandskonto.',
2639 2650
  'The GL transaction #1 has been deleted.' => 'Die Dialogbuchung #1 wurde gelöscht.',
2651
  'The IBAN \'#1\' is not valid as IBANs in #2 must be exactly #3 characters long.' => 'Die IBAN \'#1\' ist ungültig, da IBANs in #2 genau #3 Zeichen lang sein müssen.',
2640 2652
  'The IBAN is missing.'        => 'Die IBAN fehlt.',
2641 2653
  'The LDAP server "#1:#2" is unreachable. Please check config/kivitendo.conf.' => 'Der LDAP-Server "#1:#2" ist nicht erreichbar. Bitte &uuml;berpr&uuml;fen Sie die Angaben in config/kivitendo.conf.',
2642 2654
  'The MT940 import needs an import profile called MT940' => 'Der MT940 Import benötigt ein Importprofil mit dem Namen "MT940"',
......
2906 2918
  'The user has been created.'  => 'Der Benutzer wurde angelegt.',
2907 2919
  'The user has been deleted.'  => 'Der Benutzer wurde gelöscht.',
2908 2920
  'The user has been saved.'    => 'Der Benutzer wurde gespeichert.',
2921
  'The value \'#1\' is not a valid IBAN.' => 'Der Wert \'#1\' ist keine gültige IBAN.',
2909 2922
  'The variable name must only consist of letters, numbers and underscores. It must begin with a letter. Example: send_christmas_present' => 'Der Variablenname darf nur aus Zeichen (keine Umlaute), Ziffern und Unterstrichen bestehen. Er muss mit einem Buchstaben beginnen. Beispiel: weihnachtsgruss_verschicken',
2910 2923
  'The vendor name is missing.' => 'Der Liefeantenname fehlt.',
2911 2924
  'The version number is missing.' => 'Die Versionsnummer fehlt.',

Auch abrufbar als: Unified diff