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.
@@ -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