konto_check_ruby 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/CHANGELOG.md +26 -0
- data/COPYRIGHT +22 -0
- data/LICENSE +504 -0
- data/README.md +295 -0
- data/bin/konto_check_ruby +202 -0
- data/data/README.md +17 -0
- data/data/blz.lut2f +0 -0
- data/data/iban_regeln.txt +1260 -0
- data/lib/konto_check_ruby/bank_data.rb +421 -0
- data/lib/konto_check_ruby/blz_file.rb +705 -0
- data/lib/konto_check_ruby/check_methods/part1.rb +1634 -0
- data/lib/konto_check_ruby/check_methods/part2.rb +1604 -0
- data/lib/konto_check_ruby/check_methods/part3.rb +1905 -0
- data/lib/konto_check_ruby/check_methods/part4.rb +1738 -0
- data/lib/konto_check_ruby/check_methods/part5.rb +1407 -0
- data/lib/konto_check_ruby/check_methods.rb +147 -0
- data/lib/konto_check_ruby/collation.rb +52 -0
- data/lib/konto_check_ruby/engine.rb +1006 -0
- data/lib/konto_check_ruby/iban_rules.rb +1060 -0
- data/lib/konto_check_ruby/konto_check.rb +1578 -0
- data/lib/konto_check_ruby/lut_file.rb +457 -0
- data/lib/konto_check_ruby/raw.rb +614 -0
- data/lib/konto_check_ruby/retvals.rb +826 -0
- data/lib/konto_check_ruby/search.rb +440 -0
- data/lib/konto_check_ruby/update.rb +176 -0
- data/lib/konto_check_ruby/version.rb +18 -0
- data/lib/konto_check_ruby.rb +42 -0
- metadata +112 -0
|
@@ -0,0 +1,1407 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
# This file is part of konto_check_ruby, a Ruby port of the C library
|
|
4
|
+
# konto_check, Copyright (C) 2002-2023 Michael Plugge <konto_check@yahoo.com>.
|
|
5
|
+
# Ruby port Copyright (C) 2026 tickettoaster GmbH <https://tickettoaster.de>.
|
|
6
|
+
#
|
|
7
|
+
# konto_check_ruby is free software; you can redistribute it and/or modify it
|
|
8
|
+
# under the terms of the GNU Lesser General Public License as published by
|
|
9
|
+
# the Free Software Foundation; either version 2.1 of the License, or (at
|
|
10
|
+
# your option) any later version. It is distributed WITHOUT ANY WARRANTY; see
|
|
11
|
+
# the file LICENSE for details.
|
|
12
|
+
|
|
13
|
+
module KontoCheckRuby
|
|
14
|
+
module CheckMethods
|
|
15
|
+
extend self
|
|
16
|
+
|
|
17
|
+
# Methode C3
|
|
18
|
+
# Kontonummern mit 1. Stelle != 9: Methode 00 (Modulus 10, Gewichtung
|
|
19
|
+
# 2,1,2,1,2,1,2,1,2); Kontonummern mit 1. Stelle == 9: Modulus 11,
|
|
20
|
+
# Gewichtung 2,3,4,5,6 (Stellen 5 bis 9), Prüfziffer 10 ist ungültig.
|
|
21
|
+
def m123(kto, blz, um, rv)
|
|
22
|
+
if kto[0] != 9
|
|
23
|
+
m1123(kto, blz, um, rv)
|
|
24
|
+
else
|
|
25
|
+
m2123(kto, blz, um, rv)
|
|
26
|
+
end
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Methode C3a (Variante 1: Methode 00)
|
|
30
|
+
def m1123(kto, blz, um, rv)
|
|
31
|
+
if rv
|
|
32
|
+
rv.methode = "C3a"
|
|
33
|
+
rv.pz_methode = 1123
|
|
34
|
+
end
|
|
35
|
+
pz = kto[1] + kto[3] + kto[5] + kto[7]
|
|
36
|
+
pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
|
|
37
|
+
pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
|
|
38
|
+
pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
|
|
39
|
+
pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
|
|
40
|
+
pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
|
|
41
|
+
pz %= 10
|
|
42
|
+
pz = 10 - pz if pz != 0
|
|
43
|
+
# CHECK_PZ10
|
|
44
|
+
if rv
|
|
45
|
+
rv.pz_pos = 10
|
|
46
|
+
rv.pz = pz
|
|
47
|
+
end
|
|
48
|
+
kto[9] == pz ? OK : FALSE
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
# Methode C3b (Variante 2: Modulus 11, Gewichtung 6,5,4,3,2)
|
|
52
|
+
def m2123(kto, blz, um, rv)
|
|
53
|
+
if rv
|
|
54
|
+
rv.methode = "C3b"
|
|
55
|
+
rv.pz_methode = 2123
|
|
56
|
+
end
|
|
57
|
+
pz = kto[4] * 6 +
|
|
58
|
+
kto[5] * 5 +
|
|
59
|
+
kto[6] * 4 +
|
|
60
|
+
kto[7] * 3 +
|
|
61
|
+
kto[8] * 2
|
|
62
|
+
pz %= 11
|
|
63
|
+
pz = 11 - pz if pz != 0
|
|
64
|
+
# INVALID_PZ10
|
|
65
|
+
if rv
|
|
66
|
+
rv.pz_pos = 10
|
|
67
|
+
rv.pz = pz
|
|
68
|
+
end
|
|
69
|
+
return INVALID_KTO if pz == 10
|
|
70
|
+
# CHECK_PZ10
|
|
71
|
+
if rv
|
|
72
|
+
rv.pz_pos = 10
|
|
73
|
+
rv.pz = pz
|
|
74
|
+
end
|
|
75
|
+
kto[9] == pz ? OK : FALSE
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# Methode C4
|
|
79
|
+
# 1. Stelle != 9: Modulus 11, Gewichtung 2,3,4,5 (Rest 0 und 1 -> Pz 0);
|
|
80
|
+
# 1. Stelle == 9: Modulus 11, Gewichtung 2,3,4,5,6, Pz 10 ungültig.
|
|
81
|
+
def m124(kto, blz, um, rv)
|
|
82
|
+
if kto[0] != 9
|
|
83
|
+
m1124(kto, blz, um, rv)
|
|
84
|
+
else
|
|
85
|
+
m2124(kto, blz, um, rv)
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
# Methode C4a
|
|
90
|
+
def m1124(kto, blz, um, rv)
|
|
91
|
+
if rv
|
|
92
|
+
rv.methode = "C4a"
|
|
93
|
+
rv.pz_methode = 1124
|
|
94
|
+
end
|
|
95
|
+
pz = kto[5] * 5 +
|
|
96
|
+
kto[6] * 4 +
|
|
97
|
+
kto[7] * 3 +
|
|
98
|
+
kto[8] * 2
|
|
99
|
+
pz %= 11
|
|
100
|
+
if pz <= 1
|
|
101
|
+
pz = 0
|
|
102
|
+
else
|
|
103
|
+
pz = 11 - pz
|
|
104
|
+
end
|
|
105
|
+
# CHECK_PZ10
|
|
106
|
+
if rv
|
|
107
|
+
rv.pz_pos = 10
|
|
108
|
+
rv.pz = pz
|
|
109
|
+
end
|
|
110
|
+
kto[9] == pz ? OK : FALSE
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
# Methode C4b
|
|
114
|
+
def m2124(kto, blz, um, rv)
|
|
115
|
+
if rv
|
|
116
|
+
rv.methode = "C4b"
|
|
117
|
+
rv.pz_methode = 2124
|
|
118
|
+
end
|
|
119
|
+
pz = kto[4] * 6 +
|
|
120
|
+
kto[5] * 5 +
|
|
121
|
+
kto[6] * 4 +
|
|
122
|
+
kto[7] * 3 +
|
|
123
|
+
kto[8] * 2
|
|
124
|
+
pz %= 11
|
|
125
|
+
pz = 11 - pz if pz != 0
|
|
126
|
+
# INVALID_PZ10
|
|
127
|
+
if rv
|
|
128
|
+
rv.pz_pos = 10
|
|
129
|
+
rv.pz = pz
|
|
130
|
+
end
|
|
131
|
+
return INVALID_KTO if pz == 10
|
|
132
|
+
# CHECK_PZ10
|
|
133
|
+
if rv
|
|
134
|
+
rv.pz_pos = 10
|
|
135
|
+
rv.pz = pz
|
|
136
|
+
end
|
|
137
|
+
kto[9] == pz ? OK : FALSE
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# Methode C5
|
|
141
|
+
# Vier Kontenkreise mit unterschiedlichen Verfahren (Methode 00 auf
|
|
142
|
+
# verschiedenen Stellen, Methode 06/M10H-Variante, keine Prüfung).
|
|
143
|
+
def m125(kto, blz, um, rv)
|
|
144
|
+
m1125(kto, blz, um, rv)
|
|
145
|
+
end
|
|
146
|
+
|
|
147
|
+
# Methode C5a (Varianten 1a und 1b: Methode 00 auf 6- bzw. 9-stelligen
|
|
148
|
+
# Kontonummern; Prüfziffer an Stelle 10 bzw. 7)
|
|
149
|
+
def m1125(kto, blz, um, rv)
|
|
150
|
+
if rv
|
|
151
|
+
rv.methode = "C5a"
|
|
152
|
+
rv.pz_methode = 1125
|
|
153
|
+
end
|
|
154
|
+
|
|
155
|
+
# Variante 1a: 6-stellige Kontonummern, 5. Stelle = 1-8, Pz an Stelle 10
|
|
156
|
+
if kto[0] == 0 && kto[1] == 0 && kto[2] == 0 && kto[3] == 0 && kto[4] >= 1 && kto[4] <= 8
|
|
157
|
+
pz = kto[5] + kto[7]
|
|
158
|
+
pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
|
|
159
|
+
pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
|
|
160
|
+
pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
|
|
161
|
+
pz %= 10
|
|
162
|
+
pz = 10 - pz if pz != 0
|
|
163
|
+
# CHECK_PZ10
|
|
164
|
+
if rv
|
|
165
|
+
rv.pz_pos = 10
|
|
166
|
+
rv.pz = pz
|
|
167
|
+
end
|
|
168
|
+
return kto[9] == pz ? OK : FALSE
|
|
169
|
+
|
|
170
|
+
# Variante 1b: 9-stellige Kontonummern, 2. Stelle = 1-8, Pz an Stelle 7
|
|
171
|
+
elsif kto[0] == 0 && kto[1] >= 1 && kto[1] <= 8
|
|
172
|
+
pz = kto[2] + kto[4]
|
|
173
|
+
pz += kto[1] < 5 ? kto[1] * 2 : kto[1] * 2 - 9
|
|
174
|
+
pz += kto[3] < 5 ? kto[3] * 2 : kto[3] * 2 - 9
|
|
175
|
+
pz += kto[5] < 5 ? kto[5] * 2 : kto[5] * 2 - 9
|
|
176
|
+
pz %= 10
|
|
177
|
+
pz = 10 - pz if pz != 0
|
|
178
|
+
# CHECK_PZ7
|
|
179
|
+
if rv
|
|
180
|
+
rv.pz_pos = 7
|
|
181
|
+
rv.pz = pz
|
|
182
|
+
end
|
|
183
|
+
return kto[6] == pz ? OK : FALSE
|
|
184
|
+
|
|
185
|
+
# Variante 2: 10-stellige Kontonummern, 1. Stelle = 1, 4, 5, 6 oder 9
|
|
186
|
+
elsif kto[0] == 1 || (kto[0] >= 4 && kto[0] <= 6) || kto[0] == 9
|
|
187
|
+
return m2125(kto, blz, um, rv)
|
|
188
|
+
|
|
189
|
+
# Variante 3: 10-stellige Kontonummern, 1. Stelle = 3
|
|
190
|
+
elsif kto[0] == 3
|
|
191
|
+
return m3125(kto, blz, um, rv)
|
|
192
|
+
|
|
193
|
+
# Variante 4: 8-stellige Kontonummern mit 3. Stelle = 3, 4 oder 5 bzw.
|
|
194
|
+
# 10-stellige Kontonummern mit 1. und 2. Stelle = 70 oder 85
|
|
195
|
+
elsif (kto[0] == 0 && kto[1] == 0 && kto[2] >= 3 && kto[2] <= 5) ||
|
|
196
|
+
(kto[0] == 7 && kto[1] == 0) ||
|
|
197
|
+
(kto[0] == 8 && kto[1] == 5)
|
|
198
|
+
return m4125(kto, blz, um, rv)
|
|
199
|
+
else
|
|
200
|
+
# Kontonummer entspricht keinem vorgegebenen Kontenkreis
|
|
201
|
+
return INVALID_KTO
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
|
|
205
|
+
# Methode C5b (Variante 2: Modulus 10, iterierte Transformation)
|
|
206
|
+
def m2125(kto, blz, um, rv)
|
|
207
|
+
if rv
|
|
208
|
+
rv.methode = "C5b"
|
|
209
|
+
rv.pz_methode = 2125
|
|
210
|
+
end
|
|
211
|
+
pz = M10H_DIGITS[0][kto[0]] +
|
|
212
|
+
M10H_DIGITS[3][kto[1]] +
|
|
213
|
+
M10H_DIGITS[2][kto[2]] +
|
|
214
|
+
M10H_DIGITS[1][kto[3]] +
|
|
215
|
+
M10H_DIGITS[0][kto[4]] +
|
|
216
|
+
M10H_DIGITS[3][kto[5]] +
|
|
217
|
+
M10H_DIGITS[2][kto[6]] +
|
|
218
|
+
M10H_DIGITS[1][kto[7]] +
|
|
219
|
+
M10H_DIGITS[0][kto[8]]
|
|
220
|
+
pz %= 10
|
|
221
|
+
pz = 10 - pz if pz != 0
|
|
222
|
+
# CHECK_PZ10
|
|
223
|
+
if rv
|
|
224
|
+
rv.pz_pos = 10
|
|
225
|
+
rv.pz = pz
|
|
226
|
+
end
|
|
227
|
+
kto[9] == pz ? OK : FALSE
|
|
228
|
+
end
|
|
229
|
+
|
|
230
|
+
# Methode C5c (Variante 3: Methode 00)
|
|
231
|
+
def m3125(kto, blz, um, rv)
|
|
232
|
+
if rv
|
|
233
|
+
rv.methode = "C5c"
|
|
234
|
+
rv.pz_methode = 3125
|
|
235
|
+
end
|
|
236
|
+
pz = kto[1] + kto[3] + kto[5] + kto[7]
|
|
237
|
+
pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
|
|
238
|
+
pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
|
|
239
|
+
pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
|
|
240
|
+
pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
|
|
241
|
+
pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
|
|
242
|
+
pz %= 10
|
|
243
|
+
pz = 10 - pz if pz != 0
|
|
244
|
+
# CHECK_PZ10
|
|
245
|
+
if rv
|
|
246
|
+
rv.pz_pos = 10
|
|
247
|
+
rv.pz = pz
|
|
248
|
+
end
|
|
249
|
+
kto[9] == pz ? OK : FALSE
|
|
250
|
+
end
|
|
251
|
+
|
|
252
|
+
# Methode C5d (Variante 4: keine Prüfzifferberechnung)
|
|
253
|
+
def m4125(kto, blz, um, rv)
|
|
254
|
+
if rv
|
|
255
|
+
rv.methode = "C5d"
|
|
256
|
+
rv.pz_methode = 4125
|
|
257
|
+
end
|
|
258
|
+
OK_NO_CHK
|
|
259
|
+
end
|
|
260
|
+
|
|
261
|
+
# Methode C6
|
|
262
|
+
# Methode 00 über die Stellen 2 bis 9, wobei zur Summe abhängig von der
|
|
263
|
+
# 1. Stelle der Kontonummer eine Konstante addiert wird.
|
|
264
|
+
def m126(kto, blz, um, rv)
|
|
265
|
+
if rv
|
|
266
|
+
rv.methode = "C6"
|
|
267
|
+
rv.pz_methode = 126
|
|
268
|
+
end
|
|
269
|
+
case kto[0]
|
|
270
|
+
when 0 then pz = 30
|
|
271
|
+
when 1 then pz = 33
|
|
272
|
+
when 2 then pz = 36
|
|
273
|
+
when 3 then pz = 38
|
|
274
|
+
when 4 then pz = 45
|
|
275
|
+
when 5 then pz = 41
|
|
276
|
+
when 6 then pz = 43
|
|
277
|
+
when 7 then pz = 31
|
|
278
|
+
when 8 then pz = 40
|
|
279
|
+
when 9 then pz = 40
|
|
280
|
+
else return INVALID_KTO
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
pz += kto[1] + kto[3] + kto[5] + kto[7]
|
|
284
|
+
pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
|
|
285
|
+
pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
|
|
286
|
+
pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
|
|
287
|
+
pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
|
|
288
|
+
pz %= 10
|
|
289
|
+
pz = 10 - pz if pz != 0
|
|
290
|
+
# CHECK_PZ10
|
|
291
|
+
if rv
|
|
292
|
+
rv.pz_pos = 10
|
|
293
|
+
rv.pz = pz
|
|
294
|
+
end
|
|
295
|
+
kto[9] == pz ? OK : FALSE
|
|
296
|
+
end
|
|
297
|
+
|
|
298
|
+
# Methode C7
|
|
299
|
+
# Variante 1 (evl. weggelassenes Unterkonto) und Variante 1 entsprechen
|
|
300
|
+
# der Methode 63, Variante 2 der Methode 06 (Modulus 11).
|
|
301
|
+
def m127(kto, blz, um, rv)
|
|
302
|
+
if kto[0] == 0
|
|
303
|
+
# bei Methode 63 sind 10-stellige Kontonummern falsch
|
|
304
|
+
if kto[1] == 0 && kto[2] == 0
|
|
305
|
+
# evl. Unterkonto weggelassen
|
|
306
|
+
m3127(kto, blz, um, rv)
|
|
307
|
+
else
|
|
308
|
+
m1127(kto, blz, um, rv)
|
|
309
|
+
end
|
|
310
|
+
else
|
|
311
|
+
m2127(kto, blz, um, rv)
|
|
312
|
+
end
|
|
313
|
+
end
|
|
314
|
+
|
|
315
|
+
# Methode C7c (Methode 63 mit weggelassenem Unterkonto)
|
|
316
|
+
def m3127(kto, blz, um, rv)
|
|
317
|
+
if rv
|
|
318
|
+
rv.methode = "C7c"
|
|
319
|
+
rv.pz_methode = 3127
|
|
320
|
+
end
|
|
321
|
+
return INVALID_KTO if kto[0] != 0
|
|
322
|
+
pz = kto[3] + kto[5] + kto[7]
|
|
323
|
+
pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
|
|
324
|
+
pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
|
|
325
|
+
pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
|
|
326
|
+
pz %= 10
|
|
327
|
+
pz = 10 - pz if pz != 0
|
|
328
|
+
# CHECK_PZX10
|
|
329
|
+
if rv
|
|
330
|
+
rv.pz_pos = 10
|
|
331
|
+
rv.pz = pz
|
|
332
|
+
end
|
|
333
|
+
return OK if kto[9] == pz
|
|
334
|
+
return FALSE if um != 0
|
|
335
|
+
# hier darf kein else-Zweig hin, damit nach 63c auch 63a geprüft wird
|
|
336
|
+
m1127(kto, blz, um, rv)
|
|
337
|
+
end
|
|
338
|
+
|
|
339
|
+
# Methode C7a (Methode 63)
|
|
340
|
+
def m1127(kto, blz, um, rv)
|
|
341
|
+
if rv
|
|
342
|
+
rv.methode = "C7a"
|
|
343
|
+
rv.pz_methode = 1127
|
|
344
|
+
end
|
|
345
|
+
return INVALID_KTO if kto[0] != 0
|
|
346
|
+
pz = kto[1] + kto[3] + kto[5]
|
|
347
|
+
pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
|
|
348
|
+
pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
|
|
349
|
+
pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
|
|
350
|
+
pz %= 10
|
|
351
|
+
pz = 10 - pz if pz != 0
|
|
352
|
+
# CHECK_PZX8
|
|
353
|
+
if rv
|
|
354
|
+
rv.pz_pos = 8
|
|
355
|
+
rv.pz = pz
|
|
356
|
+
end
|
|
357
|
+
return OK if kto[7] == pz
|
|
358
|
+
return FALSE if um != 0
|
|
359
|
+
m2127(kto, blz, um, rv)
|
|
360
|
+
end
|
|
361
|
+
|
|
362
|
+
# Methode C7b (Variante 2: Modulus 11, Gewichtung 2,3,4,5,6,7,2,3,4)
|
|
363
|
+
def m2127(kto, blz, um, rv)
|
|
364
|
+
if rv
|
|
365
|
+
rv.methode = "C7b"
|
|
366
|
+
rv.pz_methode = 2127
|
|
367
|
+
end
|
|
368
|
+
pz = kto[0] * 4 +
|
|
369
|
+
kto[1] * 3 +
|
|
370
|
+
kto[2] * 2 +
|
|
371
|
+
kto[3] * 7 +
|
|
372
|
+
kto[4] * 6 +
|
|
373
|
+
kto[5] * 5 +
|
|
374
|
+
kto[6] * 4 +
|
|
375
|
+
kto[7] * 3 +
|
|
376
|
+
kto[8] * 2
|
|
377
|
+
pz %= 11
|
|
378
|
+
if pz <= 1
|
|
379
|
+
pz = 0
|
|
380
|
+
else
|
|
381
|
+
pz = 11 - pz
|
|
382
|
+
end
|
|
383
|
+
# CHECK_PZ10
|
|
384
|
+
if rv
|
|
385
|
+
rv.pz_pos = 10
|
|
386
|
+
rv.pz = pz
|
|
387
|
+
end
|
|
388
|
+
kto[9] == pz ? OK : FALSE
|
|
389
|
+
end
|
|
390
|
+
|
|
391
|
+
# Methode C8
|
|
392
|
+
# Variante 1: Methode 00, Variante 2: Modulus 11 mit Gewichtung
|
|
393
|
+
# 2,3,4,5,6,7,2,3,4, Variante 3: Methode 07 (Pz 10 ungültig).
|
|
394
|
+
def m128(kto, blz, um, rv)
|
|
395
|
+
m1128(kto, blz, um, rv)
|
|
396
|
+
end
|
|
397
|
+
|
|
398
|
+
# Methode C8a (Variante 1: Methode 00)
|
|
399
|
+
def m1128(kto, blz, um, rv)
|
|
400
|
+
if rv
|
|
401
|
+
rv.methode = "C8a"
|
|
402
|
+
rv.pz_methode = 1128
|
|
403
|
+
end
|
|
404
|
+
pz = kto[1] + kto[3] + kto[5] + kto[7]
|
|
405
|
+
pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
|
|
406
|
+
pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
|
|
407
|
+
pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
|
|
408
|
+
pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
|
|
409
|
+
pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
|
|
410
|
+
pz %= 10
|
|
411
|
+
pz = 10 - pz if pz != 0
|
|
412
|
+
# CHECK_PZX10
|
|
413
|
+
if rv
|
|
414
|
+
rv.pz_pos = 10
|
|
415
|
+
rv.pz = pz
|
|
416
|
+
end
|
|
417
|
+
return OK if kto[9] == pz
|
|
418
|
+
return FALSE if um != 0
|
|
419
|
+
m2128(kto, blz, um, rv)
|
|
420
|
+
end
|
|
421
|
+
|
|
422
|
+
# Methode C8b (Variante 2)
|
|
423
|
+
def m2128(kto, blz, um, rv)
|
|
424
|
+
if rv
|
|
425
|
+
rv.methode = "C8b"
|
|
426
|
+
rv.pz_methode = 2128
|
|
427
|
+
end
|
|
428
|
+
pz = kto[0] * 4 +
|
|
429
|
+
kto[1] * 3 +
|
|
430
|
+
kto[2] * 2 +
|
|
431
|
+
kto[3] * 7 +
|
|
432
|
+
kto[4] * 6 +
|
|
433
|
+
kto[5] * 5 +
|
|
434
|
+
kto[6] * 4 +
|
|
435
|
+
kto[7] * 3 +
|
|
436
|
+
kto[8] * 2
|
|
437
|
+
pz %= 11
|
|
438
|
+
pz = 11 - pz if pz != 0
|
|
439
|
+
# CHECK_PZX10
|
|
440
|
+
if rv
|
|
441
|
+
rv.pz_pos = 10
|
|
442
|
+
rv.pz = pz
|
|
443
|
+
end
|
|
444
|
+
return OK if kto[9] == pz
|
|
445
|
+
return FALSE if um != 0
|
|
446
|
+
m3128(kto, blz, um, rv)
|
|
447
|
+
end
|
|
448
|
+
|
|
449
|
+
# Methode C8c (Variante 3: Methode 07)
|
|
450
|
+
def m3128(kto, blz, um, rv)
|
|
451
|
+
if rv
|
|
452
|
+
rv.methode = "C8c"
|
|
453
|
+
rv.pz_methode = 3128
|
|
454
|
+
end
|
|
455
|
+
pz = kto[0] * 10 +
|
|
456
|
+
kto[1] * 9 +
|
|
457
|
+
kto[2] * 8 +
|
|
458
|
+
kto[3] * 7 +
|
|
459
|
+
kto[4] * 6 +
|
|
460
|
+
kto[5] * 5 +
|
|
461
|
+
kto[6] * 4 +
|
|
462
|
+
kto[7] * 3 +
|
|
463
|
+
kto[8] * 2
|
|
464
|
+
pz %= 11
|
|
465
|
+
pz = 11 - pz if pz != 0
|
|
466
|
+
# INVALID_PZ10
|
|
467
|
+
if rv
|
|
468
|
+
rv.pz_pos = 10
|
|
469
|
+
rv.pz = pz
|
|
470
|
+
end
|
|
471
|
+
return INVALID_KTO if pz == 10
|
|
472
|
+
# CHECK_PZ10
|
|
473
|
+
if rv
|
|
474
|
+
rv.pz_pos = 10
|
|
475
|
+
rv.pz = pz
|
|
476
|
+
end
|
|
477
|
+
kto[9] == pz ? OK : FALSE
|
|
478
|
+
end
|
|
479
|
+
|
|
480
|
+
# Methode C9
|
|
481
|
+
# Variante 1: Methode 00, Variante 2: Methode 07 (Pz 10 ungültig).
|
|
482
|
+
def m129(kto, blz, um, rv)
|
|
483
|
+
m1129(kto, blz, um, rv)
|
|
484
|
+
end
|
|
485
|
+
|
|
486
|
+
# Methode C9a (Variante 1: Methode 00)
|
|
487
|
+
def m1129(kto, blz, um, rv)
|
|
488
|
+
if rv
|
|
489
|
+
rv.methode = "C9a"
|
|
490
|
+
rv.pz_methode = 1129
|
|
491
|
+
end
|
|
492
|
+
pz = kto[1] + kto[3] + kto[5] + kto[7]
|
|
493
|
+
pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
|
|
494
|
+
pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
|
|
495
|
+
pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
|
|
496
|
+
pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
|
|
497
|
+
pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
|
|
498
|
+
pz %= 10
|
|
499
|
+
pz = 10 - pz if pz != 0
|
|
500
|
+
# CHECK_PZX10
|
|
501
|
+
if rv
|
|
502
|
+
rv.pz_pos = 10
|
|
503
|
+
rv.pz = pz
|
|
504
|
+
end
|
|
505
|
+
return OK if kto[9] == pz
|
|
506
|
+
return FALSE if um != 0
|
|
507
|
+
m2129(kto, blz, um, rv)
|
|
508
|
+
end
|
|
509
|
+
|
|
510
|
+
# Methode C9b (Variante 2: Methode 07)
|
|
511
|
+
def m2129(kto, blz, um, rv)
|
|
512
|
+
if rv
|
|
513
|
+
rv.methode = "C9b"
|
|
514
|
+
rv.pz_methode = 2129
|
|
515
|
+
end
|
|
516
|
+
pz = kto[0] * 10 +
|
|
517
|
+
kto[1] * 9 +
|
|
518
|
+
kto[2] * 8 +
|
|
519
|
+
kto[3] * 7 +
|
|
520
|
+
kto[4] * 6 +
|
|
521
|
+
kto[5] * 5 +
|
|
522
|
+
kto[6] * 4 +
|
|
523
|
+
kto[7] * 3 +
|
|
524
|
+
kto[8] * 2
|
|
525
|
+
pz %= 11
|
|
526
|
+
pz = 11 - pz if pz != 0
|
|
527
|
+
# INVALID_PZ10
|
|
528
|
+
if rv
|
|
529
|
+
rv.pz_pos = 10
|
|
530
|
+
rv.pz = pz
|
|
531
|
+
end
|
|
532
|
+
return INVALID_KTO if pz == 10
|
|
533
|
+
# CHECK_PZ10
|
|
534
|
+
if rv
|
|
535
|
+
rv.pz_pos = 10
|
|
536
|
+
rv.pz = pz
|
|
537
|
+
end
|
|
538
|
+
kto[9] == pz ? OK : FALSE
|
|
539
|
+
end
|
|
540
|
+
|
|
541
|
+
# Methode D0
|
|
542
|
+
# Variante 2: Kontonummern, die mit 57 beginnen, werden nicht geprüft;
|
|
543
|
+
# Variante 1: Modulus 11, Gewichtung 2,3,4,5,6,7,8,9,3.
|
|
544
|
+
def m130(kto, blz, um, rv)
|
|
545
|
+
m2130(kto, blz, um, rv)
|
|
546
|
+
end
|
|
547
|
+
|
|
548
|
+
# Methode D0b (Variante 2: keine Prüfung für Kontonummern mit 57)
|
|
549
|
+
def m2130(kto, blz, um, rv)
|
|
550
|
+
if rv
|
|
551
|
+
rv.methode = "D0b"
|
|
552
|
+
rv.pz_methode = 2130
|
|
553
|
+
end
|
|
554
|
+
if kto[0] == 5 && kto[1] == 7
|
|
555
|
+
OK_NO_CHK
|
|
556
|
+
else
|
|
557
|
+
m1130(kto, blz, um, rv)
|
|
558
|
+
end
|
|
559
|
+
end
|
|
560
|
+
|
|
561
|
+
# Methode D0a (Variante 1)
|
|
562
|
+
def m1130(kto, blz, um, rv)
|
|
563
|
+
if rv
|
|
564
|
+
rv.methode = "D0a"
|
|
565
|
+
rv.pz_methode = 1130
|
|
566
|
+
end
|
|
567
|
+
pz = kto[0] * 3 +
|
|
568
|
+
kto[1] * 9 +
|
|
569
|
+
kto[2] * 8 +
|
|
570
|
+
kto[3] * 7 +
|
|
571
|
+
kto[4] * 6 +
|
|
572
|
+
kto[5] * 5 +
|
|
573
|
+
kto[6] * 4 +
|
|
574
|
+
kto[7] * 3 +
|
|
575
|
+
kto[8] * 2
|
|
576
|
+
pz %= 11
|
|
577
|
+
if pz <= 1
|
|
578
|
+
pz = 0
|
|
579
|
+
else
|
|
580
|
+
pz = 11 - pz
|
|
581
|
+
end
|
|
582
|
+
# CHECK_PZ10
|
|
583
|
+
if rv
|
|
584
|
+
rv.pz_pos = 10
|
|
585
|
+
rv.pz = pz
|
|
586
|
+
end
|
|
587
|
+
kto[9] == pz ? OK : FALSE
|
|
588
|
+
end
|
|
589
|
+
|
|
590
|
+
# Methode D1
|
|
591
|
+
# Methode 00 mit zusätzlicher Konstante 31; Kontonummern, die mit 8
|
|
592
|
+
# beginnen, sind ungültig.
|
|
593
|
+
def m131(kto, blz, um, rv)
|
|
594
|
+
if rv
|
|
595
|
+
rv.methode = "D1"
|
|
596
|
+
rv.pz_methode = 131
|
|
597
|
+
end
|
|
598
|
+
return INVALID_KTO if kto[0] == 8
|
|
599
|
+
pz = 31
|
|
600
|
+
|
|
601
|
+
pz += kto[1] + kto[3] + kto[5] + kto[7]
|
|
602
|
+
pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
|
|
603
|
+
pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
|
|
604
|
+
pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
|
|
605
|
+
pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
|
|
606
|
+
pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
|
|
607
|
+
pz %= 10
|
|
608
|
+
pz = 10 - pz if pz != 0
|
|
609
|
+
# CHECK_PZ10
|
|
610
|
+
if rv
|
|
611
|
+
rv.pz_pos = 10
|
|
612
|
+
rv.pz = pz
|
|
613
|
+
end
|
|
614
|
+
kto[9] == pz ? OK : FALSE
|
|
615
|
+
end
|
|
616
|
+
|
|
617
|
+
# Methode D2
|
|
618
|
+
# Variante 1: Methode 95 (mit Ausnahmen), Variante 2: Methode 00,
|
|
619
|
+
# Variante 3: Methode 68 (mit diversen Sonderfällen).
|
|
620
|
+
def m132(kto, blz, um, rv)
|
|
621
|
+
if rv
|
|
622
|
+
rv.methode = "D2"
|
|
623
|
+
rv.pz_methode = 132
|
|
624
|
+
end
|
|
625
|
+
m1132(kto, blz, um, rv)
|
|
626
|
+
end
|
|
627
|
+
|
|
628
|
+
# Methode D2a (Variante 1: Methode 95)
|
|
629
|
+
def m1132(kto, blz, um, rv)
|
|
630
|
+
if rv
|
|
631
|
+
rv.methode = "D2a"
|
|
632
|
+
rv.pz_methode = 1132
|
|
633
|
+
end
|
|
634
|
+
s = kto.join
|
|
635
|
+
# Ausnahmen: keine Prüfzifferberechnung
|
|
636
|
+
if (s >= "0000000001" && s <= "0001999999") ||
|
|
637
|
+
(s >= "0009000000" && s <= "0025999999") ||
|
|
638
|
+
(s >= "0396000000" && s <= "0499999999") ||
|
|
639
|
+
(s >= "0700000000" && s <= "0799999999")
|
|
640
|
+
return OK_NO_CHK
|
|
641
|
+
end
|
|
642
|
+
pz = kto[0] * 4 +
|
|
643
|
+
kto[1] * 3 +
|
|
644
|
+
kto[2] * 2 +
|
|
645
|
+
kto[3] * 7 +
|
|
646
|
+
kto[4] * 6 +
|
|
647
|
+
kto[5] * 5 +
|
|
648
|
+
kto[6] * 4 +
|
|
649
|
+
kto[7] * 3 +
|
|
650
|
+
kto[8] * 2
|
|
651
|
+
pz %= 11
|
|
652
|
+
if pz <= 1
|
|
653
|
+
pz = 0
|
|
654
|
+
else
|
|
655
|
+
pz = 11 - pz
|
|
656
|
+
end
|
|
657
|
+
# CHECK_PZX10
|
|
658
|
+
if rv
|
|
659
|
+
rv.pz_pos = 10
|
|
660
|
+
rv.pz = pz
|
|
661
|
+
end
|
|
662
|
+
return OK if kto[9] == pz
|
|
663
|
+
return FALSE if um != 0
|
|
664
|
+
m2132(kto, blz, um, rv)
|
|
665
|
+
end
|
|
666
|
+
|
|
667
|
+
# Methode D2b (Variante 2: Methode 00)
|
|
668
|
+
def m2132(kto, blz, um, rv)
|
|
669
|
+
if rv
|
|
670
|
+
rv.methode = "D2b"
|
|
671
|
+
rv.pz_methode = 2132
|
|
672
|
+
end
|
|
673
|
+
pz = kto[1] + kto[3] + kto[5] + kto[7]
|
|
674
|
+
pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
|
|
675
|
+
pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
|
|
676
|
+
pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
|
|
677
|
+
pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
|
|
678
|
+
pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
|
|
679
|
+
pz %= 10
|
|
680
|
+
pz = 10 - pz if pz != 0
|
|
681
|
+
# CHECK_PZX10
|
|
682
|
+
if rv
|
|
683
|
+
rv.pz_pos = 10
|
|
684
|
+
rv.pz = pz
|
|
685
|
+
end
|
|
686
|
+
return OK if kto[9] == pz
|
|
687
|
+
return FALSE if um != 0
|
|
688
|
+
m3132(kto, blz, um, rv)
|
|
689
|
+
end
|
|
690
|
+
|
|
691
|
+
# Methode D2c (Variante 3: Methode 68, mit diversen Sonderfällen; sie
|
|
692
|
+
# werden hier nicht getrennt nummeriert, sondern alle unter Variante 3
|
|
693
|
+
# geführt)
|
|
694
|
+
def m3132(kto, blz, um, rv)
|
|
695
|
+
if rv
|
|
696
|
+
rv.methode = "D2c"
|
|
697
|
+
rv.pz_methode = 3132
|
|
698
|
+
end
|
|
699
|
+
|
|
700
|
+
# Sonderfall: keine Prüfziffer
|
|
701
|
+
return OK_NO_CHK if kto[0] == 0 && kto[1] == 4
|
|
702
|
+
|
|
703
|
+
# 10stellige Kontonummern
|
|
704
|
+
if kto[0] != 0
|
|
705
|
+
return INVALID_KTO if kto[3] != 9
|
|
706
|
+
pz = 9 + kto[5] + kto[7] # 9: 7. Stelle von rechts
|
|
707
|
+
pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
|
|
708
|
+
pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
|
|
709
|
+
pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
|
|
710
|
+
pz %= 10
|
|
711
|
+
pz = 10 - pz if pz != 0
|
|
712
|
+
# CHECK_PZ10
|
|
713
|
+
if rv
|
|
714
|
+
rv.pz_pos = 10
|
|
715
|
+
rv.pz = pz
|
|
716
|
+
end
|
|
717
|
+
return kto[9] == pz ? OK : FALSE
|
|
718
|
+
end
|
|
719
|
+
|
|
720
|
+
# 6 bis 9stellige Kontonummern: Variante 1
|
|
721
|
+
pz = kto[1] + kto[3] + kto[5] + kto[7]
|
|
722
|
+
pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
|
|
723
|
+
pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
|
|
724
|
+
pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
|
|
725
|
+
pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
|
|
726
|
+
pz %= 10
|
|
727
|
+
pz = 10 - pz if pz != 0
|
|
728
|
+
rv.pz = pz if rv
|
|
729
|
+
return OK if kto[9] == pz
|
|
730
|
+
|
|
731
|
+
# 6 bis 9stellige Kontonummern: Variante 2
|
|
732
|
+
pz = kto[1] + kto[5] + kto[7]
|
|
733
|
+
pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
|
|
734
|
+
pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
|
|
735
|
+
pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
|
|
736
|
+
pz %= 10
|
|
737
|
+
pz = 10 - pz if pz != 0
|
|
738
|
+
# CHECK_PZ10
|
|
739
|
+
if rv
|
|
740
|
+
rv.pz_pos = 10
|
|
741
|
+
rv.pz = pz
|
|
742
|
+
end
|
|
743
|
+
kto[9] == pz ? OK : FALSE
|
|
744
|
+
end
|
|
745
|
+
|
|
746
|
+
# Methode D3
|
|
747
|
+
# Variante 1: Methode 00, Variante 2: Methode 27 (Modulus 10, iterierte
|
|
748
|
+
# Transformation) für Kontonummern ab 1.000.000.000.
|
|
749
|
+
def m133(kto, blz, um, rv)
|
|
750
|
+
if rv
|
|
751
|
+
rv.methode = "D3"
|
|
752
|
+
rv.pz_methode = 133
|
|
753
|
+
end
|
|
754
|
+
m1133(kto, blz, um, rv)
|
|
755
|
+
end
|
|
756
|
+
|
|
757
|
+
# Methode D3a (Variante 1: Methode 00)
|
|
758
|
+
def m1133(kto, blz, um, rv)
|
|
759
|
+
if rv
|
|
760
|
+
rv.methode = "D3a"
|
|
761
|
+
rv.pz_methode = 1133
|
|
762
|
+
end
|
|
763
|
+
pz = kto[1] + kto[3] + kto[5] + kto[7]
|
|
764
|
+
pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
|
|
765
|
+
pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
|
|
766
|
+
pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
|
|
767
|
+
pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
|
|
768
|
+
pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
|
|
769
|
+
pz %= 10
|
|
770
|
+
pz = 10 - pz if pz != 0
|
|
771
|
+
# CHECK_PZX10
|
|
772
|
+
if rv
|
|
773
|
+
rv.pz_pos = 10
|
|
774
|
+
rv.pz = pz
|
|
775
|
+
end
|
|
776
|
+
return OK if kto[9] == pz
|
|
777
|
+
return FALSE if um != 0
|
|
778
|
+
m2133(kto, blz, um, rv)
|
|
779
|
+
end
|
|
780
|
+
|
|
781
|
+
# Methode D3b (Variante 2: Methode 27)
|
|
782
|
+
def m2133(kto, blz, um, rv)
|
|
783
|
+
if rv
|
|
784
|
+
rv.methode = "D3b"
|
|
785
|
+
rv.pz_methode = 2133
|
|
786
|
+
end
|
|
787
|
+
# Kontonummern von 1 bis 999.999.999 wurden schon nach Methode 00
|
|
788
|
+
# geprüft, hier kann einfach FALSE zurückgegeben werden.
|
|
789
|
+
return FALSE if kto[0] == 0
|
|
790
|
+
pz = M10H_DIGITS[0][kto[0]] +
|
|
791
|
+
M10H_DIGITS[3][kto[1]] +
|
|
792
|
+
M10H_DIGITS[2][kto[2]] +
|
|
793
|
+
M10H_DIGITS[1][kto[3]] +
|
|
794
|
+
M10H_DIGITS[0][kto[4]] +
|
|
795
|
+
M10H_DIGITS[3][kto[5]] +
|
|
796
|
+
M10H_DIGITS[2][kto[6]] +
|
|
797
|
+
M10H_DIGITS[1][kto[7]] +
|
|
798
|
+
M10H_DIGITS[0][kto[8]]
|
|
799
|
+
pz %= 10
|
|
800
|
+
pz = 10 - pz if pz != 0
|
|
801
|
+
# CHECK_PZ10
|
|
802
|
+
if rv
|
|
803
|
+
rv.pz_pos = 10
|
|
804
|
+
rv.pz = pz
|
|
805
|
+
end
|
|
806
|
+
kto[9] == pz ? OK : FALSE
|
|
807
|
+
end
|
|
808
|
+
|
|
809
|
+
# Methode D4
|
|
810
|
+
# Methode 00 mit zusätzlicher Konstante 29; Kontonummern, die mit 0
|
|
811
|
+
# beginnen, sind ungültig.
|
|
812
|
+
def m134(kto, blz, um, rv)
|
|
813
|
+
if rv
|
|
814
|
+
rv.methode = "D4"
|
|
815
|
+
rv.pz_methode = 134
|
|
816
|
+
end
|
|
817
|
+
if kto[0] == 0
|
|
818
|
+
return INVALID_KTO
|
|
819
|
+
else
|
|
820
|
+
pz = 29
|
|
821
|
+
end
|
|
822
|
+
|
|
823
|
+
pz += kto[1] + kto[3] + kto[5] + kto[7]
|
|
824
|
+
pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
|
|
825
|
+
pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
|
|
826
|
+
pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
|
|
827
|
+
pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
|
|
828
|
+
pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
|
|
829
|
+
pz %= 10
|
|
830
|
+
pz = 10 - pz if pz != 0
|
|
831
|
+
# CHECK_PZ10
|
|
832
|
+
if rv
|
|
833
|
+
rv.pz_pos = 10
|
|
834
|
+
rv.pz = pz
|
|
835
|
+
end
|
|
836
|
+
kto[9] == pz ? OK : FALSE
|
|
837
|
+
end
|
|
838
|
+
|
|
839
|
+
# Methode D5
|
|
840
|
+
# Variante 1 (Stellen 3 und 4 == 99): Modulus 11, Gewichtung 2..7;
|
|
841
|
+
# Varianten 2-4: Modulus 11, Modulus 7 und Modulus 10, Gewichtung 2..7.
|
|
842
|
+
def m135(kto, blz, um, rv)
|
|
843
|
+
if rv
|
|
844
|
+
rv.methode = "D5"
|
|
845
|
+
rv.pz_methode = 135
|
|
846
|
+
end
|
|
847
|
+
if kto[2] == 9 && kto[3] == 9
|
|
848
|
+
m1135(kto, blz, um, rv)
|
|
849
|
+
else
|
|
850
|
+
m2135(kto, blz, um, rv)
|
|
851
|
+
end
|
|
852
|
+
end
|
|
853
|
+
|
|
854
|
+
# Methode D5a (Variante 1)
|
|
855
|
+
def m1135(kto, blz, um, rv)
|
|
856
|
+
if rv
|
|
857
|
+
rv.methode = "D5a"
|
|
858
|
+
rv.pz_methode = 1135
|
|
859
|
+
end
|
|
860
|
+
# die Stellen 3 und 4 sind 99; das ergibt einen Rest von 3
|
|
861
|
+
pz = 3 +
|
|
862
|
+
kto[4] * 6 +
|
|
863
|
+
kto[5] * 5 +
|
|
864
|
+
kto[6] * 4 +
|
|
865
|
+
kto[7] * 3 +
|
|
866
|
+
kto[8] * 2
|
|
867
|
+
pz %= 11
|
|
868
|
+
if pz <= 1
|
|
869
|
+
pz = 0
|
|
870
|
+
else
|
|
871
|
+
pz = 11 - pz
|
|
872
|
+
end
|
|
873
|
+
# CHECK_PZ10
|
|
874
|
+
if rv
|
|
875
|
+
rv.pz_pos = 10
|
|
876
|
+
rv.pz = pz
|
|
877
|
+
end
|
|
878
|
+
kto[9] == pz ? OK : FALSE
|
|
879
|
+
end
|
|
880
|
+
|
|
881
|
+
# Methode D5b (Variante 2: Modulus 11, Gewichtung 2,3,4,5,6,7)
|
|
882
|
+
def m2135(kto, blz, um, rv)
|
|
883
|
+
if rv
|
|
884
|
+
rv.methode = "D5b"
|
|
885
|
+
rv.pz_methode = 2135
|
|
886
|
+
end
|
|
887
|
+
pz = kto[3] * 7 +
|
|
888
|
+
kto[4] * 6 +
|
|
889
|
+
kto[5] * 5 +
|
|
890
|
+
kto[6] * 4 +
|
|
891
|
+
kto[7] * 3 +
|
|
892
|
+
kto[8] * 2
|
|
893
|
+
pz %= 11
|
|
894
|
+
if pz <= 1
|
|
895
|
+
pz = 0
|
|
896
|
+
else
|
|
897
|
+
pz = 11 - pz
|
|
898
|
+
end
|
|
899
|
+
# CHECK_PZX10
|
|
900
|
+
if rv
|
|
901
|
+
rv.pz_pos = 10
|
|
902
|
+
rv.pz = pz
|
|
903
|
+
end
|
|
904
|
+
return OK if kto[9] == pz
|
|
905
|
+
return FALSE if um != 0
|
|
906
|
+
m3135(kto, blz, um, rv)
|
|
907
|
+
end
|
|
908
|
+
|
|
909
|
+
# Methode D5c (Variante 3: Modulus 7, Gewichtung 2,3,4,5,6,7)
|
|
910
|
+
def m3135(kto, blz, um, rv)
|
|
911
|
+
if rv
|
|
912
|
+
rv.methode = "D5c"
|
|
913
|
+
rv.pz_methode = 3135
|
|
914
|
+
end
|
|
915
|
+
pz = kto[3] * 7 +
|
|
916
|
+
kto[4] * 6 +
|
|
917
|
+
kto[5] * 5 +
|
|
918
|
+
kto[6] * 4 +
|
|
919
|
+
kto[7] * 3 +
|
|
920
|
+
kto[8] * 2
|
|
921
|
+
pz %= 7
|
|
922
|
+
pz = 7 - pz if pz != 0
|
|
923
|
+
# CHECK_PZX10
|
|
924
|
+
if rv
|
|
925
|
+
rv.pz_pos = 10
|
|
926
|
+
rv.pz = pz
|
|
927
|
+
end
|
|
928
|
+
return OK if kto[9] == pz
|
|
929
|
+
return FALSE if um != 0
|
|
930
|
+
m4135(kto, blz, um, rv)
|
|
931
|
+
end
|
|
932
|
+
|
|
933
|
+
# Methode D5d (Variante 4: Modulus 10, Gewichtung 2,3,4,5,6,7)
|
|
934
|
+
def m4135(kto, blz, um, rv)
|
|
935
|
+
if rv
|
|
936
|
+
rv.methode = "D5d"
|
|
937
|
+
rv.pz_methode = 4135
|
|
938
|
+
end
|
|
939
|
+
pz = kto[3] * 7 +
|
|
940
|
+
kto[4] * 6 +
|
|
941
|
+
kto[5] * 5 +
|
|
942
|
+
kto[6] * 4 +
|
|
943
|
+
kto[7] * 3 +
|
|
944
|
+
kto[8] * 2
|
|
945
|
+
pz %= 10
|
|
946
|
+
pz = 10 - pz if pz != 0
|
|
947
|
+
# CHECK_PZ10
|
|
948
|
+
if rv
|
|
949
|
+
rv.pz_pos = 10
|
|
950
|
+
rv.pz = pz
|
|
951
|
+
end
|
|
952
|
+
kto[9] == pz ? OK : FALSE
|
|
953
|
+
end
|
|
954
|
+
|
|
955
|
+
# Methode D6
|
|
956
|
+
# Variante 1: Methode 07, Variante 2: Methode 03, Variante 3: Methode 00.
|
|
957
|
+
def m136(kto, blz, um, rv)
|
|
958
|
+
if rv
|
|
959
|
+
rv.methode = "D6"
|
|
960
|
+
rv.pz_methode = 136
|
|
961
|
+
end
|
|
962
|
+
m1136(kto, blz, um, rv)
|
|
963
|
+
end
|
|
964
|
+
|
|
965
|
+
# Methode D6a (Variante 1: Methode 07)
|
|
966
|
+
def m1136(kto, blz, um, rv)
|
|
967
|
+
if rv
|
|
968
|
+
rv.methode = "D6a"
|
|
969
|
+
rv.pz_methode = 1136
|
|
970
|
+
end
|
|
971
|
+
pz = kto[0] * 10 +
|
|
972
|
+
kto[1] * 9 +
|
|
973
|
+
kto[2] * 8 +
|
|
974
|
+
kto[3] * 7 +
|
|
975
|
+
kto[4] * 6 +
|
|
976
|
+
kto[5] * 5 +
|
|
977
|
+
kto[6] * 4 +
|
|
978
|
+
kto[7] * 3 +
|
|
979
|
+
kto[8] * 2
|
|
980
|
+
pz %= 11
|
|
981
|
+
pz = 11 - pz if pz != 0
|
|
982
|
+
# CHECK_PZX10
|
|
983
|
+
if rv
|
|
984
|
+
rv.pz_pos = 10
|
|
985
|
+
rv.pz = pz
|
|
986
|
+
end
|
|
987
|
+
return OK if kto[9] == pz
|
|
988
|
+
return FALSE if um != 0
|
|
989
|
+
m2136(kto, blz, um, rv)
|
|
990
|
+
end
|
|
991
|
+
|
|
992
|
+
# Methode D6b (Variante 2: Methode 03)
|
|
993
|
+
def m2136(kto, blz, um, rv)
|
|
994
|
+
if rv
|
|
995
|
+
rv.methode = "D6b"
|
|
996
|
+
rv.pz_methode = 2136
|
|
997
|
+
end
|
|
998
|
+
pz = kto[0] * 2 +
|
|
999
|
+
kto[1] +
|
|
1000
|
+
kto[2] * 2 +
|
|
1001
|
+
kto[3] +
|
|
1002
|
+
kto[4] * 2 +
|
|
1003
|
+
kto[5] +
|
|
1004
|
+
kto[6] * 2 +
|
|
1005
|
+
kto[7] +
|
|
1006
|
+
kto[8] * 2
|
|
1007
|
+
pz %= 10
|
|
1008
|
+
pz = 10 - pz if pz != 0
|
|
1009
|
+
# CHECK_PZX10
|
|
1010
|
+
if rv
|
|
1011
|
+
rv.pz_pos = 10
|
|
1012
|
+
rv.pz = pz
|
|
1013
|
+
end
|
|
1014
|
+
return OK if kto[9] == pz
|
|
1015
|
+
return FALSE if um != 0
|
|
1016
|
+
m3136(kto, blz, um, rv)
|
|
1017
|
+
end
|
|
1018
|
+
|
|
1019
|
+
# Methode D6c (Variante 3: Methode 00)
|
|
1020
|
+
def m3136(kto, blz, um, rv)
|
|
1021
|
+
if rv
|
|
1022
|
+
rv.methode = "D6c"
|
|
1023
|
+
rv.pz_methode = 3136
|
|
1024
|
+
end
|
|
1025
|
+
pz = kto[1] + kto[3] + kto[5] + kto[7]
|
|
1026
|
+
pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
|
|
1027
|
+
pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
|
|
1028
|
+
pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
|
|
1029
|
+
pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
|
|
1030
|
+
pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
|
|
1031
|
+
pz %= 10
|
|
1032
|
+
pz = 10 - pz if pz != 0
|
|
1033
|
+
# CHECK_PZ10
|
|
1034
|
+
if rv
|
|
1035
|
+
rv.pz_pos = 10
|
|
1036
|
+
rv.pz = pz
|
|
1037
|
+
end
|
|
1038
|
+
kto[9] == pz ? OK : FALSE
|
|
1039
|
+
end
|
|
1040
|
+
|
|
1041
|
+
# Methode D7
|
|
1042
|
+
# Methode 00, allerdings ohne die abschließende Subtraktion von 10
|
|
1043
|
+
# (die Prüfziffer ist direkt der Rest der Division durch 10).
|
|
1044
|
+
def m137(kto, blz, um, rv)
|
|
1045
|
+
if rv
|
|
1046
|
+
rv.methode = "D7"
|
|
1047
|
+
rv.pz_methode = 137
|
|
1048
|
+
end
|
|
1049
|
+
pz = kto[1] + kto[3] + kto[5] + kto[7]
|
|
1050
|
+
pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
|
|
1051
|
+
pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
|
|
1052
|
+
pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
|
|
1053
|
+
pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
|
|
1054
|
+
pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
|
|
1055
|
+
pz %= 10
|
|
1056
|
+
# CHECK_PZ10
|
|
1057
|
+
if rv
|
|
1058
|
+
rv.pz_pos = 10
|
|
1059
|
+
rv.pz = pz
|
|
1060
|
+
end
|
|
1061
|
+
kto[9] == pz ? OK : FALSE
|
|
1062
|
+
end
|
|
1063
|
+
|
|
1064
|
+
# Methode D8
|
|
1065
|
+
# Variante 2: Kontonummern 0010000000 bis 0099999999 werden nicht
|
|
1066
|
+
# geprüft, kleinere sind ungültig; Variante 1: Methode 00.
|
|
1067
|
+
def m138(kto, blz, um, rv)
|
|
1068
|
+
if rv
|
|
1069
|
+
rv.methode = "D8"
|
|
1070
|
+
rv.pz_methode = 138
|
|
1071
|
+
end
|
|
1072
|
+
m2138(kto, blz, um, rv)
|
|
1073
|
+
end
|
|
1074
|
+
|
|
1075
|
+
# Methode D8b (Variante 2)
|
|
1076
|
+
def m2138(kto, blz, um, rv)
|
|
1077
|
+
if rv
|
|
1078
|
+
rv.methode = "D8b"
|
|
1079
|
+
rv.pz_methode = 2138
|
|
1080
|
+
end
|
|
1081
|
+
if kto[0] == 0
|
|
1082
|
+
if kto[1] == 0 && kto[2] > 0
|
|
1083
|
+
return OK_NO_CHK
|
|
1084
|
+
else
|
|
1085
|
+
return INVALID_KTO
|
|
1086
|
+
end
|
|
1087
|
+
end
|
|
1088
|
+
m1138(kto, blz, um, rv)
|
|
1089
|
+
end
|
|
1090
|
+
|
|
1091
|
+
# Methode D8a (Variante 1: Methode 00)
|
|
1092
|
+
def m1138(kto, blz, um, rv)
|
|
1093
|
+
if rv
|
|
1094
|
+
rv.methode = "D8a"
|
|
1095
|
+
rv.pz_methode = 1138
|
|
1096
|
+
end
|
|
1097
|
+
pz = kto[1] + kto[3] + kto[5] + kto[7]
|
|
1098
|
+
pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
|
|
1099
|
+
pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
|
|
1100
|
+
pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
|
|
1101
|
+
pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
|
|
1102
|
+
pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
|
|
1103
|
+
pz %= 10
|
|
1104
|
+
pz = 10 - pz if pz != 0
|
|
1105
|
+
# CHECK_PZ10
|
|
1106
|
+
if rv
|
|
1107
|
+
rv.pz_pos = 10
|
|
1108
|
+
rv.pz = pz
|
|
1109
|
+
end
|
|
1110
|
+
kto[9] == pz ? OK : FALSE
|
|
1111
|
+
end
|
|
1112
|
+
|
|
1113
|
+
# Methode D9
|
|
1114
|
+
# Variante 1: Methode 00, Variante 2: Methode 10, Variante 3: Methode 18.
|
|
1115
|
+
def m139(kto, blz, um, rv)
|
|
1116
|
+
if rv
|
|
1117
|
+
rv.methode = "D9"
|
|
1118
|
+
rv.pz_methode = 139
|
|
1119
|
+
end
|
|
1120
|
+
m1139(kto, blz, um, rv)
|
|
1121
|
+
end
|
|
1122
|
+
|
|
1123
|
+
# Methode D9a (Variante 1: Methode 00)
|
|
1124
|
+
def m1139(kto, blz, um, rv)
|
|
1125
|
+
if rv
|
|
1126
|
+
rv.methode = "D9a"
|
|
1127
|
+
rv.pz_methode = 1139
|
|
1128
|
+
end
|
|
1129
|
+
pz = kto[1] + kto[3] + kto[5] + kto[7]
|
|
1130
|
+
pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
|
|
1131
|
+
pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
|
|
1132
|
+
pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
|
|
1133
|
+
pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
|
|
1134
|
+
pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
|
|
1135
|
+
pz %= 10
|
|
1136
|
+
pz = 10 - pz if pz != 0
|
|
1137
|
+
# CHECK_PZX10
|
|
1138
|
+
if rv
|
|
1139
|
+
rv.pz_pos = 10
|
|
1140
|
+
rv.pz = pz
|
|
1141
|
+
end
|
|
1142
|
+
return OK if kto[9] == pz
|
|
1143
|
+
return FALSE if um != 0
|
|
1144
|
+
m2139(kto, blz, um, rv)
|
|
1145
|
+
end
|
|
1146
|
+
|
|
1147
|
+
# Methode D9b (Variante 2: Methode 10)
|
|
1148
|
+
def m2139(kto, blz, um, rv)
|
|
1149
|
+
if rv
|
|
1150
|
+
rv.methode = "D9b"
|
|
1151
|
+
rv.pz_methode = 2139
|
|
1152
|
+
end
|
|
1153
|
+
pz = kto[0] * 10 +
|
|
1154
|
+
kto[1] * 9 +
|
|
1155
|
+
kto[2] * 8 +
|
|
1156
|
+
kto[3] * 7 +
|
|
1157
|
+
kto[4] * 6 +
|
|
1158
|
+
kto[5] * 5 +
|
|
1159
|
+
kto[6] * 4 +
|
|
1160
|
+
kto[7] * 3 +
|
|
1161
|
+
kto[8] * 2
|
|
1162
|
+
pz %= 11
|
|
1163
|
+
if pz <= 1
|
|
1164
|
+
pz = 0
|
|
1165
|
+
else
|
|
1166
|
+
pz = 11 - pz
|
|
1167
|
+
end
|
|
1168
|
+
# CHECK_PZX10
|
|
1169
|
+
if rv
|
|
1170
|
+
rv.pz_pos = 10
|
|
1171
|
+
rv.pz = pz
|
|
1172
|
+
end
|
|
1173
|
+
return OK if kto[9] == pz
|
|
1174
|
+
return FALSE if um != 0
|
|
1175
|
+
m3139(kto, blz, um, rv)
|
|
1176
|
+
end
|
|
1177
|
+
|
|
1178
|
+
# Methode D9c (Variante 3: Methode 18)
|
|
1179
|
+
def m3139(kto, blz, um, rv)
|
|
1180
|
+
if rv
|
|
1181
|
+
rv.methode = "D9c"
|
|
1182
|
+
rv.pz_methode = 3139
|
|
1183
|
+
end
|
|
1184
|
+
pz = kto[0] * 3 +
|
|
1185
|
+
kto[1] +
|
|
1186
|
+
kto[2] * 7 +
|
|
1187
|
+
kto[3] * 9 +
|
|
1188
|
+
kto[4] * 3 +
|
|
1189
|
+
kto[5] +
|
|
1190
|
+
kto[6] * 7 +
|
|
1191
|
+
kto[7] * 9 +
|
|
1192
|
+
kto[8] * 3
|
|
1193
|
+
pz %= 10
|
|
1194
|
+
pz = 10 - pz if pz != 0
|
|
1195
|
+
# CHECK_PZ10
|
|
1196
|
+
if rv
|
|
1197
|
+
rv.pz_pos = 10
|
|
1198
|
+
rv.pz = pz
|
|
1199
|
+
end
|
|
1200
|
+
kto[9] == pz ? OK : FALSE
|
|
1201
|
+
end
|
|
1202
|
+
|
|
1203
|
+
# Methode E0
|
|
1204
|
+
# Das Verfahren entspricht (bis auf die zusätzliche 7) genau dem
|
|
1205
|
+
# Verfahren 00.
|
|
1206
|
+
def m140(kto, blz, um, rv)
|
|
1207
|
+
if rv
|
|
1208
|
+
rv.methode = "E0"
|
|
1209
|
+
rv.pz_methode = 140
|
|
1210
|
+
end
|
|
1211
|
+
pz = kto[1] + kto[3] + kto[5] + kto[7]
|
|
1212
|
+
pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
|
|
1213
|
+
pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
|
|
1214
|
+
pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
|
|
1215
|
+
pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
|
|
1216
|
+
pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
|
|
1217
|
+
pz += 7
|
|
1218
|
+
pz %= 10
|
|
1219
|
+
pz = 10 - pz if pz != 0
|
|
1220
|
+
# CHECK_PZ10
|
|
1221
|
+
if rv
|
|
1222
|
+
rv.pz_pos = 10
|
|
1223
|
+
rv.pz = pz
|
|
1224
|
+
end
|
|
1225
|
+
kto[9] == pz ? OK : FALSE
|
|
1226
|
+
end
|
|
1227
|
+
|
|
1228
|
+
# Methode E1
|
|
1229
|
+
# Modulus 11, Gewichtung 1,2,3,4,5,6,11,10,9 (von rechts); die Prüfziffer
|
|
1230
|
+
# ist der Rest selbst, Rest 10 ist ungültig.
|
|
1231
|
+
def m141(kto, blz, um, rv)
|
|
1232
|
+
if rv
|
|
1233
|
+
rv.methode = "E1"
|
|
1234
|
+
rv.pz_methode = 141
|
|
1235
|
+
end
|
|
1236
|
+
# die Form (kto[x]+48) entspricht dem C-Code (für nicht-ASCII Plattformen)
|
|
1237
|
+
pz = (kto[0] + 48) * 9 +
|
|
1238
|
+
(kto[1] + 48) * 10 +
|
|
1239
|
+
(kto[2] + 48) * 11 +
|
|
1240
|
+
(kto[3] + 48) * 6 +
|
|
1241
|
+
(kto[4] + 48) * 5 +
|
|
1242
|
+
(kto[5] + 48) * 4 +
|
|
1243
|
+
(kto[6] + 48) * 3 +
|
|
1244
|
+
(kto[7] + 48) * 2 +
|
|
1245
|
+
(kto[8] + 48) -
|
|
1246
|
+
2442
|
|
1247
|
+
pz %= 11
|
|
1248
|
+
return FALSE if pz == 10
|
|
1249
|
+
# CHECK_PZ10
|
|
1250
|
+
if rv
|
|
1251
|
+
rv.pz_pos = 10
|
|
1252
|
+
rv.pz = pz
|
|
1253
|
+
end
|
|
1254
|
+
kto[9] == pz ? OK : FALSE
|
|
1255
|
+
end
|
|
1256
|
+
|
|
1257
|
+
# Methode E2
|
|
1258
|
+
# Methode 00 mit zusätzlicher Konstante 25; Kontonummern, deren erste
|
|
1259
|
+
# Stelle größer als 5 ist, sind ungültig.
|
|
1260
|
+
def m142(kto, blz, um, rv)
|
|
1261
|
+
if rv
|
|
1262
|
+
rv.methode = "E2"
|
|
1263
|
+
rv.pz_methode = 142
|
|
1264
|
+
end
|
|
1265
|
+
return INVALID_KTO if kto[0] > 5
|
|
1266
|
+
pz = 25
|
|
1267
|
+
|
|
1268
|
+
pz += kto[1] + kto[3] + kto[5] + kto[7]
|
|
1269
|
+
pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
|
|
1270
|
+
pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
|
|
1271
|
+
pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
|
|
1272
|
+
pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
|
|
1273
|
+
pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
|
|
1274
|
+
pz %= 10
|
|
1275
|
+
pz = 10 - pz if pz != 0
|
|
1276
|
+
# CHECK_PZ10
|
|
1277
|
+
if rv
|
|
1278
|
+
rv.pz_pos = 10
|
|
1279
|
+
rv.pz = pz
|
|
1280
|
+
end
|
|
1281
|
+
kto[9] == pz ? OK : FALSE
|
|
1282
|
+
end
|
|
1283
|
+
|
|
1284
|
+
# Methode E3
|
|
1285
|
+
# Variante 1: Methode 00, Variante 2: Methode 21 (Quersummen-Iteration).
|
|
1286
|
+
def m143(kto, blz, um, rv)
|
|
1287
|
+
if rv
|
|
1288
|
+
rv.methode = "E3"
|
|
1289
|
+
rv.pz_methode = 143
|
|
1290
|
+
end
|
|
1291
|
+
m1143(kto, blz, um, rv)
|
|
1292
|
+
end
|
|
1293
|
+
|
|
1294
|
+
# Methode E3a (Variante 1: Methode 00)
|
|
1295
|
+
def m1143(kto, blz, um, rv)
|
|
1296
|
+
if rv
|
|
1297
|
+
rv.methode = "E3a"
|
|
1298
|
+
rv.pz_methode = 1143
|
|
1299
|
+
end
|
|
1300
|
+
pz = kto[1] + kto[3] + kto[5] + kto[7]
|
|
1301
|
+
pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
|
|
1302
|
+
pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
|
|
1303
|
+
pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
|
|
1304
|
+
pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
|
|
1305
|
+
pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
|
|
1306
|
+
pz %= 10
|
|
1307
|
+
pz = 10 - pz if pz != 0
|
|
1308
|
+
# CHECK_PZX10
|
|
1309
|
+
if rv
|
|
1310
|
+
rv.pz_pos = 10
|
|
1311
|
+
rv.pz = pz
|
|
1312
|
+
end
|
|
1313
|
+
return OK if kto[9] == pz
|
|
1314
|
+
return FALSE if um != 0
|
|
1315
|
+
m2143(kto, blz, um, rv)
|
|
1316
|
+
end
|
|
1317
|
+
|
|
1318
|
+
# Methode E3b (Variante 2: Methode 21)
|
|
1319
|
+
def m2143(kto, blz, um, rv)
|
|
1320
|
+
if rv
|
|
1321
|
+
rv.methode = "E3b"
|
|
1322
|
+
rv.pz_methode = 2143
|
|
1323
|
+
end
|
|
1324
|
+
pz = kto[0] * 2 +
|
|
1325
|
+
kto[1] +
|
|
1326
|
+
kto[2] * 2 +
|
|
1327
|
+
kto[3] +
|
|
1328
|
+
kto[4] * 2 +
|
|
1329
|
+
kto[5] +
|
|
1330
|
+
kto[6] * 2 +
|
|
1331
|
+
kto[7] +
|
|
1332
|
+
kto[8] * 2
|
|
1333
|
+
# iterierte Quersumme (wie im C-Code ausgeschrieben)
|
|
1334
|
+
pz = pz - 80 + 8 if pz >= 80
|
|
1335
|
+
pz = pz - 40 + 4 if pz >= 40
|
|
1336
|
+
pz = pz - 20 + 2 if pz >= 20
|
|
1337
|
+
pz = pz - 10 + 1 if pz >= 10
|
|
1338
|
+
pz = pz - 10 + 1 if pz >= 10
|
|
1339
|
+
pz = 10 - pz if pz != 0
|
|
1340
|
+
# CHECK_PZ10
|
|
1341
|
+
if rv
|
|
1342
|
+
rv.pz_pos = 10
|
|
1343
|
+
rv.pz = pz
|
|
1344
|
+
end
|
|
1345
|
+
kto[9] == pz ? OK : FALSE
|
|
1346
|
+
end
|
|
1347
|
+
|
|
1348
|
+
# Methode E4
|
|
1349
|
+
# Variante 1: Methode 02, Variante 2: Methode 00.
|
|
1350
|
+
def m144(kto, blz, um, rv)
|
|
1351
|
+
if rv
|
|
1352
|
+
rv.methode = "E4"
|
|
1353
|
+
rv.pz_methode = 144
|
|
1354
|
+
end
|
|
1355
|
+
m1144(kto, blz, um, rv)
|
|
1356
|
+
end
|
|
1357
|
+
|
|
1358
|
+
# Methode E4a (Variante 1: Methode 02)
|
|
1359
|
+
def m1144(kto, blz, um, rv)
|
|
1360
|
+
if rv
|
|
1361
|
+
rv.methode = "E4a"
|
|
1362
|
+
rv.pz_methode = 1144
|
|
1363
|
+
end
|
|
1364
|
+
pz = kto[0] * 2 +
|
|
1365
|
+
kto[1] * 9 +
|
|
1366
|
+
kto[2] * 8 +
|
|
1367
|
+
kto[3] * 7 +
|
|
1368
|
+
kto[4] * 6 +
|
|
1369
|
+
kto[5] * 5 +
|
|
1370
|
+
kto[6] * 4 +
|
|
1371
|
+
kto[7] * 3 +
|
|
1372
|
+
kto[8] * 2
|
|
1373
|
+
pz %= 11
|
|
1374
|
+
pz = 11 - pz if pz != 0
|
|
1375
|
+
# CHECK_PZX10
|
|
1376
|
+
if rv
|
|
1377
|
+
rv.pz_pos = 10
|
|
1378
|
+
rv.pz = pz
|
|
1379
|
+
end
|
|
1380
|
+
return OK if kto[9] == pz
|
|
1381
|
+
return FALSE if um != 0
|
|
1382
|
+
m2144(kto, blz, um, rv)
|
|
1383
|
+
end
|
|
1384
|
+
|
|
1385
|
+
# Methode E4b (Variante 2: Methode 00)
|
|
1386
|
+
def m2144(kto, blz, um, rv)
|
|
1387
|
+
if rv
|
|
1388
|
+
rv.methode = "E4b"
|
|
1389
|
+
rv.pz_methode = 2144
|
|
1390
|
+
end
|
|
1391
|
+
pz = kto[1] + kto[3] + kto[5] + kto[7]
|
|
1392
|
+
pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
|
|
1393
|
+
pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
|
|
1394
|
+
pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
|
|
1395
|
+
pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
|
|
1396
|
+
pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
|
|
1397
|
+
pz %= 10
|
|
1398
|
+
pz = 10 - pz if pz != 0
|
|
1399
|
+
# CHECK_PZ10
|
|
1400
|
+
if rv
|
|
1401
|
+
rv.pz_pos = 10
|
|
1402
|
+
rv.pz = pz
|
|
1403
|
+
end
|
|
1404
|
+
kto[9] == pz ? OK : FALSE
|
|
1405
|
+
end
|
|
1406
|
+
end
|
|
1407
|
+
end
|