Revision 07a768c3
Von Moritz Bunkus vor fast 9 Jahren hinzugefügt
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ür die ü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 überprü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
IBAN-Validierung bei Kunden-/Lieferantenstammdaten sowie bei Bankkonten