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,1604 @@
|
|
|
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 51
|
|
18
|
+
# Modulus 11, Gewichtung 7,6,5,4,3,2 (Variante A); bei Mißerfolg
|
|
19
|
+
# Varianten B (6,5,4,3,2), C (Luhn) und D (Modulus 7). Falls die dritte
|
|
20
|
+
# Stelle eine 9 ist, werden stattdessen die Ausnahmevarianten E und F
|
|
21
|
+
# gerechnet.
|
|
22
|
+
def m51(kto, blz, um, rv)
|
|
23
|
+
if kto[2] == 9 # Ausnahme
|
|
24
|
+
return m5051(kto, blz, um, rv)
|
|
25
|
+
end
|
|
26
|
+
m1051(kto, blz, um, rv)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
# Methode 51e (Ausnahme, Variante 1)
|
|
30
|
+
def m5051(kto, blz, um, rv)
|
|
31
|
+
if rv
|
|
32
|
+
rv.methode = "51e"
|
|
33
|
+
rv.pz_methode = 5051
|
|
34
|
+
end
|
|
35
|
+
pz = 9 * 8 +
|
|
36
|
+
kto[3] * 7 +
|
|
37
|
+
kto[4] * 6 +
|
|
38
|
+
kto[5] * 5 +
|
|
39
|
+
kto[6] * 4 +
|
|
40
|
+
kto[7] * 3 +
|
|
41
|
+
kto[8] * 2
|
|
42
|
+
pz %= 11
|
|
43
|
+
if pz <= 1
|
|
44
|
+
pz = 0
|
|
45
|
+
else
|
|
46
|
+
pz = 11 - pz
|
|
47
|
+
end
|
|
48
|
+
# CHECK_PZX10
|
|
49
|
+
if rv
|
|
50
|
+
rv.pz_pos = 10
|
|
51
|
+
rv.pz = pz
|
|
52
|
+
end
|
|
53
|
+
return OK if kto[9] == pz
|
|
54
|
+
return FALSE if um != 0
|
|
55
|
+
m6051(kto, blz, um, rv)
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
# Methode 51f (Ausnahme, Variante 2)
|
|
59
|
+
def m6051(kto, blz, um, rv)
|
|
60
|
+
if rv
|
|
61
|
+
rv.methode = "51f"
|
|
62
|
+
rv.pz_methode = 6051
|
|
63
|
+
end
|
|
64
|
+
pz = kto[0] * 10 +
|
|
65
|
+
kto[1] * 9 +
|
|
66
|
+
9 * 8 +
|
|
67
|
+
kto[3] * 7 +
|
|
68
|
+
kto[4] * 6 +
|
|
69
|
+
kto[5] * 5 +
|
|
70
|
+
kto[6] * 4 +
|
|
71
|
+
kto[7] * 3 +
|
|
72
|
+
kto[8] * 2
|
|
73
|
+
pz %= 11
|
|
74
|
+
if pz <= 1
|
|
75
|
+
pz = 0
|
|
76
|
+
else
|
|
77
|
+
pz = 11 - pz
|
|
78
|
+
end
|
|
79
|
+
# CHECK_PZ10
|
|
80
|
+
if rv
|
|
81
|
+
rv.pz_pos = 10
|
|
82
|
+
rv.pz = pz
|
|
83
|
+
end
|
|
84
|
+
kto[9] == pz ? OK : FALSE
|
|
85
|
+
end
|
|
86
|
+
|
|
87
|
+
# Methode 51a (Modulus 11, Gewichtung 7,6,5,4,3,2)
|
|
88
|
+
def m1051(kto, blz, um, rv)
|
|
89
|
+
if rv
|
|
90
|
+
rv.methode = "51a"
|
|
91
|
+
rv.pz_methode = 1051
|
|
92
|
+
end
|
|
93
|
+
pz = kto[3] * 7 +
|
|
94
|
+
kto[4] * 6 +
|
|
95
|
+
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_PZX10
|
|
106
|
+
if rv
|
|
107
|
+
rv.pz_pos = 10
|
|
108
|
+
rv.pz = pz
|
|
109
|
+
end
|
|
110
|
+
return OK if kto[9] == pz
|
|
111
|
+
return FALSE if um != 0
|
|
112
|
+
m2051(kto, blz, um, rv)
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# Methode 51b (Modulus 11, Gewichtung 6,5,4,3,2)
|
|
116
|
+
def m2051(kto, blz, um, rv)
|
|
117
|
+
if rv
|
|
118
|
+
rv.methode = "51b"
|
|
119
|
+
rv.pz_methode = 2051
|
|
120
|
+
end
|
|
121
|
+
pz = kto[4] * 6 +
|
|
122
|
+
kto[5] * 5 +
|
|
123
|
+
kto[6] * 4 +
|
|
124
|
+
kto[7] * 3 +
|
|
125
|
+
kto[8] * 2
|
|
126
|
+
pz %= 11
|
|
127
|
+
if pz <= 1
|
|
128
|
+
pz = 0
|
|
129
|
+
else
|
|
130
|
+
pz = 11 - pz
|
|
131
|
+
end
|
|
132
|
+
# CHECK_PZX10
|
|
133
|
+
if rv
|
|
134
|
+
rv.pz_pos = 10
|
|
135
|
+
rv.pz = pz
|
|
136
|
+
end
|
|
137
|
+
return OK if kto[9] == pz
|
|
138
|
+
return FALSE if um != 0
|
|
139
|
+
m3051(kto, blz, um, rv)
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
# Methode 51c (Modulus 10, Gewichtung 2,1,2,1,2,1)
|
|
143
|
+
def m3051(kto, blz, um, rv)
|
|
144
|
+
if rv
|
|
145
|
+
rv.methode = "51c"
|
|
146
|
+
rv.pz_methode = 3051
|
|
147
|
+
end
|
|
148
|
+
pz = kto[3] + kto[5] + kto[7]
|
|
149
|
+
if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
|
|
150
|
+
if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
|
|
151
|
+
if kto[8] < 5 then pz += kto[8] * 2 else pz += kto[8] * 2 - 9 end
|
|
152
|
+
pz %= 10
|
|
153
|
+
pz = 10 - pz if pz != 0
|
|
154
|
+
# CHECK_PZX10
|
|
155
|
+
if rv
|
|
156
|
+
rv.pz_pos = 10
|
|
157
|
+
rv.pz = pz
|
|
158
|
+
end
|
|
159
|
+
return OK if kto[9] == pz
|
|
160
|
+
return FALSE if um != 0
|
|
161
|
+
m4051(kto, blz, um, rv)
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
# Methode 51d (Modulus 7, Gewichtung 6,5,4,3,2)
|
|
165
|
+
def m4051(kto, blz, um, rv)
|
|
166
|
+
if rv
|
|
167
|
+
rv.methode = "51d"
|
|
168
|
+
rv.pz_methode = 4051
|
|
169
|
+
end
|
|
170
|
+
pz = kto[4] * 6 +
|
|
171
|
+
kto[5] * 5 +
|
|
172
|
+
kto[6] * 4 +
|
|
173
|
+
kto[7] * 3 +
|
|
174
|
+
kto[8] * 2
|
|
175
|
+
pz %= 7
|
|
176
|
+
pz = 7 - pz if pz != 0
|
|
177
|
+
# CHECK_PZ10
|
|
178
|
+
if rv
|
|
179
|
+
rv.pz_pos = 10
|
|
180
|
+
rv.pz = pz
|
|
181
|
+
end
|
|
182
|
+
kto[9] == pz ? OK : FALSE
|
|
183
|
+
end
|
|
184
|
+
|
|
185
|
+
# Methode 52
|
|
186
|
+
# Für Konten die mit 9 beginnen: Berechnung nach Methode 20; sonst wird
|
|
187
|
+
# aus BLZ und Kontonummer die Kontonummer des ESER-Altsystems generiert
|
|
188
|
+
# und diese geprüft.
|
|
189
|
+
def m52(kto, blz, um, rv)
|
|
190
|
+
m1052(kto, blz, um, rv)
|
|
191
|
+
end
|
|
192
|
+
|
|
193
|
+
# Methode 52a (Berechnung nach Methode 20, nur für Konten mit führender 9)
|
|
194
|
+
def m1052(kto, blz, um, rv)
|
|
195
|
+
if rv
|
|
196
|
+
rv.methode = "52a"
|
|
197
|
+
rv.pz_methode = 1052
|
|
198
|
+
end
|
|
199
|
+
if kto[0] == 9
|
|
200
|
+
pz = kto[0] * 3 +
|
|
201
|
+
kto[1] * 9 +
|
|
202
|
+
kto[2] * 8 +
|
|
203
|
+
kto[3] * 7 +
|
|
204
|
+
kto[4] * 6 +
|
|
205
|
+
kto[5] * 5 +
|
|
206
|
+
kto[6] * 4 +
|
|
207
|
+
kto[7] * 3 +
|
|
208
|
+
kto[8] * 2
|
|
209
|
+
pz %= 11
|
|
210
|
+
if pz <= 1
|
|
211
|
+
pz = 0
|
|
212
|
+
else
|
|
213
|
+
pz = 11 - pz
|
|
214
|
+
end
|
|
215
|
+
# CHECK_PZ10
|
|
216
|
+
if rv
|
|
217
|
+
rv.pz_pos = 10
|
|
218
|
+
rv.pz = pz
|
|
219
|
+
end
|
|
220
|
+
return kto[9] == pz ? OK : FALSE
|
|
221
|
+
end
|
|
222
|
+
m2052(kto, blz, um, rv)
|
|
223
|
+
end
|
|
224
|
+
|
|
225
|
+
# Methode 52b (Konto-Nr. des ESER-Altsystems generieren und prüfen)
|
|
226
|
+
def m2052(kto, blz, um, rv)
|
|
227
|
+
if rv
|
|
228
|
+
rv.methode = "52b"
|
|
229
|
+
rv.pz_methode = 2052
|
|
230
|
+
end
|
|
231
|
+
if blz.nil?
|
|
232
|
+
ok = OK_TEST_BLZ_USED
|
|
233
|
+
blz = "13051172"
|
|
234
|
+
else
|
|
235
|
+
ok = OK
|
|
236
|
+
end
|
|
237
|
+
|
|
238
|
+
# Generieren der Konto-Nr. des ESER-Altsystems
|
|
239
|
+
ptr = 0
|
|
240
|
+
ptr += 1 while ptr < 10 && kto[ptr] == 0
|
|
241
|
+
return INVALID_KTO if ptr > 2
|
|
242
|
+
kto_alt = Array.new(6, 0)
|
|
243
|
+
kto_alt[0] = blz[4].to_i
|
|
244
|
+
kto_alt[1] = blz[5].to_i
|
|
245
|
+
kto_alt[2] = blz[6].to_i
|
|
246
|
+
kto_alt[3] = blz[7].to_i
|
|
247
|
+
kto_alt[4] = kto[ptr]
|
|
248
|
+
ptr += 1
|
|
249
|
+
kto_alt[5] = kto[ptr]
|
|
250
|
+
ptr += 1
|
|
251
|
+
if rv
|
|
252
|
+
rv.pz_pos = ptr + 1
|
|
253
|
+
rv.pz = kto_alt[5]
|
|
254
|
+
end
|
|
255
|
+
ptr += 1 while ptr < 10 && kto[ptr] == 0
|
|
256
|
+
while ptr < 10
|
|
257
|
+
kto_alt << kto[ptr]
|
|
258
|
+
ptr += 1
|
|
259
|
+
end
|
|
260
|
+
# die Konto-Nr. des ESER-Altsystems darf maximal 12 Stellen haben
|
|
261
|
+
return INVALID_KTO if kto_alt.length > 12
|
|
262
|
+
|
|
263
|
+
p1 = kto_alt[5] # Prüfziffer
|
|
264
|
+
kto_alt[5] = 0
|
|
265
|
+
pz = 0
|
|
266
|
+
i = 0
|
|
267
|
+
j = kto_alt.length - 1
|
|
268
|
+
while j >= 0
|
|
269
|
+
pz += kto_alt[j] * W52[i]
|
|
270
|
+
j -= 1
|
|
271
|
+
i += 1
|
|
272
|
+
end
|
|
273
|
+
kto_alt[5] = p1
|
|
274
|
+
pz %= 11
|
|
275
|
+
p1 = W52[i - 6]
|
|
276
|
+
|
|
277
|
+
# passenden Faktor suchen
|
|
278
|
+
tmp = pz
|
|
279
|
+
i = 0
|
|
280
|
+
while i < 10
|
|
281
|
+
pz = tmp + p1 * i
|
|
282
|
+
pz %= 11
|
|
283
|
+
break if pz == 10
|
|
284
|
+
i += 1
|
|
285
|
+
end
|
|
286
|
+
pz = i # Prüfziffer ist der verwendete Faktor des Gewichtes
|
|
287
|
+
# INVALID_PZ10
|
|
288
|
+
if rv
|
|
289
|
+
rv.pz_pos = 10
|
|
290
|
+
rv.pz = pz
|
|
291
|
+
end
|
|
292
|
+
return INVALID_KTO if pz == 10
|
|
293
|
+
kto_alt[5] == pz ? ok : FALSE
|
|
294
|
+
end
|
|
295
|
+
|
|
296
|
+
# Methode 53
|
|
297
|
+
# Wie Methode 52, aber mit anderer Generierung der ESER-Kontonummer
|
|
298
|
+
# (nur für neunstellige Kontonummern).
|
|
299
|
+
def m53(kto, blz, um, rv)
|
|
300
|
+
if kto[0] == 9
|
|
301
|
+
return m1053(kto, blz, um, rv)
|
|
302
|
+
end
|
|
303
|
+
m2053(kto, blz, um, rv)
|
|
304
|
+
end
|
|
305
|
+
|
|
306
|
+
# Methode 53a (Berechnung nach Methode 20, nur für Konten mit führender 9)
|
|
307
|
+
def m1053(kto, blz, um, rv)
|
|
308
|
+
if rv
|
|
309
|
+
rv.methode = "53a"
|
|
310
|
+
rv.pz_methode = 1053
|
|
311
|
+
end
|
|
312
|
+
pz = kto[0] * 3 +
|
|
313
|
+
kto[1] * 9 +
|
|
314
|
+
kto[2] * 8 +
|
|
315
|
+
kto[3] * 7 +
|
|
316
|
+
kto[4] * 6 +
|
|
317
|
+
kto[5] * 5 +
|
|
318
|
+
kto[6] * 4 +
|
|
319
|
+
kto[7] * 3 +
|
|
320
|
+
kto[8] * 2
|
|
321
|
+
pz %= 11
|
|
322
|
+
if pz <= 1
|
|
323
|
+
pz = 0
|
|
324
|
+
else
|
|
325
|
+
pz = 11 - pz
|
|
326
|
+
end
|
|
327
|
+
# CHECK_PZ10
|
|
328
|
+
if rv
|
|
329
|
+
rv.pz_pos = 10
|
|
330
|
+
rv.pz = pz
|
|
331
|
+
end
|
|
332
|
+
kto[9] == pz ? OK : FALSE
|
|
333
|
+
end
|
|
334
|
+
|
|
335
|
+
# Methode 53b (Konto-Nr. des ESER-Altsystems generieren und prüfen)
|
|
336
|
+
def m2053(kto, blz, um, rv)
|
|
337
|
+
if rv
|
|
338
|
+
rv.methode = "53b"
|
|
339
|
+
rv.pz_methode = 2053
|
|
340
|
+
end
|
|
341
|
+
if blz.nil?
|
|
342
|
+
ok = OK_TEST_BLZ_USED
|
|
343
|
+
blz = "16052072"
|
|
344
|
+
else
|
|
345
|
+
ok = OK
|
|
346
|
+
end
|
|
347
|
+
|
|
348
|
+
# Generieren der Konto-Nr. des ESER-Altsystems; die Kto-Nr. muß
|
|
349
|
+
# neunstellig sein
|
|
350
|
+
if kto[0] != 0 || kto[1] == 0
|
|
351
|
+
rv.pz = -2 if rv
|
|
352
|
+
return INVALID_KTO
|
|
353
|
+
end
|
|
354
|
+
kto_alt = Array.new(6, 0)
|
|
355
|
+
kto_alt[0] = blz[4].to_i
|
|
356
|
+
kto_alt[1] = blz[5].to_i
|
|
357
|
+
kto_alt[2] = kto[2] # T-Ziffer
|
|
358
|
+
kto_alt[3] = blz[7].to_i
|
|
359
|
+
kto_alt[4] = kto[1]
|
|
360
|
+
kto_alt[5] = kto[3]
|
|
361
|
+
ptr = 4
|
|
362
|
+
ptr += 1 while ptr < 10 && kto[ptr] == 0
|
|
363
|
+
while ptr < 10
|
|
364
|
+
kto_alt << kto[ptr]
|
|
365
|
+
ptr += 1
|
|
366
|
+
end
|
|
367
|
+
|
|
368
|
+
p1 = kto_alt[5] # Prüfziffer merken
|
|
369
|
+
kto_alt[5] = 0
|
|
370
|
+
pz = 0
|
|
371
|
+
i = 0
|
|
372
|
+
j = kto_alt.length - 1
|
|
373
|
+
while j >= 0
|
|
374
|
+
pz += kto_alt[j] * W52[i]
|
|
375
|
+
j -= 1
|
|
376
|
+
i += 1
|
|
377
|
+
end
|
|
378
|
+
kto_alt[5] = p1 # Prüfziffer zurückschreiben
|
|
379
|
+
pz %= 11
|
|
380
|
+
p1 = W52[i - 6]
|
|
381
|
+
|
|
382
|
+
# passenden Faktor suchen
|
|
383
|
+
tmp = pz
|
|
384
|
+
i = 0
|
|
385
|
+
while i < 10
|
|
386
|
+
pz = tmp + p1 * i
|
|
387
|
+
pz %= 11
|
|
388
|
+
break if pz == 10
|
|
389
|
+
i += 1
|
|
390
|
+
end
|
|
391
|
+
pz = i # Prüfziffer ist der verwendete Faktor des Gewichtes
|
|
392
|
+
rv.pz = pz if rv
|
|
393
|
+
# INVALID_PZ10
|
|
394
|
+
if rv
|
|
395
|
+
rv.pz_pos = 10
|
|
396
|
+
rv.pz = pz
|
|
397
|
+
end
|
|
398
|
+
return INVALID_KTO if pz == 10
|
|
399
|
+
kto_alt[5] == pz ? ok : FALSE
|
|
400
|
+
end
|
|
401
|
+
|
|
402
|
+
# Methode 54
|
|
403
|
+
# Modulus 11, Gewichtung 2,7,6,5,4,3,2. Die Kontonummer muß mit 49
|
|
404
|
+
# beginnen.
|
|
405
|
+
def m54(kto, blz, um, rv)
|
|
406
|
+
if rv
|
|
407
|
+
rv.methode = "54"
|
|
408
|
+
rv.pz_methode = 54
|
|
409
|
+
end
|
|
410
|
+
return INVALID_KTO if kto[0] != 4 && kto[1] != 9
|
|
411
|
+
pz = kto[2] * 2 +
|
|
412
|
+
kto[3] * 7 +
|
|
413
|
+
kto[4] * 6 +
|
|
414
|
+
kto[5] * 5 +
|
|
415
|
+
kto[6] * 4 +
|
|
416
|
+
kto[7] * 3 +
|
|
417
|
+
kto[8] * 2
|
|
418
|
+
pz %= 11
|
|
419
|
+
pz = 11 - pz
|
|
420
|
+
return INVALID_KTO if pz > 9
|
|
421
|
+
# CHECK_PZ10
|
|
422
|
+
if rv
|
|
423
|
+
rv.pz_pos = 10
|
|
424
|
+
rv.pz = pz
|
|
425
|
+
end
|
|
426
|
+
kto[9] == pz ? OK : FALSE
|
|
427
|
+
end
|
|
428
|
+
|
|
429
|
+
# Methode 55
|
|
430
|
+
# Modulus 11, Gewichtung 8,7,8,7,6,5,4,3,2
|
|
431
|
+
def m55(kto, blz, um, rv)
|
|
432
|
+
if rv
|
|
433
|
+
rv.methode = "55"
|
|
434
|
+
rv.pz_methode = 55
|
|
435
|
+
end
|
|
436
|
+
pz = kto[0] * 8 +
|
|
437
|
+
kto[1] * 7 +
|
|
438
|
+
kto[2] * 8 +
|
|
439
|
+
kto[3] * 7 +
|
|
440
|
+
kto[4] * 6 +
|
|
441
|
+
kto[5] * 5 +
|
|
442
|
+
kto[6] * 4 +
|
|
443
|
+
kto[7] * 3 +
|
|
444
|
+
kto[8] * 2
|
|
445
|
+
pz %= 11
|
|
446
|
+
if pz <= 1
|
|
447
|
+
pz = 0
|
|
448
|
+
else
|
|
449
|
+
pz = 11 - pz
|
|
450
|
+
end
|
|
451
|
+
# CHECK_PZ10
|
|
452
|
+
if rv
|
|
453
|
+
rv.pz_pos = 10
|
|
454
|
+
rv.pz = pz
|
|
455
|
+
end
|
|
456
|
+
kto[9] == pz ? OK : FALSE
|
|
457
|
+
end
|
|
458
|
+
|
|
459
|
+
# Methode 56
|
|
460
|
+
# Modulus 11, Gewichtung 4,3,2,7,6,5,4,3,2; Sonderfall für Konten, die
|
|
461
|
+
# mit 9 beginnen (Prüfziffer 7 bzw. 8).
|
|
462
|
+
def m56(kto, blz, um, rv)
|
|
463
|
+
if rv
|
|
464
|
+
rv.methode = "56"
|
|
465
|
+
rv.pz_methode = 56
|
|
466
|
+
end
|
|
467
|
+
pz = kto[0] * 4 +
|
|
468
|
+
kto[1] * 3 +
|
|
469
|
+
kto[2] * 2 +
|
|
470
|
+
kto[3] * 7 +
|
|
471
|
+
kto[4] * 6 +
|
|
472
|
+
kto[5] * 5 +
|
|
473
|
+
kto[6] * 4 +
|
|
474
|
+
kto[7] * 3 +
|
|
475
|
+
kto[8] * 2
|
|
476
|
+
pz %= 11
|
|
477
|
+
pz = 11 - pz
|
|
478
|
+
if pz > 9
|
|
479
|
+
if kto[0] == 9
|
|
480
|
+
if pz == 10
|
|
481
|
+
pz = 7
|
|
482
|
+
else
|
|
483
|
+
pz = 8
|
|
484
|
+
end
|
|
485
|
+
else
|
|
486
|
+
return INVALID_KTO
|
|
487
|
+
end
|
|
488
|
+
end
|
|
489
|
+
# CHECK_PZ10
|
|
490
|
+
if rv
|
|
491
|
+
rv.pz_pos = 10
|
|
492
|
+
rv.pz = pz
|
|
493
|
+
end
|
|
494
|
+
kto[9] == pz ? OK : FALSE
|
|
495
|
+
end
|
|
496
|
+
|
|
497
|
+
# Methode 57
|
|
498
|
+
# Die Untermethoden werden anhand der ersten beiden Stellen der
|
|
499
|
+
# Kontonummer ausgewählt (eigener innerer switch in C).
|
|
500
|
+
def m57(kto, blz, um, rv)
|
|
501
|
+
m1057(kto, blz, um, rv)
|
|
502
|
+
end
|
|
503
|
+
|
|
504
|
+
# Erste beide Stellen -> Variante 1 (57a, Modulus 10 Luhn auf Stellen 1-9)
|
|
505
|
+
M57_VAR1 = [51, 55, 61, 64, 65, 66, 70, 73, 74, 75, 76, 77, 78, 79,
|
|
506
|
+
80, 81, 82, 88, 94, 95].freeze
|
|
507
|
+
# Variante 2 (57b, Modulus 10 Luhn auf Stellen 1,4-10)
|
|
508
|
+
M57_VAR2 = [32, 33, 34, 35, 36, 37, 38, 39, 41, 42, 43, 44, 45, 46, 47,
|
|
509
|
+
48, 49, 52, 53, 54, 56, 57, 58, 59, 60, 62, 63, 67, 68, 69,
|
|
510
|
+
71, 72, 83, 84, 85, 86, 87, 89, 90, 92, 93, 96, 97, 98].freeze
|
|
511
|
+
# Variante 3 (57c, keine Prüfziffer)
|
|
512
|
+
M57_VAR3 = [40, 50, 91, 99].freeze
|
|
513
|
+
|
|
514
|
+
def m1057(kto, blz, um, rv)
|
|
515
|
+
if rv
|
|
516
|
+
rv.methode = "57"
|
|
517
|
+
rv.pz_methode = 57
|
|
518
|
+
end
|
|
519
|
+
# erstmal die Sonderfälle abhaken
|
|
520
|
+
if kto[0, 6] == [7, 7, 7, 7, 7, 7] || kto[0, 6] == [8, 8, 8, 8, 8, 8]
|
|
521
|
+
if rv
|
|
522
|
+
rv.methode = "57a"
|
|
523
|
+
rv.pz_methode = 1057
|
|
524
|
+
end
|
|
525
|
+
return OK_NO_CHK
|
|
526
|
+
end
|
|
527
|
+
if kto == [0, 1, 8, 5, 1, 2, 5, 4, 3, 4]
|
|
528
|
+
if rv
|
|
529
|
+
rv.methode = "57d"
|
|
530
|
+
rv.pz_methode = 4057
|
|
531
|
+
end
|
|
532
|
+
return OK_NO_CHK
|
|
533
|
+
end
|
|
534
|
+
|
|
535
|
+
tmp = kto[0] * 10 + kto[1] # die ersten beiden Stellen als Integer
|
|
536
|
+
if M57_VAR1.include?(tmp) # Variante 1
|
|
537
|
+
if rv
|
|
538
|
+
rv.methode = "57a"
|
|
539
|
+
rv.pz_methode = 1057
|
|
540
|
+
end
|
|
541
|
+
pz = kto[0] + kto[2] + kto[4] + kto[6] + kto[8]
|
|
542
|
+
if kto[1] < 5 then pz += kto[1] * 2 else pz += kto[1] * 2 - 9 end
|
|
543
|
+
if kto[3] < 5 then pz += kto[3] * 2 else pz += kto[3] * 2 - 9 end
|
|
544
|
+
if kto[5] < 5 then pz += kto[5] * 2 else pz += kto[5] * 2 - 9 end
|
|
545
|
+
if kto[7] < 5 then pz += kto[7] * 2 else pz += kto[7] * 2 - 9 end
|
|
546
|
+
pz %= 10
|
|
547
|
+
pz = 10 - pz if pz != 0
|
|
548
|
+
# CHECK_PZ10
|
|
549
|
+
if rv
|
|
550
|
+
rv.pz_pos = 10
|
|
551
|
+
rv.pz = pz
|
|
552
|
+
end
|
|
553
|
+
kto[9] == pz ? OK : FALSE
|
|
554
|
+
elsif M57_VAR2.include?(tmp) # Variante 2
|
|
555
|
+
if rv
|
|
556
|
+
rv.methode = "57b"
|
|
557
|
+
rv.pz_methode = 2057
|
|
558
|
+
end
|
|
559
|
+
pz = kto[0] + kto[3] + kto[5] + kto[7] + kto[9]
|
|
560
|
+
if kto[1] < 5 then pz += kto[1] * 2 else pz += kto[1] * 2 - 9 end
|
|
561
|
+
if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
|
|
562
|
+
if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
|
|
563
|
+
if kto[8] < 5 then pz += kto[8] * 2 else pz += kto[8] * 2 - 9 end
|
|
564
|
+
pz %= 10
|
|
565
|
+
pz = 10 - pz if pz != 0
|
|
566
|
+
# CHECK_PZ3
|
|
567
|
+
if rv
|
|
568
|
+
rv.pz_pos = 3
|
|
569
|
+
rv.pz = pz
|
|
570
|
+
end
|
|
571
|
+
kto[2] == pz ? OK : FALSE
|
|
572
|
+
elsif M57_VAR3.include?(tmp) # Variante 3
|
|
573
|
+
if rv
|
|
574
|
+
rv.methode = "57c"
|
|
575
|
+
rv.pz_methode = 3057
|
|
576
|
+
end
|
|
577
|
+
OK_NO_CHK
|
|
578
|
+
else # Variante 4: keine Prüfziffer, nur Plausibilitätsprüfung
|
|
579
|
+
if rv
|
|
580
|
+
rv.methode = "57d"
|
|
581
|
+
rv.pz_methode = 4057
|
|
582
|
+
end
|
|
583
|
+
return INVALID_KTO if tmp == 0 # Kontonummern müssen mit 01 bis 31 beginnen
|
|
584
|
+
tmp = kto[2] * 10 + kto[3]
|
|
585
|
+
return INVALID_KTO if tmp == 0 || tmp > 12
|
|
586
|
+
tmp = kto[6] * 100 + kto[7] * 10 + kto[8]
|
|
587
|
+
return INVALID_KTO if tmp >= 500
|
|
588
|
+
OK_NO_CHK
|
|
589
|
+
end
|
|
590
|
+
end
|
|
591
|
+
|
|
592
|
+
def m2057(kto, blz, um, rv)
|
|
593
|
+
m1057(kto, blz, um, rv)
|
|
594
|
+
end
|
|
595
|
+
|
|
596
|
+
def m3057(kto, blz, um, rv)
|
|
597
|
+
m1057(kto, blz, um, rv)
|
|
598
|
+
end
|
|
599
|
+
|
|
600
|
+
def m4057(kto, blz, um, rv)
|
|
601
|
+
m1057(kto, blz, um, rv)
|
|
602
|
+
end
|
|
603
|
+
|
|
604
|
+
# Methode 58
|
|
605
|
+
# Modulus 11, Gewichtung 6,5,4,3,2
|
|
606
|
+
def m58(kto, blz, um, rv)
|
|
607
|
+
if rv
|
|
608
|
+
rv.methode = "58"
|
|
609
|
+
rv.pz_methode = 58
|
|
610
|
+
end
|
|
611
|
+
if kto[0] == 0 && kto[1] == 0 && kto[2] == 0 && kto[3] == 0 && kto[4] == 0
|
|
612
|
+
return INVALID_KTO
|
|
613
|
+
end
|
|
614
|
+
pz = kto[4] * 6 +
|
|
615
|
+
kto[5] * 5 +
|
|
616
|
+
kto[6] * 4 +
|
|
617
|
+
kto[7] * 3 +
|
|
618
|
+
kto[8] * 2
|
|
619
|
+
pz %= 11
|
|
620
|
+
pz = 11 - pz if pz != 0
|
|
621
|
+
# INVALID_PZ10
|
|
622
|
+
if rv
|
|
623
|
+
rv.pz_pos = 10
|
|
624
|
+
rv.pz = pz
|
|
625
|
+
end
|
|
626
|
+
return INVALID_KTO if pz == 10
|
|
627
|
+
# CHECK_PZ10
|
|
628
|
+
if rv
|
|
629
|
+
rv.pz_pos = 10
|
|
630
|
+
rv.pz = pz
|
|
631
|
+
end
|
|
632
|
+
kto[9] == pz ? OK : FALSE
|
|
633
|
+
end
|
|
634
|
+
|
|
635
|
+
# Methode 59
|
|
636
|
+
# Modulus 10, Gewichtung 2,1,2,1,2,1,2,1,2; Konten mit weniger als
|
|
637
|
+
# 9 Stellen (führende 00) werden nicht geprüft.
|
|
638
|
+
def m59(kto, blz, um, rv)
|
|
639
|
+
if rv
|
|
640
|
+
rv.methode = "59"
|
|
641
|
+
rv.pz_methode = 59
|
|
642
|
+
end
|
|
643
|
+
return OK_NO_CHK if kto[0] == 0 && kto[1] == 0
|
|
644
|
+
pz = kto[1] + kto[3] + kto[5] + kto[7]
|
|
645
|
+
if kto[0] < 5 then pz += kto[0] * 2 else pz += kto[0] * 2 - 9 end
|
|
646
|
+
if kto[2] < 5 then pz += kto[2] * 2 else pz += kto[2] * 2 - 9 end
|
|
647
|
+
if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
|
|
648
|
+
if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
|
|
649
|
+
if kto[8] < 5 then pz += kto[8] * 2 else pz += kto[8] * 2 - 9 end
|
|
650
|
+
pz %= 10
|
|
651
|
+
pz = 10 - pz if pz != 0
|
|
652
|
+
# CHECK_PZ10
|
|
653
|
+
if rv
|
|
654
|
+
rv.pz_pos = 10
|
|
655
|
+
rv.pz = pz
|
|
656
|
+
end
|
|
657
|
+
kto[9] == pz ? OK : FALSE
|
|
658
|
+
end
|
|
659
|
+
|
|
660
|
+
# Methode 60
|
|
661
|
+
# Modulus 10, Gewichtung 2,1,2,1,2,1,2 (Stellen 3 bis 9)
|
|
662
|
+
def m60(kto, blz, um, rv)
|
|
663
|
+
if rv
|
|
664
|
+
rv.methode = "60"
|
|
665
|
+
rv.pz_methode = 60
|
|
666
|
+
end
|
|
667
|
+
pz = kto[3] + kto[5] + kto[7]
|
|
668
|
+
if kto[2] < 5 then pz += kto[2] * 2 else pz += kto[2] * 2 - 9 end
|
|
669
|
+
if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
|
|
670
|
+
if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
|
|
671
|
+
if kto[8] < 5 then pz += kto[8] * 2 else pz += kto[8] * 2 - 9 end
|
|
672
|
+
pz %= 10
|
|
673
|
+
pz = 10 - pz if pz != 0
|
|
674
|
+
# CHECK_PZ10
|
|
675
|
+
if rv
|
|
676
|
+
rv.pz_pos = 10
|
|
677
|
+
rv.pz = pz
|
|
678
|
+
end
|
|
679
|
+
kto[9] == pz ? OK : FALSE
|
|
680
|
+
end
|
|
681
|
+
|
|
682
|
+
# Methode 61
|
|
683
|
+
# Modulus 10, Gewichtung 2,1,2,1,2,1,2; Prüfziffer ist die 8. Stelle.
|
|
684
|
+
# Ist die 9. Stelle eine 8, werden die Stellen 9 und 10 einbezogen.
|
|
685
|
+
def m61(kto, blz, um, rv)
|
|
686
|
+
if kto[8] == 8
|
|
687
|
+
return m2061(kto, blz, um, rv)
|
|
688
|
+
end
|
|
689
|
+
m1061(kto, blz, um, rv)
|
|
690
|
+
end
|
|
691
|
+
|
|
692
|
+
# Methode 61b (mit Einbeziehung der Stellen 9 und 10)
|
|
693
|
+
def m2061(kto, blz, um, rv)
|
|
694
|
+
if rv
|
|
695
|
+
rv.methode = "61b"
|
|
696
|
+
rv.pz_methode = 2061
|
|
697
|
+
end
|
|
698
|
+
pz = kto[1] + kto[3] + kto[5] + kto[8]
|
|
699
|
+
if kto[0] < 5 then pz += kto[0] * 2 else pz += kto[0] * 2 - 9 end
|
|
700
|
+
if kto[2] < 5 then pz += kto[2] * 2 else pz += kto[2] * 2 - 9 end
|
|
701
|
+
if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
|
|
702
|
+
if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
|
|
703
|
+
if kto[9] < 5 then pz += kto[9] * 2 else pz += kto[9] * 2 - 9 end
|
|
704
|
+
pz %= 10
|
|
705
|
+
pz = 10 - pz if pz != 0
|
|
706
|
+
# CHECK_PZ8
|
|
707
|
+
if rv
|
|
708
|
+
rv.pz_pos = 8
|
|
709
|
+
rv.pz = pz
|
|
710
|
+
end
|
|
711
|
+
kto[7] == pz ? OK : FALSE
|
|
712
|
+
end
|
|
713
|
+
|
|
714
|
+
# Methode 61a (ohne Stellen 9 und 10)
|
|
715
|
+
def m1061(kto, blz, um, rv)
|
|
716
|
+
if rv
|
|
717
|
+
rv.methode = "61a"
|
|
718
|
+
rv.pz_methode = 1061
|
|
719
|
+
end
|
|
720
|
+
pz = kto[1] + kto[3] + kto[5]
|
|
721
|
+
if kto[0] < 5 then pz += kto[0] * 2 else pz += kto[0] * 2 - 9 end
|
|
722
|
+
if kto[2] < 5 then pz += kto[2] * 2 else pz += kto[2] * 2 - 9 end
|
|
723
|
+
if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
|
|
724
|
+
if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
|
|
725
|
+
pz %= 10
|
|
726
|
+
pz = 10 - pz if pz != 0
|
|
727
|
+
# CHECK_PZ8
|
|
728
|
+
if rv
|
|
729
|
+
rv.pz_pos = 8
|
|
730
|
+
rv.pz = pz
|
|
731
|
+
end
|
|
732
|
+
kto[7] == pz ? OK : FALSE
|
|
733
|
+
end
|
|
734
|
+
|
|
735
|
+
# Methode 62
|
|
736
|
+
# Modulus 10, Gewichtung 2,1,2,1 (Stellen 3 bis 6), Prüfziffer Stelle 8
|
|
737
|
+
def m62(kto, blz, um, rv)
|
|
738
|
+
if rv
|
|
739
|
+
rv.methode = "62"
|
|
740
|
+
rv.pz_methode = 62
|
|
741
|
+
end
|
|
742
|
+
pz = kto[3] + kto[5]
|
|
743
|
+
if kto[2] < 5 then pz += kto[2] * 2 else pz += kto[2] * 2 - 9 end
|
|
744
|
+
if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
|
|
745
|
+
if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
|
|
746
|
+
pz %= 10
|
|
747
|
+
pz = 10 - pz if pz != 0
|
|
748
|
+
# CHECK_PZ8
|
|
749
|
+
if rv
|
|
750
|
+
rv.pz_pos = 8
|
|
751
|
+
rv.pz = pz
|
|
752
|
+
end
|
|
753
|
+
kto[7] == pz ? OK : FALSE
|
|
754
|
+
end
|
|
755
|
+
|
|
756
|
+
# Methode 63
|
|
757
|
+
# Modulus 10, Gewichtung 2,1,2,1,2,1; Prüfziffer Stelle 8. Falls die
|
|
758
|
+
# Stellen 2 und 3 Null sind, wurde evl. ein Unterkonto weggelassen;
|
|
759
|
+
# dann wird zuerst die verschobene Variante getestet.
|
|
760
|
+
def m63(kto, blz, um, rv)
|
|
761
|
+
if kto[1] == 0 && kto[2] == 0 # Unterkonto weggelassen
|
|
762
|
+
return m2063(kto, blz, um, rv)
|
|
763
|
+
end
|
|
764
|
+
m1063(kto, blz, um, rv)
|
|
765
|
+
end
|
|
766
|
+
|
|
767
|
+
# Methode 63b (Unterkonto weggelassen, Prüfziffer Stelle 10)
|
|
768
|
+
def m2063(kto, blz, um, rv)
|
|
769
|
+
if rv
|
|
770
|
+
rv.methode = "63b"
|
|
771
|
+
rv.pz_methode = 2063
|
|
772
|
+
end
|
|
773
|
+
return INVALID_KTO if kto[0] != 0
|
|
774
|
+
pz = kto[3] + kto[5] + kto[7]
|
|
775
|
+
if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
|
|
776
|
+
if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
|
|
777
|
+
if kto[8] < 5 then pz += kto[8] * 2 else pz += kto[8] * 2 - 9 end
|
|
778
|
+
pz %= 10
|
|
779
|
+
pz = 10 - pz if pz != 0
|
|
780
|
+
# CHECK_PZX10
|
|
781
|
+
if rv
|
|
782
|
+
rv.pz_pos = 10
|
|
783
|
+
rv.pz = pz
|
|
784
|
+
end
|
|
785
|
+
return OK if kto[9] == pz
|
|
786
|
+
return FALSE if um != 0
|
|
787
|
+
m1063(kto, blz, um, rv)
|
|
788
|
+
end
|
|
789
|
+
|
|
790
|
+
# Methode 63a (Prüfziffer Stelle 8)
|
|
791
|
+
def m1063(kto, blz, um, rv)
|
|
792
|
+
if rv
|
|
793
|
+
rv.methode = "63a"
|
|
794
|
+
rv.pz_methode = 1063
|
|
795
|
+
end
|
|
796
|
+
return INVALID_KTO if kto[0] != 0
|
|
797
|
+
pz = kto[1] + kto[3] + kto[5]
|
|
798
|
+
if kto[2] < 5 then pz += kto[2] * 2 else pz += kto[2] * 2 - 9 end
|
|
799
|
+
if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
|
|
800
|
+
if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
|
|
801
|
+
pz %= 10
|
|
802
|
+
pz = 10 - pz if pz != 0
|
|
803
|
+
# CHECK_PZ8
|
|
804
|
+
if rv
|
|
805
|
+
rv.pz_pos = 8
|
|
806
|
+
rv.pz = pz
|
|
807
|
+
end
|
|
808
|
+
kto[7] == pz ? OK : FALSE
|
|
809
|
+
end
|
|
810
|
+
|
|
811
|
+
# Methode 64
|
|
812
|
+
# Modulus 11, Gewichtung 9,10,5,8,4,2; Prüfziffer Stelle 7
|
|
813
|
+
def m64(kto, blz, um, rv)
|
|
814
|
+
if rv
|
|
815
|
+
rv.methode = "64"
|
|
816
|
+
rv.pz_methode = 64
|
|
817
|
+
end
|
|
818
|
+
pz = kto[0] * 9 +
|
|
819
|
+
kto[1] * 10 +
|
|
820
|
+
kto[2] * 5 +
|
|
821
|
+
kto[3] * 8 +
|
|
822
|
+
kto[4] * 4 +
|
|
823
|
+
kto[5] * 2
|
|
824
|
+
pz %= 11
|
|
825
|
+
if pz <= 1
|
|
826
|
+
pz = 0
|
|
827
|
+
else
|
|
828
|
+
pz = 11 - pz
|
|
829
|
+
end
|
|
830
|
+
# CHECK_PZ7
|
|
831
|
+
if rv
|
|
832
|
+
rv.pz_pos = 7
|
|
833
|
+
rv.pz = pz
|
|
834
|
+
end
|
|
835
|
+
kto[6] == pz ? OK : FALSE
|
|
836
|
+
end
|
|
837
|
+
|
|
838
|
+
# Methode 65
|
|
839
|
+
# Modulus 10, Gewichtung 2,1,2,1,2,1,2; Prüfziffer Stelle 8. Ist die
|
|
840
|
+
# 9. Stelle eine 9, wird die 10. Stelle (Unterkonto) mit einbezogen.
|
|
841
|
+
def m65(kto, blz, um, rv)
|
|
842
|
+
if rv
|
|
843
|
+
rv.methode = "65"
|
|
844
|
+
rv.pz_methode = 65
|
|
845
|
+
end
|
|
846
|
+
pz = kto[1] + kto[3] + kto[5]
|
|
847
|
+
if kto[0] < 5 then pz += kto[0] * 2 else pz += kto[0] * 2 - 9 end
|
|
848
|
+
if kto[2] < 5 then pz += kto[2] * 2 else pz += kto[2] * 2 - 9 end
|
|
849
|
+
if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
|
|
850
|
+
if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
|
|
851
|
+
pz %= 10
|
|
852
|
+
if kto[8] == 9
|
|
853
|
+
p1 = kto[9] * 2
|
|
854
|
+
p1 -= 9 if p1 > 9
|
|
855
|
+
pz += p1 + 9
|
|
856
|
+
end
|
|
857
|
+
pz %= 10
|
|
858
|
+
pz = 10 - pz if pz != 0
|
|
859
|
+
# CHECK_PZ8
|
|
860
|
+
if rv
|
|
861
|
+
rv.pz_pos = 8
|
|
862
|
+
rv.pz = pz
|
|
863
|
+
end
|
|
864
|
+
kto[7] == pz ? OK : FALSE
|
|
865
|
+
end
|
|
866
|
+
|
|
867
|
+
# Methode 66
|
|
868
|
+
# Modulus 11, Gewichtung 7,0,0,6,5,4,3,2; Konten mit 9 an 2. Stelle
|
|
869
|
+
# haben keine Prüfziffer.
|
|
870
|
+
def m66(kto, blz, um, rv)
|
|
871
|
+
m2066(kto, blz, um, rv)
|
|
872
|
+
end
|
|
873
|
+
|
|
874
|
+
# Methode 66b (Konten mit 9 an der 2. Stelle: keine Prüfziffer)
|
|
875
|
+
def m2066(kto, blz, um, rv)
|
|
876
|
+
if rv
|
|
877
|
+
rv.methode = "66b"
|
|
878
|
+
rv.pz_methode = 2066
|
|
879
|
+
end
|
|
880
|
+
return OK_NO_CHK if kto[1] == 9
|
|
881
|
+
m1066(kto, blz, um, rv)
|
|
882
|
+
end
|
|
883
|
+
|
|
884
|
+
# Methode 66a
|
|
885
|
+
def m1066(kto, blz, um, rv)
|
|
886
|
+
if rv
|
|
887
|
+
rv.methode = "66a"
|
|
888
|
+
rv.pz_methode = 1066
|
|
889
|
+
end
|
|
890
|
+
return INVALID_KTO if kto[0] != 0
|
|
891
|
+
pz = kto[1] * 7 +
|
|
892
|
+
kto[4] * 6 +
|
|
893
|
+
kto[5] * 5 +
|
|
894
|
+
kto[6] * 4 +
|
|
895
|
+
kto[7] * 3 +
|
|
896
|
+
kto[8] * 2
|
|
897
|
+
pz %= 11
|
|
898
|
+
if pz < 2
|
|
899
|
+
pz = 1 - pz
|
|
900
|
+
else
|
|
901
|
+
pz = 11 - pz
|
|
902
|
+
end
|
|
903
|
+
# CHECK_PZ10
|
|
904
|
+
if rv
|
|
905
|
+
rv.pz_pos = 10
|
|
906
|
+
rv.pz = pz
|
|
907
|
+
end
|
|
908
|
+
kto[9] == pz ? OK : FALSE
|
|
909
|
+
end
|
|
910
|
+
|
|
911
|
+
# Methode 67
|
|
912
|
+
# Modulus 10, Gewichtung 2,1,2,1,2,1,2; Prüfziffer Stelle 8
|
|
913
|
+
def m67(kto, blz, um, rv)
|
|
914
|
+
if rv
|
|
915
|
+
rv.methode = "67"
|
|
916
|
+
rv.pz_methode = 67
|
|
917
|
+
end
|
|
918
|
+
pz = kto[1] + kto[3] + kto[5]
|
|
919
|
+
if kto[0] < 5 then pz += kto[0] * 2 else pz += kto[0] * 2 - 9 end
|
|
920
|
+
if kto[2] < 5 then pz += kto[2] * 2 else pz += kto[2] * 2 - 9 end
|
|
921
|
+
if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
|
|
922
|
+
if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
|
|
923
|
+
pz %= 10
|
|
924
|
+
pz = 10 - pz if pz != 0
|
|
925
|
+
# CHECK_PZ8
|
|
926
|
+
if rv
|
|
927
|
+
rv.pz_pos = 8
|
|
928
|
+
rv.pz = pz
|
|
929
|
+
end
|
|
930
|
+
kto[7] == pz ? OK : FALSE
|
|
931
|
+
end
|
|
932
|
+
|
|
933
|
+
# Methode 68
|
|
934
|
+
# Modulus 10, Gewichtung 2,1,2,1,2,1,2,1,2. Konten mit 10 Stellen
|
|
935
|
+
# (4. Stelle 9) werden nach Variante a gerechnet, 6- bis 9-stellige
|
|
936
|
+
# Konten nach Variante b bzw. c; Konten mit 04 am Anfang haben keine
|
|
937
|
+
# Prüfziffer.
|
|
938
|
+
def m68(kto, blz, um, rv)
|
|
939
|
+
if rv
|
|
940
|
+
rv.methode = "68"
|
|
941
|
+
rv.pz_methode = 68
|
|
942
|
+
end
|
|
943
|
+
# die Kontonummer muß mindestens 6-stellig sein (ohne führende Nullen)
|
|
944
|
+
if kto[0] == 0 && kto[1] == 0 && kto[2] == 0 && kto[3] == 0 && kto[4] == 0
|
|
945
|
+
return INVALID_KTO
|
|
946
|
+
end
|
|
947
|
+
# Sonderfall: keine Prüfziffer
|
|
948
|
+
return OK_NO_CHK if kto[0] == 0 && kto[1] == 4
|
|
949
|
+
m1068(kto, blz, um, rv)
|
|
950
|
+
end
|
|
951
|
+
|
|
952
|
+
# Methode 68a (10stellige Kontonummern)
|
|
953
|
+
def m1068(kto, blz, um, rv)
|
|
954
|
+
if rv
|
|
955
|
+
rv.methode = "68a"
|
|
956
|
+
rv.pz_methode = 1068
|
|
957
|
+
end
|
|
958
|
+
if kto[0] != 0
|
|
959
|
+
return INVALID_KTO if kto[3] != 9
|
|
960
|
+
pz = 9 + kto[5] + kto[7]
|
|
961
|
+
if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
|
|
962
|
+
if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
|
|
963
|
+
if kto[8] < 5 then pz += kto[8] * 2 else pz += kto[8] * 2 - 9 end
|
|
964
|
+
pz %= 10
|
|
965
|
+
pz = 10 - pz if pz != 0
|
|
966
|
+
# CHECK_PZ10
|
|
967
|
+
if rv
|
|
968
|
+
rv.pz_pos = 10
|
|
969
|
+
rv.pz = pz
|
|
970
|
+
end
|
|
971
|
+
return kto[9] == pz ? OK : FALSE
|
|
972
|
+
end
|
|
973
|
+
m2068(kto, blz, um, rv)
|
|
974
|
+
end
|
|
975
|
+
|
|
976
|
+
# Methode 68b (6 bis 9stellige Kontonummern, Variante 1)
|
|
977
|
+
def m2068(kto, blz, um, rv)
|
|
978
|
+
if rv
|
|
979
|
+
rv.methode = "68b"
|
|
980
|
+
rv.pz_methode = 2068
|
|
981
|
+
end
|
|
982
|
+
pz = kto[1] + kto[3] + kto[5] + kto[7]
|
|
983
|
+
if kto[2] < 5 then pz += kto[2] * 2 else pz += kto[2] * 2 - 9 end
|
|
984
|
+
if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
|
|
985
|
+
if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
|
|
986
|
+
if kto[8] < 5 then pz += kto[8] * 2 else pz += kto[8] * 2 - 9 end
|
|
987
|
+
pz %= 10
|
|
988
|
+
pz = 10 - pz if pz != 0
|
|
989
|
+
# CHECK_PZX10
|
|
990
|
+
if rv
|
|
991
|
+
rv.pz_pos = 10
|
|
992
|
+
rv.pz = pz
|
|
993
|
+
end
|
|
994
|
+
return OK if kto[9] == pz
|
|
995
|
+
return FALSE if um != 0
|
|
996
|
+
m3068(kto, blz, um, rv)
|
|
997
|
+
end
|
|
998
|
+
|
|
999
|
+
# Methode 68c (6 bis 9stellige Kontonummern, Variante 2)
|
|
1000
|
+
def m3068(kto, blz, um, rv)
|
|
1001
|
+
if rv
|
|
1002
|
+
rv.methode = "68c"
|
|
1003
|
+
rv.pz_methode = 3068
|
|
1004
|
+
end
|
|
1005
|
+
pz = kto[1] + kto[5] + kto[7]
|
|
1006
|
+
if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
|
|
1007
|
+
if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
|
|
1008
|
+
if kto[8] < 5 then pz += kto[8] * 2 else pz += kto[8] * 2 - 9 end
|
|
1009
|
+
pz %= 10
|
|
1010
|
+
pz = 10 - pz if pz != 0
|
|
1011
|
+
# CHECK_PZ10
|
|
1012
|
+
if rv
|
|
1013
|
+
rv.pz_pos = 10
|
|
1014
|
+
rv.pz = pz
|
|
1015
|
+
end
|
|
1016
|
+
kto[9] == pz ? OK : FALSE
|
|
1017
|
+
end
|
|
1018
|
+
|
|
1019
|
+
# Methode 69
|
|
1020
|
+
# Variante 1: Modulus 11, Gewichtung 8,7,6,5,4,3,2, Prüfziffer Stelle 8;
|
|
1021
|
+
# Variante 2: Verfahren 10H. Konten 93xxxxxxxx haben keine Prüfziffer,
|
|
1022
|
+
# Konten 97xxxxxxxx werden nur nach Variante 2 gerechnet.
|
|
1023
|
+
def m69(kto, blz, um, rv)
|
|
1024
|
+
if rv
|
|
1025
|
+
rv.methode = "69"
|
|
1026
|
+
rv.pz_methode = 69
|
|
1027
|
+
end
|
|
1028
|
+
# Sonderfall 93xxxxxxxx: Keine Prüfziffer
|
|
1029
|
+
return OK_NO_CHK if kto[0] == 9 && kto[1] == 3
|
|
1030
|
+
m1069(kto, blz, um, rv)
|
|
1031
|
+
end
|
|
1032
|
+
|
|
1033
|
+
# Methode 69a (Variante 1)
|
|
1034
|
+
def m1069(kto, blz, um, rv)
|
|
1035
|
+
if rv
|
|
1036
|
+
rv.methode = "69a"
|
|
1037
|
+
rv.pz_methode = 1069
|
|
1038
|
+
end
|
|
1039
|
+
# Sonderfall 97xxxxxxxx nur über Variante 2
|
|
1040
|
+
if kto[0] != 9 || kto[1] != 7
|
|
1041
|
+
pz = kto[0] * 8 +
|
|
1042
|
+
kto[1] * 7 +
|
|
1043
|
+
kto[2] * 6 +
|
|
1044
|
+
kto[3] * 5 +
|
|
1045
|
+
kto[4] * 4 +
|
|
1046
|
+
kto[5] * 3 +
|
|
1047
|
+
kto[6] * 2
|
|
1048
|
+
pz %= 11
|
|
1049
|
+
if pz <= 1
|
|
1050
|
+
pz = 0
|
|
1051
|
+
else
|
|
1052
|
+
pz = 11 - pz
|
|
1053
|
+
end
|
|
1054
|
+
# CHECK_PZX8
|
|
1055
|
+
if rv
|
|
1056
|
+
rv.pz_pos = 8
|
|
1057
|
+
rv.pz = pz
|
|
1058
|
+
end
|
|
1059
|
+
return OK if kto[7] == pz
|
|
1060
|
+
return FALSE if um != 0
|
|
1061
|
+
end
|
|
1062
|
+
m2069(kto, blz, um, rv)
|
|
1063
|
+
end
|
|
1064
|
+
|
|
1065
|
+
# Methode 69b (Variante 2, Verfahren 10H)
|
|
1066
|
+
def m2069(kto, blz, um, rv)
|
|
1067
|
+
if rv
|
|
1068
|
+
rv.methode = "69b"
|
|
1069
|
+
rv.pz_methode = 2069
|
|
1070
|
+
end
|
|
1071
|
+
pz = M10H_DIGITS[0][kto[0]] +
|
|
1072
|
+
M10H_DIGITS[3][kto[1]] +
|
|
1073
|
+
M10H_DIGITS[2][kto[2]] +
|
|
1074
|
+
M10H_DIGITS[1][kto[3]] +
|
|
1075
|
+
M10H_DIGITS[0][kto[4]] +
|
|
1076
|
+
M10H_DIGITS[3][kto[5]] +
|
|
1077
|
+
M10H_DIGITS[2][kto[6]] +
|
|
1078
|
+
M10H_DIGITS[1][kto[7]] +
|
|
1079
|
+
M10H_DIGITS[0][kto[8]]
|
|
1080
|
+
pz %= 10
|
|
1081
|
+
pz = 10 - pz if pz != 0
|
|
1082
|
+
# CHECK_PZ10
|
|
1083
|
+
if rv
|
|
1084
|
+
rv.pz_pos = 10
|
|
1085
|
+
rv.pz = pz
|
|
1086
|
+
end
|
|
1087
|
+
kto[9] == pz ? OK : FALSE
|
|
1088
|
+
end
|
|
1089
|
+
|
|
1090
|
+
# Methode 70
|
|
1091
|
+
# Modulus 11, Gewichtung 4,3,2,7,6,5,4,3,2; Sonderfälle für Konten mit
|
|
1092
|
+
# 5 bzw. 69 ab der 4. Stelle.
|
|
1093
|
+
def m70(kto, blz, um, rv)
|
|
1094
|
+
if rv
|
|
1095
|
+
rv.methode = "70"
|
|
1096
|
+
rv.pz_methode = 70
|
|
1097
|
+
end
|
|
1098
|
+
if kto[3] == 5
|
|
1099
|
+
pz = 5 * 7 +
|
|
1100
|
+
kto[4] * 6 +
|
|
1101
|
+
kto[5] * 5 +
|
|
1102
|
+
kto[6] * 4 +
|
|
1103
|
+
kto[7] * 3 +
|
|
1104
|
+
kto[8] * 2
|
|
1105
|
+
pz %= 11
|
|
1106
|
+
elsif kto[3] == 6 && kto[4] == 9
|
|
1107
|
+
pz = 6 * 7 +
|
|
1108
|
+
9 * 6 +
|
|
1109
|
+
kto[5] * 5 +
|
|
1110
|
+
kto[6] * 4 +
|
|
1111
|
+
kto[7] * 3 +
|
|
1112
|
+
kto[8] * 2
|
|
1113
|
+
pz %= 11
|
|
1114
|
+
else
|
|
1115
|
+
pz = kto[0] * 4 +
|
|
1116
|
+
kto[1] * 3 +
|
|
1117
|
+
kto[2] * 2 +
|
|
1118
|
+
kto[3] * 7 +
|
|
1119
|
+
kto[4] * 6 +
|
|
1120
|
+
kto[5] * 5 +
|
|
1121
|
+
kto[6] * 4 +
|
|
1122
|
+
kto[7] * 3 +
|
|
1123
|
+
kto[8] * 2
|
|
1124
|
+
pz %= 11
|
|
1125
|
+
end
|
|
1126
|
+
if pz <= 1
|
|
1127
|
+
pz = 0
|
|
1128
|
+
else
|
|
1129
|
+
pz = 11 - pz
|
|
1130
|
+
end
|
|
1131
|
+
# CHECK_PZ10
|
|
1132
|
+
if rv
|
|
1133
|
+
rv.pz_pos = 10
|
|
1134
|
+
rv.pz = pz
|
|
1135
|
+
end
|
|
1136
|
+
kto[9] == pz ? OK : FALSE
|
|
1137
|
+
end
|
|
1138
|
+
|
|
1139
|
+
# Methode 71
|
|
1140
|
+
# Modulus 11, Gewichtung 6,5,4,3,2,1 (Stellen 2 bis 7)
|
|
1141
|
+
def m71(kto, blz, um, rv)
|
|
1142
|
+
if rv
|
|
1143
|
+
rv.methode = "71"
|
|
1144
|
+
rv.pz_methode = 71
|
|
1145
|
+
end
|
|
1146
|
+
pz = kto[1] * 6 +
|
|
1147
|
+
kto[2] * 5 +
|
|
1148
|
+
kto[3] * 4 +
|
|
1149
|
+
kto[4] * 3 +
|
|
1150
|
+
kto[5] * 2 +
|
|
1151
|
+
kto[6]
|
|
1152
|
+
pz %= 11
|
|
1153
|
+
pz = 11 - pz if pz > 1
|
|
1154
|
+
# CHECK_PZ10
|
|
1155
|
+
if rv
|
|
1156
|
+
rv.pz_pos = 10
|
|
1157
|
+
rv.pz = pz
|
|
1158
|
+
end
|
|
1159
|
+
kto[9] == pz ? OK : FALSE
|
|
1160
|
+
end
|
|
1161
|
+
|
|
1162
|
+
# Methode 72
|
|
1163
|
+
# Modulus 10, Gewichtung 2,1,2,1,2,1 (Stellen 4 bis 9)
|
|
1164
|
+
def m72(kto, blz, um, rv)
|
|
1165
|
+
if rv
|
|
1166
|
+
rv.methode = "72"
|
|
1167
|
+
rv.pz_methode = 72
|
|
1168
|
+
end
|
|
1169
|
+
pz = kto[3] + kto[5] + kto[7]
|
|
1170
|
+
if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
|
|
1171
|
+
if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
|
|
1172
|
+
if kto[8] < 5 then pz += kto[8] * 2 else pz += kto[8] * 2 - 9 end
|
|
1173
|
+
pz %= 10
|
|
1174
|
+
pz = 10 - pz if pz != 0
|
|
1175
|
+
# CHECK_PZ10
|
|
1176
|
+
if rv
|
|
1177
|
+
rv.pz_pos = 10
|
|
1178
|
+
rv.pz = pz
|
|
1179
|
+
end
|
|
1180
|
+
kto[9] == pz ? OK : FALSE
|
|
1181
|
+
end
|
|
1182
|
+
|
|
1183
|
+
# Methode 73
|
|
1184
|
+
# Variante a: Modulus 10, Gewichtung 2,1,2,1,2,1 (Stellen 4 bis 9);
|
|
1185
|
+
# Variante b ohne Stelle 4, Variante c mit Modulus 7. Bei einer 9 an
|
|
1186
|
+
# der 3. Stelle wird wie bei Methode 51 gerechnet (Varianten d und e).
|
|
1187
|
+
def m73(kto, blz, um, rv)
|
|
1188
|
+
if kto[2] == 9 # Ausnahme, Berechnung wie in Verfahren 51
|
|
1189
|
+
return m4073(kto, blz, um, rv)
|
|
1190
|
+
end
|
|
1191
|
+
m1073(kto, blz, um, rv)
|
|
1192
|
+
end
|
|
1193
|
+
|
|
1194
|
+
# Methode 73d (Ausnahme, Variante 1)
|
|
1195
|
+
def m4073(kto, blz, um, rv)
|
|
1196
|
+
if rv
|
|
1197
|
+
rv.methode = "73d"
|
|
1198
|
+
rv.pz_methode = 4073
|
|
1199
|
+
end
|
|
1200
|
+
pz = 9 * 8 +
|
|
1201
|
+
kto[3] * 7 +
|
|
1202
|
+
kto[4] * 6 +
|
|
1203
|
+
kto[5] * 5 +
|
|
1204
|
+
kto[6] * 4 +
|
|
1205
|
+
kto[7] * 3 +
|
|
1206
|
+
kto[8] * 2
|
|
1207
|
+
pz %= 11
|
|
1208
|
+
if pz <= 1
|
|
1209
|
+
pz = 0
|
|
1210
|
+
else
|
|
1211
|
+
pz = 11 - pz
|
|
1212
|
+
end
|
|
1213
|
+
# CHECK_PZX10
|
|
1214
|
+
if rv
|
|
1215
|
+
rv.pz_pos = 10
|
|
1216
|
+
rv.pz = pz
|
|
1217
|
+
end
|
|
1218
|
+
return OK if kto[9] == pz
|
|
1219
|
+
return FALSE if um != 0
|
|
1220
|
+
m5073(kto, blz, um, rv)
|
|
1221
|
+
end
|
|
1222
|
+
|
|
1223
|
+
# Methode 73e (Ausnahme, Variante 2)
|
|
1224
|
+
def m5073(kto, blz, um, rv)
|
|
1225
|
+
if rv
|
|
1226
|
+
rv.methode = "73e"
|
|
1227
|
+
rv.pz_methode = 5073
|
|
1228
|
+
end
|
|
1229
|
+
pz = kto[0] * 10 +
|
|
1230
|
+
kto[1] * 9 +
|
|
1231
|
+
9 * 8 +
|
|
1232
|
+
kto[3] * 7 +
|
|
1233
|
+
kto[4] * 6 +
|
|
1234
|
+
kto[5] * 5 +
|
|
1235
|
+
kto[6] * 4 +
|
|
1236
|
+
kto[7] * 3 +
|
|
1237
|
+
kto[8] * 2
|
|
1238
|
+
pz %= 11
|
|
1239
|
+
if pz <= 1
|
|
1240
|
+
pz = 0
|
|
1241
|
+
else
|
|
1242
|
+
pz = 11 - pz
|
|
1243
|
+
end
|
|
1244
|
+
# CHECK_PZ10
|
|
1245
|
+
if rv
|
|
1246
|
+
rv.pz_pos = 10
|
|
1247
|
+
rv.pz = pz
|
|
1248
|
+
end
|
|
1249
|
+
kto[9] == pz ? OK : FALSE
|
|
1250
|
+
end
|
|
1251
|
+
|
|
1252
|
+
# Methode 73a
|
|
1253
|
+
def m1073(kto, blz, um, rv)
|
|
1254
|
+
if rv
|
|
1255
|
+
rv.methode = "73a"
|
|
1256
|
+
rv.pz_methode = 1073
|
|
1257
|
+
end
|
|
1258
|
+
pz1 = kto[5] + kto[7]
|
|
1259
|
+
if kto[4] < 5 then pz1 += kto[4] * 2 else pz1 += kto[4] * 2 - 9 end
|
|
1260
|
+
if kto[6] < 5 then pz1 += kto[6] * 2 else pz1 += kto[6] * 2 - 9 end
|
|
1261
|
+
if kto[8] < 5 then pz1 += kto[8] * 2 else pz1 += kto[8] * 2 - 9 end
|
|
1262
|
+
pz = pz1 + kto[3]
|
|
1263
|
+
pz %= 10
|
|
1264
|
+
pz = 10 - pz if pz != 0
|
|
1265
|
+
# CHECK_PZX10
|
|
1266
|
+
if rv
|
|
1267
|
+
rv.pz_pos = 10
|
|
1268
|
+
rv.pz = pz
|
|
1269
|
+
end
|
|
1270
|
+
return OK if kto[9] == pz
|
|
1271
|
+
return FALSE if um != 0
|
|
1272
|
+
m2073(kto, blz, um, rv)
|
|
1273
|
+
end
|
|
1274
|
+
|
|
1275
|
+
# Methode 73b
|
|
1276
|
+
def m2073(kto, blz, um, rv)
|
|
1277
|
+
if rv
|
|
1278
|
+
rv.methode = "73b"
|
|
1279
|
+
rv.pz_methode = 2073
|
|
1280
|
+
end
|
|
1281
|
+
pz = kto[5] + kto[7]
|
|
1282
|
+
if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
|
|
1283
|
+
if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
|
|
1284
|
+
if kto[8] < 5 then pz += kto[8] * 2 else pz += kto[8] * 2 - 9 end
|
|
1285
|
+
pz %= 10
|
|
1286
|
+
pz = 10 - pz if pz != 0
|
|
1287
|
+
# CHECK_PZX10
|
|
1288
|
+
if rv
|
|
1289
|
+
rv.pz_pos = 10
|
|
1290
|
+
rv.pz = pz
|
|
1291
|
+
end
|
|
1292
|
+
return OK if kto[9] == pz
|
|
1293
|
+
return FALSE if um != 0
|
|
1294
|
+
m3073(kto, blz, um, rv)
|
|
1295
|
+
end
|
|
1296
|
+
|
|
1297
|
+
# Methode 73c (Modulus 7)
|
|
1298
|
+
def m3073(kto, blz, um, rv)
|
|
1299
|
+
if rv
|
|
1300
|
+
rv.methode = "73c"
|
|
1301
|
+
rv.pz_methode = 3073
|
|
1302
|
+
end
|
|
1303
|
+
pz = kto[5] + kto[7]
|
|
1304
|
+
if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
|
|
1305
|
+
if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
|
|
1306
|
+
if kto[8] < 5 then pz += kto[8] * 2 else pz += kto[8] * 2 - 9 end
|
|
1307
|
+
pz %= 7
|
|
1308
|
+
pz = 7 - pz if pz != 0
|
|
1309
|
+
# CHECK_PZ10
|
|
1310
|
+
if rv
|
|
1311
|
+
rv.pz_pos = 10
|
|
1312
|
+
rv.pz = pz
|
|
1313
|
+
end
|
|
1314
|
+
kto[9] == pz ? OK : FALSE
|
|
1315
|
+
end
|
|
1316
|
+
|
|
1317
|
+
# Methode 74
|
|
1318
|
+
# Variante a: Modulus 10, Gewichtung 2,1,2,1,2,1,2,1,2; für 6-stellige
|
|
1319
|
+
# Kontonummern zusätzlich die Halbdekaden-Variante b; zum Schluß
|
|
1320
|
+
# Variante c (Modulus 11, Gewichtung 4,3,2,7,6,5,4,3,2).
|
|
1321
|
+
def m74(kto, blz, um, rv)
|
|
1322
|
+
if kto[0] == 0 && kto[1] == 0 && kto[2] == 0 && kto[3] == 0 && kto[4] == 0 &&
|
|
1323
|
+
kto[5] == 0 && kto[6] == 0 && kto[7] == 0 && kto[8] == 0
|
|
1324
|
+
return INVALID_KTO
|
|
1325
|
+
end
|
|
1326
|
+
m1074(kto, blz, um, rv)
|
|
1327
|
+
end
|
|
1328
|
+
|
|
1329
|
+
# Methode 74a
|
|
1330
|
+
def m1074(kto, blz, um, rv)
|
|
1331
|
+
if rv
|
|
1332
|
+
rv.methode = "74a"
|
|
1333
|
+
rv.pz_methode = 1074
|
|
1334
|
+
end
|
|
1335
|
+
pz = kto[1] + kto[3] + kto[5] + kto[7]
|
|
1336
|
+
if kto[0] < 5 then pz += kto[0] * 2 else pz += kto[0] * 2 - 9 end
|
|
1337
|
+
if kto[2] < 5 then pz += kto[2] * 2 else pz += kto[2] * 2 - 9 end
|
|
1338
|
+
if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
|
|
1339
|
+
if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
|
|
1340
|
+
if kto[8] < 5 then pz += kto[8] * 2 else pz += kto[8] * 2 - 9 end
|
|
1341
|
+
pz1 = pz # Summe merken für Fall b
|
|
1342
|
+
pz %= 10
|
|
1343
|
+
pz = 10 - pz if pz != 0
|
|
1344
|
+
# CHECK_PZX10
|
|
1345
|
+
if rv
|
|
1346
|
+
rv.pz_pos = 10
|
|
1347
|
+
rv.pz = pz
|
|
1348
|
+
end
|
|
1349
|
+
return OK if kto[9] == pz
|
|
1350
|
+
return FALSE if um != 0
|
|
1351
|
+
|
|
1352
|
+
if kto[0] == 0 && kto[1] == 0 && kto[2] == 0 && kto[3] == 0 && kto[4] != 0
|
|
1353
|
+
return m2074(kto, blz, um, rv, pz1)
|
|
1354
|
+
end
|
|
1355
|
+
m3074(kto, blz, um, rv)
|
|
1356
|
+
end
|
|
1357
|
+
|
|
1358
|
+
# Methode 74b (Hochrechnen auf die nächste Halbdekade)
|
|
1359
|
+
def m2074(kto, blz, um, rv, pz1 = 0)
|
|
1360
|
+
if rv
|
|
1361
|
+
rv.methode = "74b"
|
|
1362
|
+
rv.pz_methode = 2074
|
|
1363
|
+
end
|
|
1364
|
+
if um != 0
|
|
1365
|
+
# pz wurde noch nicht berechnet; jetzt erledigen
|
|
1366
|
+
pz1 = kto[5] + kto[7]
|
|
1367
|
+
if kto[4] < 5 then pz1 += kto[4] * 2 else pz1 += kto[4] * 2 - 9 end
|
|
1368
|
+
if kto[6] < 5 then pz1 += kto[6] * 2 else pz1 += kto[6] * 2 - 9 end
|
|
1369
|
+
if kto[8] < 5 then pz1 += kto[8] * 2 else pz1 += kto[8] * 2 - 9 end
|
|
1370
|
+
end
|
|
1371
|
+
pz = pz1
|
|
1372
|
+
if pz < 5
|
|
1373
|
+
pz += 5
|
|
1374
|
+
else
|
|
1375
|
+
pz -= 5
|
|
1376
|
+
end
|
|
1377
|
+
pz %= 10
|
|
1378
|
+
pz = 10 - pz if pz != 0
|
|
1379
|
+
# CHECK_PZ10
|
|
1380
|
+
if rv
|
|
1381
|
+
rv.pz_pos = 10
|
|
1382
|
+
rv.pz = pz
|
|
1383
|
+
end
|
|
1384
|
+
kto[9] == pz ? OK : FALSE
|
|
1385
|
+
end
|
|
1386
|
+
|
|
1387
|
+
# Methode 74c (Modulus 11, Gewichtung 4,3,2,7,6,5,4,3,2)
|
|
1388
|
+
def m3074(kto, blz, um, rv)
|
|
1389
|
+
if rv
|
|
1390
|
+
rv.methode = "74c"
|
|
1391
|
+
rv.pz_methode = 3074
|
|
1392
|
+
end
|
|
1393
|
+
pz = kto[0] * 4 +
|
|
1394
|
+
kto[1] * 3 +
|
|
1395
|
+
kto[2] * 2 +
|
|
1396
|
+
kto[3] * 7 +
|
|
1397
|
+
kto[4] * 6 +
|
|
1398
|
+
kto[5] * 5 +
|
|
1399
|
+
kto[6] * 4 +
|
|
1400
|
+
kto[7] * 3 +
|
|
1401
|
+
kto[8] * 2
|
|
1402
|
+
pz %= 11
|
|
1403
|
+
pz = 11 - pz if pz != 0
|
|
1404
|
+
# INVALID_PZ10
|
|
1405
|
+
if rv
|
|
1406
|
+
rv.pz_pos = 10
|
|
1407
|
+
rv.pz = pz
|
|
1408
|
+
end
|
|
1409
|
+
return INVALID_KTO if pz == 10
|
|
1410
|
+
# CHECK_PZ10
|
|
1411
|
+
if rv
|
|
1412
|
+
rv.pz_pos = 10
|
|
1413
|
+
rv.pz = pz
|
|
1414
|
+
end
|
|
1415
|
+
kto[9] == pz ? OK : FALSE
|
|
1416
|
+
end
|
|
1417
|
+
|
|
1418
|
+
# Methode 75
|
|
1419
|
+
# Modulus 10, Gewichtung 2,1,2,1,2; die Stellen und die Position der
|
|
1420
|
+
# Prüfziffer hängen von der Länge der Kontonummer ab.
|
|
1421
|
+
def m75(kto, blz, um, rv)
|
|
1422
|
+
if rv
|
|
1423
|
+
rv.methode = "75"
|
|
1424
|
+
rv.pz_methode = 75
|
|
1425
|
+
end
|
|
1426
|
+
return INVALID_KTO if kto[0] != 0 # 10-stellige Kontonummer
|
|
1427
|
+
if kto[0] == 0 && kto[1] == 0 # 6/7-stellige Kontonummer
|
|
1428
|
+
m1075(kto, blz, um, rv)
|
|
1429
|
+
elsif kto[1] == 9 # 9-stellige Kontonummer, Variante 2
|
|
1430
|
+
m2075(kto, blz, um, rv)
|
|
1431
|
+
else # 9-stellige Kontonummer, Variante 1
|
|
1432
|
+
m3075(kto, blz, um, rv)
|
|
1433
|
+
end
|
|
1434
|
+
end
|
|
1435
|
+
|
|
1436
|
+
# Methode 75a (6/7-stellige Kontonummern)
|
|
1437
|
+
def m1075(kto, blz, um, rv)
|
|
1438
|
+
if rv
|
|
1439
|
+
rv.methode = "75a"
|
|
1440
|
+
rv.pz_methode = 1075
|
|
1441
|
+
end
|
|
1442
|
+
# 8- oder <6-stellige Kontonummer
|
|
1443
|
+
if kto[2] != 0 || (kto[2] == 0 && kto[3] == 0 && kto[4] == 0)
|
|
1444
|
+
return INVALID_KTO
|
|
1445
|
+
end
|
|
1446
|
+
pz = kto[5] + kto[7]
|
|
1447
|
+
if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
|
|
1448
|
+
if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
|
|
1449
|
+
if kto[8] < 5 then pz += kto[8] * 2 else pz += kto[8] * 2 - 9 end
|
|
1450
|
+
pz %= 10
|
|
1451
|
+
pz = 10 - pz if pz != 0
|
|
1452
|
+
# CHECK_PZ10
|
|
1453
|
+
if rv
|
|
1454
|
+
rv.pz_pos = 10
|
|
1455
|
+
rv.pz = pz
|
|
1456
|
+
end
|
|
1457
|
+
kto[9] == pz ? OK : FALSE
|
|
1458
|
+
end
|
|
1459
|
+
|
|
1460
|
+
# Methode 75b (9-stellige Kontonummern, Variante 2)
|
|
1461
|
+
def m2075(kto, blz, um, rv)
|
|
1462
|
+
if rv
|
|
1463
|
+
rv.methode = "75b"
|
|
1464
|
+
rv.pz_methode = 2075
|
|
1465
|
+
end
|
|
1466
|
+
pz = kto[3] + kto[5]
|
|
1467
|
+
if kto[2] < 5 then pz += kto[2] * 2 else pz += kto[2] * 2 - 9 end
|
|
1468
|
+
if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
|
|
1469
|
+
if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
|
|
1470
|
+
pz %= 10
|
|
1471
|
+
pz = 10 - pz if pz != 0
|
|
1472
|
+
# CHECK_PZ8
|
|
1473
|
+
if rv
|
|
1474
|
+
rv.pz_pos = 8
|
|
1475
|
+
rv.pz = pz
|
|
1476
|
+
end
|
|
1477
|
+
kto[7] == pz ? OK : FALSE
|
|
1478
|
+
end
|
|
1479
|
+
|
|
1480
|
+
# Methode 75c (9-stellige Kontonummern, Variante 1)
|
|
1481
|
+
def m3075(kto, blz, um, rv)
|
|
1482
|
+
if rv
|
|
1483
|
+
rv.methode = "75c"
|
|
1484
|
+
rv.pz_methode = 3075
|
|
1485
|
+
end
|
|
1486
|
+
pz = kto[2] + kto[4]
|
|
1487
|
+
if kto[1] < 5 then pz += kto[1] * 2 else pz += kto[1] * 2 - 9 end
|
|
1488
|
+
if kto[3] < 5 then pz += kto[3] * 2 else pz += kto[3] * 2 - 9 end
|
|
1489
|
+
if kto[5] < 5 then pz += kto[5] * 2 else pz += kto[5] * 2 - 9 end
|
|
1490
|
+
pz %= 10
|
|
1491
|
+
pz = 10 - pz if pz != 0
|
|
1492
|
+
# CHECK_PZ7
|
|
1493
|
+
if rv
|
|
1494
|
+
rv.pz_pos = 7
|
|
1495
|
+
rv.pz = pz
|
|
1496
|
+
end
|
|
1497
|
+
kto[6] == pz ? OK : FALSE
|
|
1498
|
+
end
|
|
1499
|
+
|
|
1500
|
+
# Methode 76
|
|
1501
|
+
# Modulus 11, Gewichtung 7,6,5,4,3,2; die erste Stelle (Kontoart) muß
|
|
1502
|
+
# 0, 4, 6, 7, 8 oder 9 sein. Bei achtstelligen Konten wird zusätzlich
|
|
1503
|
+
# die um zwei Stellen verschobene Variante b getestet.
|
|
1504
|
+
def m76(kto, blz, um, rv)
|
|
1505
|
+
m1076(kto, blz, um, rv)
|
|
1506
|
+
end
|
|
1507
|
+
|
|
1508
|
+
# Methode 76a
|
|
1509
|
+
def m1076(kto, blz, um, rv)
|
|
1510
|
+
if rv
|
|
1511
|
+
rv.methode = "76a"
|
|
1512
|
+
rv.pz_methode = 1076
|
|
1513
|
+
end
|
|
1514
|
+
p1 = kto[0]
|
|
1515
|
+
if p1 == 1 || p1 == 2 || p1 == 3 || p1 == 5
|
|
1516
|
+
return INVALID_KTO
|
|
1517
|
+
end
|
|
1518
|
+
pz = kto[1] * 7 +
|
|
1519
|
+
kto[2] * 6 +
|
|
1520
|
+
kto[3] * 5 +
|
|
1521
|
+
kto[4] * 4 +
|
|
1522
|
+
kto[5] * 3 +
|
|
1523
|
+
kto[6] * 2
|
|
1524
|
+
pz %= 11
|
|
1525
|
+
# CHECK_PZX8
|
|
1526
|
+
if rv
|
|
1527
|
+
rv.pz_pos = 8
|
|
1528
|
+
rv.pz = pz
|
|
1529
|
+
end
|
|
1530
|
+
return OK if kto[7] == pz
|
|
1531
|
+
return FALSE if um != 0
|
|
1532
|
+
return FALSE if kto[0] != 0 || kto[1] != 0
|
|
1533
|
+
m2076(kto, blz, um, rv)
|
|
1534
|
+
end
|
|
1535
|
+
|
|
1536
|
+
# Methode 76b (Kontoart in Stelle 3)
|
|
1537
|
+
def m2076(kto, blz, um, rv)
|
|
1538
|
+
if rv
|
|
1539
|
+
rv.methode = "76b"
|
|
1540
|
+
rv.pz_methode = 2076
|
|
1541
|
+
end
|
|
1542
|
+
p1 = kto[2]
|
|
1543
|
+
if p1 == 1 || p1 == 2 || p1 == 3 || p1 == 5
|
|
1544
|
+
return INVALID_KTO
|
|
1545
|
+
end
|
|
1546
|
+
pz = kto[3] * 7 +
|
|
1547
|
+
kto[4] * 6 +
|
|
1548
|
+
kto[5] * 5 +
|
|
1549
|
+
kto[6] * 4 +
|
|
1550
|
+
kto[7] * 3 +
|
|
1551
|
+
kto[8] * 2
|
|
1552
|
+
pz %= 11
|
|
1553
|
+
return INVALID_KTO if pz == 10
|
|
1554
|
+
# CHECK_PZ10
|
|
1555
|
+
if rv
|
|
1556
|
+
rv.pz_pos = 10
|
|
1557
|
+
rv.pz = pz
|
|
1558
|
+
end
|
|
1559
|
+
kto[9] == pz ? OK : FALSE
|
|
1560
|
+
end
|
|
1561
|
+
|
|
1562
|
+
# Methode 77
|
|
1563
|
+
# Modulus 11, Gewichtung 5,4,3,2,1 bzw. 5,4,3,4,5 auf die Stellen 6
|
|
1564
|
+
# bis 10; es gibt keine eigentliche Prüfziffer, die Summe muß ohne
|
|
1565
|
+
# Rest durch 11 teilbar sein.
|
|
1566
|
+
def m77(kto, blz, um, rv)
|
|
1567
|
+
m1077(kto, blz, um, rv)
|
|
1568
|
+
end
|
|
1569
|
+
|
|
1570
|
+
# Methode 77a (Gewichtung 5,4,3,2,1)
|
|
1571
|
+
def m1077(kto, blz, um, rv)
|
|
1572
|
+
if rv
|
|
1573
|
+
rv.methode = "77a"
|
|
1574
|
+
rv.pz_methode = 1077
|
|
1575
|
+
end
|
|
1576
|
+
pz = kto[5] * 5 +
|
|
1577
|
+
kto[6] * 4 +
|
|
1578
|
+
kto[7] * 3 +
|
|
1579
|
+
kto[8] * 2 +
|
|
1580
|
+
kto[9]
|
|
1581
|
+
pz %= 11
|
|
1582
|
+
return OK if pz == 0
|
|
1583
|
+
return INVALID_KTO if um != 0
|
|
1584
|
+
m2077(kto, blz, um, rv)
|
|
1585
|
+
end
|
|
1586
|
+
|
|
1587
|
+
# Methode 77b (Gewichtung 5,4,3,4,5)
|
|
1588
|
+
def m2077(kto, blz, um, rv)
|
|
1589
|
+
if rv
|
|
1590
|
+
rv.methode = "77b"
|
|
1591
|
+
rv.pz_methode = 2077
|
|
1592
|
+
end
|
|
1593
|
+
pz = kto[5] * 5 +
|
|
1594
|
+
kto[6] * 4 +
|
|
1595
|
+
kto[7] * 3 +
|
|
1596
|
+
kto[8] * 4 +
|
|
1597
|
+
kto[9] * 5
|
|
1598
|
+
pz %= 11
|
|
1599
|
+
return OK if pz == 0
|
|
1600
|
+
return INVALID_KTO if um != 0
|
|
1601
|
+
FALSE
|
|
1602
|
+
end
|
|
1603
|
+
end
|
|
1604
|
+
end
|