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,1905 @@
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 78
18
+ # Modulus 10, Gewichtung 2, 1, 2, 1, 2, 1, 2, 1, 2 (wie Methode 00).
19
+ # Ausnahme: 10-stellige Kontonummern, die mit 00 beginnen und deren
20
+ # 3. Stelle ungleich 0 ist, sind ohne Pruefziffer gueltig.
21
+ def m78(kto, blz, um, rv)
22
+ if rv
23
+ rv.methode = "78"
24
+ rv.pz_methode = 78
25
+ end
26
+ return OK_NO_CHK if kto[0] == 0 && kto[1] == 0 && kto[2] != 0
27
+
28
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
29
+ pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
30
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
31
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
32
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
33
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
34
+
35
+ pz %= 10
36
+ pz = 10 - pz if pz != 0
37
+ # CHECK_PZ10
38
+ if rv
39
+ rv.pz_pos = 10
40
+ rv.pz = pz
41
+ end
42
+ kto[9] == pz ? OK : FALSE
43
+ end
44
+
45
+ # Methode 79
46
+ # Modulus 10, Gewichtung 2, 1, 2, 1, 2, 1, 2, 1.
47
+ # Bei Kontonummern mit 1, 2 oder 9 an der 1. Stelle liegt die Pruefziffer
48
+ # an Stelle 9, sonst an Stelle 10. Die 1. Stelle darf nicht 0 sein.
49
+ def m79(kto, blz, um, rv)
50
+ if rv
51
+ rv.methode = "79"
52
+ rv.pz_methode = 79
53
+ end
54
+ return INVALID_KTO if kto[0] == 0
55
+
56
+ if kto[0] == 1 || kto[0] == 2 || kto[0] == 9
57
+ pz = kto[0] + kto[2] + kto[4] + kto[6]
58
+ pz += kto[1] < 5 ? kto[1] * 2 : kto[1] * 2 - 9
59
+ pz += kto[3] < 5 ? kto[3] * 2 : kto[3] * 2 - 9
60
+ pz += kto[5] < 5 ? kto[5] * 2 : kto[5] * 2 - 9
61
+ pz += kto[7] < 5 ? kto[7] * 2 : kto[7] * 2 - 9
62
+
63
+ pz %= 10
64
+ pz = 10 - pz if pz != 0
65
+ # CHECK_PZ9
66
+ if rv
67
+ rv.pz_pos = 9
68
+ rv.pz = pz
69
+ end
70
+ kto[8] == pz ? OK : FALSE
71
+ else
72
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
73
+ pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
74
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
75
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
76
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
77
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
78
+
79
+ pz %= 10
80
+ pz = 10 - pz if pz != 0
81
+ # CHECK_PZ10
82
+ if rv
83
+ rv.pz_pos = 10
84
+ rv.pz = pz
85
+ end
86
+ kto[9] == pz ? OK : FALSE
87
+ end
88
+ end
89
+
90
+ # Methode 80
91
+ # Modulus 10, Gewichtung 2, 1, 2, 1, 2 (Variante 1) bzw. Modulus 7
92
+ # (Variante 2); Ausnahme: 3. Stelle = 9 -> Berechnung wie Verfahren 51.
93
+ def m80(kto, blz, um, rv)
94
+ if kto[2] == 9 # Berechnung wie in Verfahren 51
95
+ m3080(kto, blz, um, rv)
96
+ else
97
+ m1080(kto, blz, um, rv)
98
+ end
99
+ end
100
+
101
+ # Methode 80c (Ausnahme, Variante 1)
102
+ def m3080(kto, blz, um, rv)
103
+ if rv
104
+ rv.methode = "80c"
105
+ rv.pz_methode = 3080
106
+ end
107
+ pz = 9 * 8 +
108
+ kto[3] * 7 +
109
+ kto[4] * 6 +
110
+ kto[5] * 5 +
111
+ kto[6] * 4 +
112
+ kto[7] * 3 +
113
+ kto[8] * 2
114
+
115
+ pz %= 11
116
+ pz = pz <= 1 ? 0 : 11 - pz
117
+ # CHECK_PZX10
118
+ if rv
119
+ rv.pz_pos = 10
120
+ rv.pz = pz
121
+ end
122
+ return OK if kto[9] == pz
123
+ return FALSE if um != 0
124
+
125
+ m4080(kto, blz, um, rv)
126
+ end
127
+
128
+ # Methode 80d (Ausnahme, Variante 2)
129
+ def m4080(kto, blz, um, rv)
130
+ if rv
131
+ rv.methode = "80d"
132
+ rv.pz_methode = 4080
133
+ end
134
+ pz = kto[0] * 10 +
135
+ kto[1] * 9 +
136
+ 9 * 8 +
137
+ kto[3] * 7 +
138
+ kto[4] * 6 +
139
+ kto[5] * 5 +
140
+ kto[6] * 4 +
141
+ kto[7] * 3 +
142
+ kto[8] * 2
143
+
144
+ pz %= 11
145
+ pz = pz <= 1 ? 0 : 11 - pz
146
+ # CHECK_PZ10
147
+ if rv
148
+ rv.pz_pos = 10
149
+ rv.pz = pz
150
+ end
151
+ kto[9] == pz ? OK : FALSE
152
+ end
153
+
154
+ # Methode 80a (Variante 1)
155
+ def m1080(kto, blz, um, rv)
156
+ if rv
157
+ rv.methode = "80a"
158
+ rv.pz_methode = 1080
159
+ end
160
+ pz = kto[5] + kto[7]
161
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
162
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
163
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
164
+
165
+ pz %= 10
166
+ pz = 10 - pz if pz != 0
167
+ # CHECK_PZX10
168
+ if rv
169
+ rv.pz_pos = 10
170
+ rv.pz = pz
171
+ end
172
+ return OK if kto[9] == pz
173
+ return FALSE if um != 0
174
+
175
+ m2080(kto, blz, um, rv)
176
+ end
177
+
178
+ # Methode 80b (Variante 2)
179
+ def m2080(kto, blz, um, rv)
180
+ if rv
181
+ rv.methode = "80b"
182
+ rv.pz_methode = 2080
183
+ end
184
+ pz = kto[5] + kto[7]
185
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
186
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
187
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
188
+
189
+ pz %= 7
190
+ pz = 7 - pz if pz != 0
191
+ # CHECK_PZ10
192
+ if rv
193
+ rv.pz_pos = 10
194
+ rv.pz = pz
195
+ end
196
+ kto[9] == pz ? OK : FALSE
197
+ end
198
+
199
+ # Methode 81
200
+ # Modulus 11, Gewichtung 2, 3, 4, 5, 6, 7; Ausnahme: 3. Stelle = 9 ->
201
+ # Berechnung wie Verfahren 51.
202
+ def m81(kto, blz, um, rv)
203
+ if kto[2] == 9 # Berechnung wie in Verfahren 51
204
+ m2081(kto, blz, um, rv)
205
+ else
206
+ m1081(kto, blz, um, rv)
207
+ end
208
+ end
209
+
210
+ # Methode 81b (Ausnahme, Variante 1)
211
+ def m2081(kto, blz, um, rv)
212
+ if rv
213
+ rv.methode = "81b"
214
+ rv.pz_methode = 2081
215
+ end
216
+ pz = 9 * 8 +
217
+ kto[3] * 7 +
218
+ kto[4] * 6 +
219
+ kto[5] * 5 +
220
+ kto[6] * 4 +
221
+ kto[7] * 3 +
222
+ kto[8] * 2
223
+
224
+ pz %= 11
225
+ pz = pz <= 1 ? 0 : 11 - pz
226
+ # CHECK_PZX10
227
+ if rv
228
+ rv.pz_pos = 10
229
+ rv.pz = pz
230
+ end
231
+ return OK if kto[9] == pz
232
+ return FALSE if um != 0
233
+
234
+ m3081(kto, blz, um, rv)
235
+ end
236
+
237
+ # Methode 81c (Ausnahme, Variante 2)
238
+ def m3081(kto, blz, um, rv)
239
+ if rv
240
+ rv.methode = "81c"
241
+ rv.pz_methode = 3081
242
+ end
243
+ pz = kto[0] * 10 +
244
+ kto[1] * 9 +
245
+ 9 * 8 +
246
+ kto[3] * 7 +
247
+ kto[4] * 6 +
248
+ kto[5] * 5 +
249
+ kto[6] * 4 +
250
+ kto[7] * 3 +
251
+ kto[8] * 2
252
+
253
+ pz %= 11
254
+ pz = pz <= 1 ? 0 : 11 - pz
255
+ # CHECK_PZ10
256
+ if rv
257
+ rv.pz_pos = 10
258
+ rv.pz = pz
259
+ end
260
+ kto[9] == pz ? OK : FALSE
261
+ end
262
+
263
+ # Methode 81a (Normalfall)
264
+ def m1081(kto, blz, um, rv)
265
+ if rv
266
+ rv.methode = "81a"
267
+ rv.pz_methode = 1081
268
+ end
269
+ pz = kto[3] * 7 +
270
+ kto[4] * 6 +
271
+ kto[5] * 5 +
272
+ kto[6] * 4 +
273
+ kto[7] * 3 +
274
+ kto[8] * 2
275
+
276
+ pz %= 11
277
+ pz = pz <= 1 ? 0 : 11 - pz
278
+ # CHECK_PZ10
279
+ if rv
280
+ rv.pz_pos = 10
281
+ rv.pz = pz
282
+ end
283
+ kto[9] == pz ? OK : FALSE
284
+ end
285
+
286
+ # Methode 82
287
+ # Kontonummern mit 99 an der 3./4. Stelle: Verfahren 10, sonst
288
+ # Verfahren 33.
289
+ def m82(kto, blz, um, rv)
290
+ m1082(kto, blz, um, rv)
291
+ end
292
+
293
+ # Methode 82a (Verfahren 10)
294
+ def m1082(kto, blz, um, rv)
295
+ if rv
296
+ rv.methode = "82a"
297
+ rv.pz_methode = 1082
298
+ end
299
+ if kto[2] == 9 && kto[3] == 9
300
+ pz = kto[0] * 10 +
301
+ kto[1] * 9 +
302
+ kto[2] * 8 +
303
+ kto[3] * 7 +
304
+ kto[4] * 6 +
305
+ kto[5] * 5 +
306
+ kto[6] * 4 +
307
+ kto[7] * 3 +
308
+ kto[8] * 2
309
+
310
+ pz %= 11
311
+ pz = pz <= 1 ? 0 : 11 - pz
312
+ # CHECK_PZ10
313
+ if rv
314
+ rv.pz_pos = 10
315
+ rv.pz = pz
316
+ end
317
+ return kto[9] == pz ? OK : FALSE
318
+ end
319
+
320
+ m2082(kto, blz, um, rv)
321
+ end
322
+
323
+ # Methode 82b (Verfahren 33)
324
+ def m2082(kto, blz, um, rv)
325
+ if rv
326
+ rv.methode = "82b"
327
+ rv.pz_methode = 2082
328
+ end
329
+ pz = kto[4] * 6 +
330
+ kto[5] * 5 +
331
+ kto[6] * 4 +
332
+ kto[7] * 3 +
333
+ kto[8] * 2
334
+
335
+ pz %= 11
336
+ pz = pz <= 1 ? 0 : 11 - pz
337
+ # CHECK_PZ10
338
+ if rv
339
+ rv.pz_pos = 10
340
+ rv.pz = pz
341
+ end
342
+ kto[9] == pz ? OK : FALSE
343
+ end
344
+
345
+ # Methode 83
346
+ # Varianten A (Modulus 11, Gewichtung 2..7), B (Modulus 11, 2..6) und
347
+ # C (Modulus 7, 2..6); Sachkonten (99 an 3./4. Stelle) mit Variante D.
348
+ def m83(kto, blz, um, rv)
349
+ m4083(kto, blz, um, rv)
350
+ end
351
+
352
+ # Methode 83d (Sachkonten)
353
+ def m4083(kto, blz, um, rv)
354
+ if rv
355
+ rv.methode = "83d"
356
+ rv.pz_methode = 4083
357
+ end
358
+ if kto[2] == 9 && kto[3] == 9
359
+ pz = 9 * 8 +
360
+ 9 * 7 +
361
+ kto[4] * 6 +
362
+ kto[5] * 5 +
363
+ kto[6] * 4 +
364
+ kto[7] * 3 +
365
+ kto[8] * 2
366
+
367
+ pz %= 11
368
+ pz = pz <= 1 ? 0 : 11 - pz
369
+ # CHECK_PZ10
370
+ if rv
371
+ rv.pz_pos = 10
372
+ rv.pz = pz
373
+ end
374
+ return kto[9] == pz ? OK : FALSE
375
+ end
376
+
377
+ m1083(kto, blz, um, rv)
378
+ end
379
+
380
+ # Methode 83a
381
+ def m1083(kto, blz, um, rv)
382
+ if rv
383
+ rv.methode = "83a"
384
+ rv.pz_methode = 1083
385
+ end
386
+ pz = kto[3] * 7 +
387
+ kto[4] * 6 +
388
+ kto[5] * 5 +
389
+ kto[6] * 4 +
390
+ kto[7] * 3 +
391
+ kto[8] * 2
392
+
393
+ pz %= 11
394
+ pz = pz <= 1 ? 0 : 11 - pz
395
+ # CHECK_PZX10
396
+ if rv
397
+ rv.pz_pos = 10
398
+ rv.pz = pz
399
+ end
400
+ return OK if kto[9] == pz
401
+ return FALSE if um != 0
402
+
403
+ m2083(kto, blz, um, rv)
404
+ end
405
+
406
+ # Methode 83b
407
+ def m2083(kto, blz, um, rv)
408
+ if rv
409
+ rv.methode = "83b"
410
+ rv.pz_methode = 2083
411
+ end
412
+ pz = kto[4] * 6 +
413
+ kto[5] * 5 +
414
+ kto[6] * 4 +
415
+ kto[7] * 3 +
416
+ kto[8] * 2
417
+
418
+ pz %= 11
419
+ pz = pz <= 1 ? 0 : 11 - pz
420
+ # CHECK_PZX10
421
+ if rv
422
+ rv.pz_pos = 10
423
+ rv.pz = pz
424
+ end
425
+ return OK if kto[9] == pz
426
+ return FALSE if um != 0
427
+
428
+ m3083(kto, blz, um, rv)
429
+ end
430
+
431
+ # Methode 83c
432
+ def m3083(kto, blz, um, rv)
433
+ if rv
434
+ rv.methode = "83c"
435
+ rv.pz_methode = 3083
436
+ end
437
+ pz = kto[4] * 6 +
438
+ kto[5] * 5 +
439
+ kto[6] * 4 +
440
+ kto[7] * 3 +
441
+ kto[8] * 2
442
+
443
+ pz %= 7
444
+ pz = 7 - pz if pz != 0
445
+ # CHECK_PZ10
446
+ if rv
447
+ rv.pz_pos = 10
448
+ rv.pz = pz
449
+ end
450
+ kto[9] == pz ? OK : FALSE
451
+ end
452
+
453
+ # Methode 84
454
+ # Varianten A (Modulus 11, 2..6), B (Modulus 7, 2..6) und C (Modulus 10,
455
+ # Gewichtung 2, 1, 2, 1, 2); Ausnahme: 3. Stelle = 9 (Verfahren 51).
456
+ def m84(kto, blz, um, rv)
457
+ if kto[2] == 9 # Berechnung wie in Verfahren 51
458
+ m4084(kto, blz, um, rv)
459
+ else
460
+ m1084(kto, blz, um, rv)
461
+ end
462
+ end
463
+
464
+ # Methode 84d (Ausnahme, Variante 1)
465
+ def m4084(kto, blz, um, rv)
466
+ if rv
467
+ rv.methode = "84d"
468
+ rv.pz_methode = 4084
469
+ end
470
+ pz = 9 * 8 +
471
+ kto[3] * 7 +
472
+ kto[4] * 6 +
473
+ kto[5] * 5 +
474
+ kto[6] * 4 +
475
+ kto[7] * 3 +
476
+ kto[8] * 2
477
+
478
+ pz %= 11
479
+ pz = pz <= 1 ? 0 : 11 - pz
480
+ # CHECK_PZX10
481
+ if rv
482
+ rv.pz_pos = 10
483
+ rv.pz = pz
484
+ end
485
+ return OK if kto[9] == pz
486
+ return FALSE if um != 0
487
+
488
+ m5084(kto, blz, um, rv)
489
+ end
490
+
491
+ # Methode 84e (Ausnahme, Variante 2)
492
+ def m5084(kto, blz, um, rv)
493
+ if rv
494
+ rv.methode = "84e"
495
+ rv.pz_methode = 5084
496
+ end
497
+ pz = kto[0] * 10 +
498
+ kto[1] * 9 +
499
+ 9 * 8 +
500
+ kto[3] * 7 +
501
+ kto[4] * 6 +
502
+ kto[5] * 5 +
503
+ kto[6] * 4 +
504
+ kto[7] * 3 +
505
+ kto[8] * 2
506
+
507
+ pz %= 11
508
+ pz = pz <= 1 ? 0 : 11 - pz
509
+ # CHECK_PZ10
510
+ if rv
511
+ rv.pz_pos = 10
512
+ rv.pz = pz
513
+ end
514
+ kto[9] == pz ? OK : FALSE
515
+ end
516
+
517
+ # Methode 84a
518
+ def m1084(kto, blz, um, rv)
519
+ if rv
520
+ rv.methode = "84a"
521
+ rv.pz_methode = 1084
522
+ end
523
+ pz = kto[4] * 6 +
524
+ kto[5] * 5 +
525
+ kto[6] * 4 +
526
+ kto[7] * 3 +
527
+ kto[8] * 2
528
+
529
+ pz %= 11
530
+ pz = pz <= 1 ? 0 : 11 - pz
531
+ # CHECK_PZX10
532
+ if rv
533
+ rv.pz_pos = 10
534
+ rv.pz = pz
535
+ end
536
+ return OK if kto[9] == pz
537
+ return FALSE if um != 0
538
+
539
+ m2084(kto, blz, um, rv)
540
+ end
541
+
542
+ # Methode 84b
543
+ def m2084(kto, blz, um, rv)
544
+ if rv
545
+ rv.methode = "84b"
546
+ rv.pz_methode = 2084
547
+ end
548
+ pz = kto[4] * 6 +
549
+ kto[5] * 5 +
550
+ kto[6] * 4 +
551
+ kto[7] * 3 +
552
+ kto[8] * 2
553
+
554
+ pz %= 7
555
+ pz = 7 - pz if pz != 0
556
+ # CHECK_PZX10
557
+ if rv
558
+ rv.pz_pos = 10
559
+ rv.pz = pz
560
+ end
561
+ return OK if kto[9] == pz
562
+ return FALSE if um != 0
563
+
564
+ m3084(kto, blz, um, rv)
565
+ end
566
+
567
+ # Methode 84c
568
+ def m3084(kto, blz, um, rv)
569
+ if rv
570
+ rv.methode = "84c"
571
+ rv.pz_methode = 3084
572
+ end
573
+ pz = kto[4] * 2 +
574
+ kto[5] +
575
+ kto[6] * 2 +
576
+ kto[7] +
577
+ kto[8] * 2
578
+
579
+ pz %= 10
580
+ pz = 10 - pz if pz != 0
581
+ # CHECK_PZ10
582
+ if rv
583
+ rv.pz_pos = 10
584
+ rv.pz = pz
585
+ end
586
+ kto[9] == pz ? OK : FALSE
587
+ end
588
+
589
+ # Methode 85
590
+ # Varianten A (Modulus 11, 2..7), B (Modulus 11, 2..6) und C (Modulus 7,
591
+ # 2..6); Sachkonten (99 an 3./4. Stelle) mit Variante D.
592
+ def m85(kto, blz, um, rv)
593
+ m4085(kto, blz, um, rv)
594
+ end
595
+
596
+ # Methode 85d (Sachkonten)
597
+ def m4085(kto, blz, um, rv)
598
+ if rv
599
+ rv.methode = "85d"
600
+ rv.pz_methode = 4085
601
+ end
602
+ if kto[2] == 9 && kto[3] == 9
603
+ pz = 9 * 8 +
604
+ 9 * 7 +
605
+ kto[4] * 6 +
606
+ kto[5] * 5 +
607
+ kto[6] * 4 +
608
+ kto[7] * 3 +
609
+ kto[8] * 2
610
+
611
+ pz %= 11
612
+ pz = 11 - pz if pz != 0
613
+ # INVALID_PZ10
614
+ if rv
615
+ rv.pz_pos = 10
616
+ rv.pz = pz
617
+ end
618
+ return INVALID_KTO if pz == 10
619
+
620
+ # CHECK_PZ10
621
+ if rv
622
+ rv.pz_pos = 10
623
+ rv.pz = pz
624
+ end
625
+ return kto[9] == pz ? OK : FALSE
626
+ end
627
+
628
+ m1085(kto, blz, um, rv)
629
+ end
630
+
631
+ # Methode 85a
632
+ def m1085(kto, blz, um, rv)
633
+ if rv
634
+ rv.methode = "85a"
635
+ rv.pz_methode = 1085
636
+ end
637
+ pz = kto[3] * 7 +
638
+ kto[4] * 6 +
639
+ kto[5] * 5 +
640
+ kto[6] * 4 +
641
+ kto[7] * 3 +
642
+ kto[8] * 2
643
+
644
+ pz %= 11
645
+ pz = pz <= 1 ? 0 : 11 - pz
646
+ # CHECK_PZX10
647
+ if rv
648
+ rv.pz_pos = 10
649
+ rv.pz = pz
650
+ end
651
+ return OK if kto[9] == pz
652
+ return FALSE if um != 0
653
+
654
+ m2085(kto, blz, um, rv)
655
+ end
656
+
657
+ # Methode 85b
658
+ def m2085(kto, blz, um, rv)
659
+ if rv
660
+ rv.methode = "85b"
661
+ rv.pz_methode = 2085
662
+ end
663
+ pz = kto[4] * 6 +
664
+ kto[5] * 5 +
665
+ kto[6] * 4 +
666
+ kto[7] * 3 +
667
+ kto[8] * 2
668
+
669
+ pz %= 11
670
+ pz = pz <= 1 ? 0 : 11 - pz
671
+ # CHECK_PZX10
672
+ if rv
673
+ rv.pz_pos = 10
674
+ rv.pz = pz
675
+ end
676
+ return OK if kto[9] == pz
677
+ return FALSE if um != 0
678
+
679
+ m3085(kto, blz, um, rv)
680
+ end
681
+
682
+ # Methode 85c
683
+ def m3085(kto, blz, um, rv)
684
+ if rv
685
+ rv.methode = "85c"
686
+ rv.pz_methode = 3085
687
+ end
688
+ pz = kto[4] * 6 +
689
+ kto[5] * 5 +
690
+ kto[6] * 4 +
691
+ kto[7] * 3 +
692
+ kto[8] * 2
693
+
694
+ pz %= 7
695
+ pz = 7 - pz if pz != 0
696
+ # CHECK_PZ10
697
+ if rv
698
+ rv.pz_pos = 10
699
+ rv.pz = pz
700
+ end
701
+ kto[9] == pz ? OK : FALSE
702
+ end
703
+
704
+ # Methode 86
705
+ # Varianten A (Modulus 10, Gewichtung 2, 1, 2, 1, 2, 1) und B (Modulus 11,
706
+ # Gewichtung 2..7); Ausnahme: 3. Stelle = 9 (Verfahren 51).
707
+ def m86(kto, blz, um, rv)
708
+ if kto[2] == 9 # Berechnung wie in Verfahren 51
709
+ m3086(kto, blz, um, rv)
710
+ else
711
+ m1086(kto, blz, um, rv)
712
+ end
713
+ end
714
+
715
+ # Methode 86c (Ausnahme, Variante 1)
716
+ def m3086(kto, blz, um, rv)
717
+ if rv
718
+ rv.methode = "86c"
719
+ rv.pz_methode = 3086
720
+ end
721
+ pz = 9 * 8 +
722
+ kto[3] * 7 +
723
+ kto[4] * 6 +
724
+ kto[5] * 5 +
725
+ kto[6] * 4 +
726
+ kto[7] * 3 +
727
+ kto[8] * 2
728
+
729
+ pz %= 11
730
+ pz = pz <= 1 ? 0 : 11 - pz
731
+ # CHECK_PZX10
732
+ if rv
733
+ rv.pz_pos = 10
734
+ rv.pz = pz
735
+ end
736
+ return OK if kto[9] == pz
737
+ return FALSE if um != 0
738
+
739
+ m4086(kto, blz, um, rv)
740
+ end
741
+
742
+ # Methode 86d (Ausnahme, Variante 2)
743
+ def m4086(kto, blz, um, rv)
744
+ if rv
745
+ rv.methode = "86d"
746
+ rv.pz_methode = 4086
747
+ end
748
+ pz = kto[0] * 10 +
749
+ kto[1] * 9 +
750
+ 9 * 8 +
751
+ kto[3] * 7 +
752
+ kto[4] * 6 +
753
+ kto[5] * 5 +
754
+ kto[6] * 4 +
755
+ kto[7] * 3 +
756
+ kto[8] * 2
757
+
758
+ pz %= 11
759
+ pz = pz <= 1 ? 0 : 11 - pz
760
+ # CHECK_PZ10
761
+ if rv
762
+ rv.pz_pos = 10
763
+ rv.pz = pz
764
+ end
765
+ kto[9] == pz ? OK : FALSE
766
+ end
767
+
768
+ # Methode 86a
769
+ def m1086(kto, blz, um, rv)
770
+ if rv
771
+ rv.methode = "86a"
772
+ rv.pz_methode = 1086
773
+ end
774
+ pz = kto[3] + kto[5] + kto[7]
775
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
776
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
777
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
778
+
779
+ pz %= 10
780
+ pz = 10 - pz if pz != 0
781
+ # CHECK_PZX10
782
+ if rv
783
+ rv.pz_pos = 10
784
+ rv.pz = pz
785
+ end
786
+ return OK if kto[9] == pz
787
+ return FALSE if um != 0
788
+
789
+ m2086(kto, blz, um, rv)
790
+ end
791
+
792
+ # Methode 86b
793
+ def m2086(kto, blz, um, rv)
794
+ if rv
795
+ rv.methode = "86b"
796
+ rv.pz_methode = 2086
797
+ end
798
+ pz = kto[3] * 7 +
799
+ kto[4] * 6 +
800
+ kto[5] * 5 +
801
+ kto[6] * 4 +
802
+ kto[7] * 3 +
803
+ kto[8] * 2
804
+
805
+ pz %= 11
806
+ pz = pz <= 1 ? 0 : 11 - pz
807
+ # CHECK_PZ10
808
+ if rv
809
+ rv.pz_pos = 10
810
+ rv.pz = pz
811
+ end
812
+ kto[9] == pz ? OK : FALSE
813
+ end
814
+
815
+ # Methode 87
816
+ # Variante A: eigenes Verfahren mit den Tabellen tab1/tab2, Variante B:
817
+ # Verfahren 33, Variante C: Verfahren 84 Variante 2, Variante D:
818
+ # Modulus 11 mit Gewichtung 2..7; Ausnahme: 3. Stelle = 9 (Verfahren 51).
819
+ def m87(kto, blz, um, rv)
820
+ if kto[2] == 9 # Berechnung wie in Verfahren 51
821
+ m5087(kto, blz, um, rv)
822
+ else
823
+ m1087(kto, blz, um, rv)
824
+ end
825
+ end
826
+
827
+ # Methode 87e (Ausnahme, Variante 1)
828
+ def m5087(kto, blz, um, rv)
829
+ if rv
830
+ rv.methode = "87e"
831
+ rv.pz_methode = 5087
832
+ end
833
+ pz = 9 * 8 +
834
+ kto[3] * 7 +
835
+ kto[4] * 6 +
836
+ kto[5] * 5 +
837
+ kto[6] * 4 +
838
+ kto[7] * 3 +
839
+ kto[8] * 2
840
+
841
+ pz %= 11
842
+ pz = pz <= 1 ? 0 : 11 - pz
843
+ # CHECK_PZX10
844
+ if rv
845
+ rv.pz_pos = 10
846
+ rv.pz = pz
847
+ end
848
+ return OK if kto[9] == pz
849
+ return FALSE if um != 0
850
+
851
+ m6087(kto, blz, um, rv)
852
+ end
853
+
854
+ # Methode 87f (Ausnahme, Variante 2)
855
+ def m6087(kto, blz, um, rv)
856
+ if rv
857
+ rv.methode = "87f"
858
+ rv.pz_methode = 6087
859
+ end
860
+ pz = kto[0] * 10 +
861
+ kto[1] * 9 +
862
+ 9 * 8 +
863
+ kto[3] * 7 +
864
+ kto[4] * 6 +
865
+ kto[5] * 5 +
866
+ kto[6] * 4 +
867
+ kto[7] * 3 +
868
+ kto[8] * 2
869
+
870
+ pz %= 11
871
+ pz = pz <= 1 ? 0 : 11 - pz
872
+ # CHECK_PZ10
873
+ if rv
874
+ rv.pz_pos = 10
875
+ rv.pz = pz
876
+ end
877
+ kto[9] == pz ? OK : FALSE
878
+ end
879
+
880
+ # Methode 87a
881
+ # Der Startindex fuer das Array konto[] ist 1, nicht 0; daher hat es 11
882
+ # Elemente. Die Tabellen tab1/tab2 haben dagegen den Startindex 0.
883
+ def m1087(kto, blz, um, rv)
884
+ if rv
885
+ rv.methode = "87a"
886
+ rv.pz_methode = 1087
887
+ end
888
+
889
+ konto = Array.new(12)
890
+ i = 1
891
+ while i < 11
892
+ konto[i] = kto[i - 1]
893
+ i += 1
894
+ end
895
+ i = 4
896
+ i += 1 while konto[i] == 0
897
+ c2 = i % 2
898
+ d2 = 0
899
+ a5 = 0
900
+
901
+ while i < 10
902
+ case konto[i]
903
+ when 0 then konto[i] = 5
904
+ when 1 then konto[i] = 6
905
+ when 5 then konto[i] = 10
906
+ when 6 then konto[i] = 1
907
+ end
908
+
909
+ if c2 == d2
910
+ if konto[i] > 5
911
+ if c2 == 0 && d2 == 0
912
+ c2 = d2 = 1
913
+ a5 = a5 + 6 - (konto[i] - 6)
914
+ else
915
+ c2 = d2 = 0
916
+ a5 = a5 + konto[i]
917
+ end
918
+ else
919
+ if c2 == 0 && d2 == 0
920
+ c2 = 1
921
+ a5 = a5 + konto[i]
922
+ else
923
+ c2 = 0
924
+ a5 = a5 + konto[i]
925
+ end
926
+ end
927
+ else
928
+ if konto[i] > 5
929
+ if c2 == 0
930
+ c2 = 1
931
+ d2 = 0
932
+ a5 = a5 - 6 + (konto[i] - 6)
933
+ else
934
+ c2 = 0
935
+ d2 = 1
936
+ a5 = a5 - konto[i]
937
+ end
938
+ else
939
+ if c2 == 0
940
+ c2 = 1
941
+ a5 = a5 - konto[i]
942
+ else
943
+ c2 = 0
944
+ a5 = a5 - konto[i]
945
+ end
946
+ end
947
+ end
948
+ i += 1
949
+ end
950
+
951
+ while a5 < 0 || a5 > 4
952
+ if a5 > 4
953
+ a5 -= 5
954
+ else
955
+ a5 += 5
956
+ end
957
+ end
958
+ p = d2 == 0 ? TAB1[a5] : TAB2[a5]
959
+ if p == konto[10]
960
+ return OK # Pruefziffer ok
961
+ else
962
+ if konto[4] == 0
963
+ p = p > 4 ? p - 5 : p + 5
964
+ return OK if p == konto[10] # Pruefziffer ok
965
+ end
966
+ end
967
+
968
+ m2087(kto, blz, um, rv)
969
+ end
970
+
971
+ # Methode 87b (Verfahren 33)
972
+ def m2087(kto, blz, um, rv)
973
+ if rv
974
+ rv.methode = "87b"
975
+ rv.pz_methode = 2087
976
+ end
977
+ pz = kto[4] * 6 +
978
+ kto[5] * 5 +
979
+ kto[6] * 4 +
980
+ kto[7] * 3 +
981
+ kto[8] * 2
982
+
983
+ pz %= 11
984
+ pz = pz <= 1 ? 0 : 11 - pz
985
+ # CHECK_PZX10
986
+ if rv
987
+ rv.pz_pos = 10
988
+ rv.pz = pz
989
+ end
990
+ return OK if kto[9] == pz
991
+ return FALSE if um != 0
992
+
993
+ m3087(kto, blz, um, rv)
994
+ end
995
+
996
+ # Methode 87c (Verfahren 84 Variante 2)
997
+ def m3087(kto, blz, um, rv)
998
+ if rv
999
+ rv.methode = "87c"
1000
+ rv.pz_methode = 3087
1001
+ end
1002
+ pz = kto[4] * 6 +
1003
+ kto[5] * 5 +
1004
+ kto[6] * 4 +
1005
+ kto[7] * 3 +
1006
+ kto[8] * 2
1007
+
1008
+ pz %= 7
1009
+ pz = 7 - pz if pz != 0
1010
+ # kein CHECK_PZX10: es wird auch bei gesetzter Untermethode weiter
1011
+ # zur Methode 87d gegangen
1012
+ if rv
1013
+ rv.pz = pz
1014
+ rv.pz_pos = 10
1015
+ end
1016
+ return OK if pz == kto[9]
1017
+
1018
+ m4087(kto, blz, um, rv)
1019
+ end
1020
+
1021
+ # Methode 87d
1022
+ def m4087(kto, blz, um, rv)
1023
+ if rv
1024
+ rv.methode = "87d"
1025
+ rv.pz_methode = 4087
1026
+ end
1027
+ pz = kto[3] * 7 +
1028
+ kto[4] * 6 +
1029
+ kto[5] * 5 +
1030
+ kto[6] * 4 +
1031
+ kto[7] * 3 +
1032
+ kto[8] * 2
1033
+
1034
+ pz %= 11
1035
+ pz = pz <= 1 ? 0 : 11 - pz
1036
+ # CHECK_PZ10
1037
+ if rv
1038
+ rv.pz_pos = 10
1039
+ rv.pz = pz
1040
+ end
1041
+ kto[9] == pz ? OK : FALSE
1042
+ end
1043
+
1044
+ # Methode 88
1045
+ # Modulus 11, Gewichtung 2, 3, 4, 5, 6, 7; Ausnahme: 3. Stelle = 9, dann
1046
+ # wird die 3. Stelle mit dem Gewicht 8 mitgerechnet.
1047
+ def m88(kto, blz, um, rv)
1048
+ if rv
1049
+ rv.methode = "88"
1050
+ rv.pz_methode = 88
1051
+ end
1052
+ pz = kto[3] * 7 +
1053
+ kto[4] * 6 +
1054
+ kto[5] * 5 +
1055
+ kto[6] * 4 +
1056
+ kto[7] * 3 +
1057
+ kto[8] * 2
1058
+ pz += 9 * 8 if kto[2] == 9 # Ausnahme
1059
+
1060
+ pz %= 11
1061
+ pz = pz <= 1 ? 0 : 11 - pz
1062
+ # CHECK_PZ10
1063
+ if rv
1064
+ rv.pz_pos = 10
1065
+ rv.pz = pz
1066
+ end
1067
+ kto[9] == pz ? OK : FALSE
1068
+ end
1069
+
1070
+ # Methode 89
1071
+ # 8- und 9-stellige Kontonummern: Verfahren 10; 7-stellige Kontonummern:
1072
+ # Modulus 11 mit Quersummenbildung; sonst keine Pruefzifferberechnung.
1073
+ def m89(kto, blz, um, rv)
1074
+ m1089(kto, blz, um, rv)
1075
+ end
1076
+
1077
+ # Methode 89a (8- und 9-stellige Kontonummern)
1078
+ def m1089(kto, blz, um, rv)
1079
+ if rv
1080
+ rv.methode = "89a"
1081
+ rv.pz_methode = 1089
1082
+ end
1083
+ if kto[0] == 0 && (kto[1] != 0 || kto[2] != 0)
1084
+ pz = kto[1] * 9 +
1085
+ kto[2] * 8 +
1086
+ kto[3] * 7 +
1087
+ kto[4] * 6 +
1088
+ kto[5] * 5 +
1089
+ kto[6] * 4 +
1090
+ kto[7] * 3 +
1091
+ kto[8] * 2
1092
+
1093
+ pz %= 11
1094
+ pz = pz <= 1 ? 0 : 11 - pz
1095
+ # CHECK_PZ10
1096
+ if rv
1097
+ rv.pz_pos = 10
1098
+ rv.pz = pz
1099
+ end
1100
+ return kto[9] == pz ? OK : FALSE
1101
+ end
1102
+
1103
+ m2089(kto, blz, um, rv)
1104
+ end
1105
+
1106
+ # Methode 89b (7-stellige Kontonummern)
1107
+ def m2089(kto, blz, um, rv)
1108
+ if rv
1109
+ rv.methode = "89b"
1110
+ rv.pz_methode = 2089
1111
+ end
1112
+ if kto[0] == 0 && kto[1] == 0 && kto[2] == 0 && kto[3] != 0
1113
+ pz = kto[3] * 7
1114
+ if pz >= 40
1115
+ if pz >= 50
1116
+ if pz >= 60
1117
+ pz -= 54
1118
+ else
1119
+ pz -= 45
1120
+ end
1121
+ else
1122
+ pz -= 36
1123
+ end
1124
+ elsif pz >= 20
1125
+ if pz >= 30
1126
+ pz -= 27
1127
+ else
1128
+ pz -= 18
1129
+ end
1130
+ elsif pz >= 10
1131
+ pz -= 9
1132
+ end
1133
+
1134
+ p1 = kto[4] * 6
1135
+ if p1 >= 40
1136
+ if p1 >= 50
1137
+ p1 -= 45
1138
+ else
1139
+ p1 -= 36
1140
+ end
1141
+ elsif p1 >= 20
1142
+ if p1 >= 30
1143
+ p1 -= 27
1144
+ else
1145
+ p1 -= 18
1146
+ end
1147
+ elsif p1 >= 10
1148
+ p1 -= 9
1149
+ end
1150
+ pz += p1
1151
+
1152
+ p1 = kto[5] * 5
1153
+ if p1 >= 40
1154
+ p1 -= 36
1155
+ elsif p1 >= 20
1156
+ if p1 >= 30
1157
+ p1 -= 27
1158
+ else
1159
+ p1 -= 18
1160
+ end
1161
+ elsif p1 >= 10
1162
+ p1 -= 9
1163
+ end
1164
+ pz += p1
1165
+
1166
+ p1 = kto[6] * 4
1167
+ if p1 >= 20
1168
+ if p1 >= 30
1169
+ p1 -= 27
1170
+ else
1171
+ p1 -= 18
1172
+ end
1173
+ elsif p1 >= 10
1174
+ p1 -= 9
1175
+ end
1176
+ pz += p1
1177
+
1178
+ p1 = kto[7] * 3
1179
+ if p1 >= 20
1180
+ p1 -= 18
1181
+ elsif p1 >= 10
1182
+ p1 -= 9
1183
+ end
1184
+ pz += p1
1185
+
1186
+ p1 = kto[8] * 2
1187
+ p1 -= 9 if p1 >= 10
1188
+ pz += p1
1189
+
1190
+ pz %= 11
1191
+ pz = pz <= 1 ? 0 : 11 - pz
1192
+ # CHECK_PZ10
1193
+ if rv
1194
+ rv.pz_pos = 10
1195
+ rv.pz = pz
1196
+ end
1197
+ return kto[9] == pz ? OK : FALSE
1198
+ end
1199
+
1200
+ m3089(kto, blz, um, rv)
1201
+ end
1202
+
1203
+ # Methode 89c (1- bis 6- und 10-stellige Kontonummern)
1204
+ def m3089(kto, blz, um, rv)
1205
+ if rv
1206
+ rv.methode = "89c"
1207
+ rv.pz_methode = 3089
1208
+ end
1209
+ OK_NO_CHK
1210
+ end
1211
+
1212
+ # Methode 90
1213
+ # Varianten A bis E und G; Sachkonten (3. Stelle = 9) mit Variante F.
1214
+ def m90(kto, blz, um, rv)
1215
+ if kto[2] == 9 # Sachkonto
1216
+ m6090(kto, blz, um, rv)
1217
+ else
1218
+ m1090(kto, blz, um, rv)
1219
+ end
1220
+ end
1221
+
1222
+ # Methode 90f (Sachkonto)
1223
+ def m6090(kto, blz, um, rv)
1224
+ if rv
1225
+ rv.methode = "90f"
1226
+ rv.pz_methode = 6090
1227
+ end
1228
+ pz = 9 * 8 +
1229
+ kto[3] * 7 +
1230
+ kto[4] * 6 +
1231
+ kto[5] * 5 +
1232
+ kto[6] * 4 +
1233
+ kto[7] * 3 +
1234
+ kto[8] * 2
1235
+
1236
+ pz %= 11
1237
+ pz = pz <= 1 ? 0 : 11 - pz
1238
+ # CHECK_PZ10
1239
+ if rv
1240
+ rv.pz_pos = 10
1241
+ rv.pz = pz
1242
+ end
1243
+ kto[9] == pz ? OK : FALSE
1244
+ end
1245
+
1246
+ # Methode 90a
1247
+ def m1090(kto, blz, um, rv)
1248
+ if rv
1249
+ rv.methode = "90a"
1250
+ rv.pz_methode = 1090
1251
+ end
1252
+ pz = kto[3] * 7 +
1253
+ kto[4] * 6 +
1254
+ kto[5] * 5 +
1255
+ kto[6] * 4 +
1256
+ kto[7] * 3 +
1257
+ kto[8] * 2
1258
+
1259
+ pz %= 11
1260
+ pz = pz <= 1 ? 0 : 11 - pz
1261
+ # CHECK_PZX10
1262
+ if rv
1263
+ rv.pz_pos = 10
1264
+ rv.pz = pz
1265
+ end
1266
+ return OK if kto[9] == pz
1267
+ return FALSE if um != 0
1268
+
1269
+ m2090(kto, blz, um, rv)
1270
+ end
1271
+
1272
+ # Methode 90b
1273
+ def m2090(kto, blz, um, rv)
1274
+ if rv
1275
+ rv.methode = "90b"
1276
+ rv.pz_methode = 2090
1277
+ end
1278
+ pz = kto[4] * 6 +
1279
+ kto[5] * 5 +
1280
+ kto[6] * 4 +
1281
+ kto[7] * 3 +
1282
+ kto[8] * 2
1283
+
1284
+ pz %= 11
1285
+ pz = pz <= 1 ? 0 : 11 - pz
1286
+ # CHECK_PZX10
1287
+ if rv
1288
+ rv.pz_pos = 10
1289
+ rv.pz = pz
1290
+ end
1291
+ return OK if kto[9] == pz
1292
+ return FALSE if um != 0
1293
+
1294
+ m3090(kto, blz, um, rv)
1295
+ end
1296
+
1297
+ # Methode 90c
1298
+ def m3090(kto, blz, um, rv)
1299
+ if rv
1300
+ rv.methode = "90c"
1301
+ rv.pz_methode = 3090
1302
+ end
1303
+ pz = kto[4] * 6 +
1304
+ kto[5] * 5 +
1305
+ kto[6] * 4 +
1306
+ kto[7] * 3 +
1307
+ kto[8] * 2
1308
+
1309
+ pz %= 7
1310
+ pz = 7 - pz if pz != 0
1311
+ # CHECK_PZX10
1312
+ if rv
1313
+ rv.pz_pos = 10
1314
+ rv.pz = pz
1315
+ end
1316
+ return OK if kto[9] == pz
1317
+ return FALSE if um != 0
1318
+
1319
+ m4090(kto, blz, um, rv)
1320
+ end
1321
+
1322
+ # Methode 90d
1323
+ def m4090(kto, blz, um, rv)
1324
+ if rv
1325
+ rv.methode = "90d"
1326
+ rv.pz_methode = 4090
1327
+ end
1328
+ pz = kto[4] * 6 +
1329
+ kto[5] * 5 +
1330
+ kto[6] * 4 +
1331
+ kto[7] * 3 +
1332
+ kto[8] * 2
1333
+
1334
+ pz %= 9
1335
+ pz = 9 - pz if pz != 0
1336
+ # CHECK_PZX10
1337
+ if rv
1338
+ rv.pz_pos = 10
1339
+ rv.pz = pz
1340
+ end
1341
+ return OK if kto[9] == pz
1342
+ return FALSE if um != 0
1343
+
1344
+ m5090(kto, blz, um, rv)
1345
+ end
1346
+
1347
+ # Methode 90e
1348
+ def m5090(kto, blz, um, rv)
1349
+ if rv
1350
+ rv.methode = "90e"
1351
+ rv.pz_methode = 5090
1352
+ end
1353
+ pz = kto[4] * 2 +
1354
+ kto[5] +
1355
+ kto[6] * 2 +
1356
+ kto[7] +
1357
+ kto[8] * 2
1358
+
1359
+ pz %= 10
1360
+ pz = 10 - pz if pz != 0
1361
+ # CHECK_PZX10
1362
+ if rv
1363
+ rv.pz_pos = 10
1364
+ rv.pz = pz
1365
+ end
1366
+ return OK if kto[9] == pz
1367
+ return FALSE if um != 0
1368
+
1369
+ m7090(kto, blz, um, rv)
1370
+ end
1371
+
1372
+ # Methode 90g
1373
+ def m7090(kto, blz, um, rv)
1374
+ if rv
1375
+ rv.methode = "90g"
1376
+ rv.pz_methode = 7090
1377
+ end
1378
+ pz = kto[3] +
1379
+ kto[4] * 2 +
1380
+ kto[5] +
1381
+ kto[6] * 2 +
1382
+ kto[7] +
1383
+ kto[8] * 2
1384
+
1385
+ pz %= 7
1386
+ pz = 7 - pz if pz != 0
1387
+ # CHECK_PZ10
1388
+ if rv
1389
+ rv.pz_pos = 10
1390
+ rv.pz = pz
1391
+ end
1392
+ kto[9] == pz ? OK : FALSE
1393
+ end
1394
+
1395
+ # Methode 91
1396
+ # Pruefziffer an Stelle 7; Varianten A bis D mit unterschiedlichen
1397
+ # Gewichtungen, alle Modulus 11.
1398
+ def m91(kto, blz, um, rv)
1399
+ m1091(kto, blz, um, rv)
1400
+ end
1401
+
1402
+ # Methode 91a
1403
+ def m1091(kto, blz, um, rv)
1404
+ if rv
1405
+ rv.methode = "91a"
1406
+ rv.pz_methode = 1091
1407
+ end
1408
+ pz = kto[0] * 7 +
1409
+ kto[1] * 6 +
1410
+ kto[2] * 5 +
1411
+ kto[3] * 4 +
1412
+ kto[4] * 3 +
1413
+ kto[5] * 2
1414
+
1415
+ pz %= 11
1416
+ pz = pz <= 1 ? 0 : 11 - pz
1417
+ # CHECK_PZX7
1418
+ if rv
1419
+ rv.pz_pos = 7
1420
+ rv.pz = pz
1421
+ end
1422
+ return OK if kto[6] == pz
1423
+ return FALSE if um != 0
1424
+
1425
+ m2091(kto, blz, um, rv)
1426
+ end
1427
+
1428
+ # Methode 91b
1429
+ def m2091(kto, blz, um, rv)
1430
+ if rv
1431
+ rv.methode = "91b"
1432
+ rv.pz_methode = 2091
1433
+ end
1434
+ pz = kto[0] * 2 +
1435
+ kto[1] * 3 +
1436
+ kto[2] * 4 +
1437
+ kto[3] * 5 +
1438
+ kto[4] * 6 +
1439
+ kto[5] * 7
1440
+
1441
+ pz %= 11
1442
+ pz = pz <= 1 ? 0 : 11 - pz
1443
+ # CHECK_PZX7
1444
+ if rv
1445
+ rv.pz_pos = 7
1446
+ rv.pz = pz
1447
+ end
1448
+ return OK if kto[6] == pz
1449
+ return FALSE if um != 0
1450
+
1451
+ m3091(kto, blz, um, rv)
1452
+ end
1453
+
1454
+ # Methode 91c
1455
+ def m3091(kto, blz, um, rv)
1456
+ if rv
1457
+ rv.methode = "91c"
1458
+ rv.pz_methode = 3091
1459
+ end
1460
+ pz = kto[0] * 10 +
1461
+ kto[1] * 9 +
1462
+ kto[2] * 8 +
1463
+ kto[3] * 7 +
1464
+ kto[4] * 6 +
1465
+ kto[5] * 5 +
1466
+ kto[7] * 4 +
1467
+ kto[8] * 3 +
1468
+ kto[9] * 2
1469
+
1470
+ pz %= 11
1471
+ pz = pz <= 1 ? 0 : 11 - pz
1472
+ # CHECK_PZX7
1473
+ if rv
1474
+ rv.pz_pos = 7
1475
+ rv.pz = pz
1476
+ end
1477
+ return OK if kto[6] == pz
1478
+ return FALSE if um != 0
1479
+
1480
+ m4091(kto, blz, um, rv)
1481
+ end
1482
+
1483
+ # Methode 91d
1484
+ def m4091(kto, blz, um, rv)
1485
+ if rv
1486
+ rv.methode = "91d"
1487
+ rv.pz_methode = 4091
1488
+ end
1489
+ pz = kto[0] * 9 +
1490
+ kto[1] * 10 +
1491
+ kto[2] * 5 +
1492
+ kto[3] * 8 +
1493
+ kto[4] * 4 +
1494
+ kto[5] * 2
1495
+
1496
+ pz %= 11
1497
+ pz = pz <= 1 ? 0 : 11 - pz
1498
+ # CHECK_PZ7
1499
+ if rv
1500
+ rv.pz_pos = 7
1501
+ rv.pz = pz
1502
+ end
1503
+ kto[6] == pz ? OK : FALSE
1504
+ end
1505
+
1506
+ # Methode 92
1507
+ # Modulus 10, Gewichtung 3, 7, 1, 3, 7, 1.
1508
+ def m92(kto, blz, um, rv)
1509
+ if rv
1510
+ rv.methode = "92"
1511
+ rv.pz_methode = 92
1512
+ end
1513
+ pz = kto[3] +
1514
+ kto[4] * 7 +
1515
+ kto[5] * 3 +
1516
+ kto[6] +
1517
+ kto[7] * 7 +
1518
+ kto[8] * 3
1519
+
1520
+ pz %= 10
1521
+ pz = 10 - pz if pz != 0
1522
+ # CHECK_PZ10
1523
+ if rv
1524
+ rv.pz_pos = 10
1525
+ rv.pz = pz
1526
+ end
1527
+ kto[9] == pz ? OK : FALSE
1528
+ end
1529
+
1530
+ # Methode 93
1531
+ # Modulus 11, Gewichtung 2, 3, 4, 5, 6 (Variante 1) bzw. Modulus 7
1532
+ # (Variante 2); Fall a): Kontonummer 1..5 mit Pruefziffer an Stelle 6,
1533
+ # Fall b): Kontonummer 5..9 mit Pruefziffer an Stelle 10.
1534
+ def m93(kto, blz, um, rv)
1535
+ if kto[0] == 0 && kto[1] == 0 && kto[2] == 0 && kto[3] == 0 # Fall b)
1536
+ m2093(kto, blz, um, rv)
1537
+ else
1538
+ m1093(kto, blz, um, rv)
1539
+ end
1540
+ end
1541
+
1542
+ # Methode 93b (Variante 1, Fall b)
1543
+ def m2093(kto, blz, um, rv)
1544
+ if rv
1545
+ rv.methode = "93b"
1546
+ rv.pz_methode = 2093
1547
+ end
1548
+ pz = kto[4] * 6 +
1549
+ kto[5] * 5 +
1550
+ kto[6] * 4 +
1551
+ kto[7] * 3 +
1552
+ kto[8] * 2
1553
+
1554
+ p1 = pz
1555
+ pz %= 11
1556
+ pz = pz <= 1 ? 0 : 11 - pz
1557
+ # CHECK_PZX10
1558
+ if rv
1559
+ rv.pz_pos = 10
1560
+ rv.pz = pz
1561
+ end
1562
+ return OK if kto[9] == pz
1563
+ return FALSE if um != 0
1564
+
1565
+ # Variante 2 (untermethode == 0, pz wurde bereits berechnet)
1566
+ pz = p1 % 7
1567
+ pz = 7 - pz if pz != 0
1568
+ # CHECK_PZ10
1569
+ if rv
1570
+ rv.pz_pos = 10
1571
+ rv.pz = pz
1572
+ end
1573
+ kto[9] == pz ? OK : FALSE
1574
+ end
1575
+
1576
+ # Methode 93a (Variante 1, Fall a)
1577
+ def m1093(kto, blz, um, rv)
1578
+ if rv
1579
+ rv.methode = "93a"
1580
+ rv.pz_methode = 1093
1581
+ end
1582
+ pz = kto[0] * 6 +
1583
+ kto[1] * 5 +
1584
+ kto[2] * 4 +
1585
+ kto[3] * 3 +
1586
+ kto[4] * 2
1587
+
1588
+ kto[9] = kto[5] # Pruefziffer nach Stelle 10
1589
+ p1 = pz
1590
+ pz %= 11
1591
+ pz = pz <= 1 ? 0 : 11 - pz
1592
+ # CHECK_PZX10
1593
+ if rv
1594
+ rv.pz_pos = 10
1595
+ rv.pz = pz
1596
+ end
1597
+ return OK if kto[9] == pz
1598
+ return FALSE if um != 0
1599
+
1600
+ # Variante 2 (untermethode == 0, pz wurde bereits berechnet)
1601
+ pz = p1 % 7
1602
+ pz = 7 - pz if pz != 0
1603
+ # CHECK_PZ10
1604
+ if rv
1605
+ rv.pz_pos = 10
1606
+ rv.pz = pz
1607
+ end
1608
+ kto[9] == pz ? OK : FALSE
1609
+ end
1610
+
1611
+ # Methode 93d (Variante 2, Fall b)
1612
+ def m4093(kto, blz, um, rv)
1613
+ if rv
1614
+ rv.methode = "93d"
1615
+ rv.pz_methode = 4093
1616
+ end
1617
+ p1 = 0
1618
+ i = 0
1619
+ while i < 5
1620
+ p1 += kto[8 - i] * W93[i]
1621
+ i += 1
1622
+ end
1623
+
1624
+ pz = p1 % 7
1625
+ pz = 7 - pz if pz != 0
1626
+ # CHECK_PZ10
1627
+ if rv
1628
+ rv.pz_pos = 10
1629
+ rv.pz = pz
1630
+ end
1631
+ kto[9] == pz ? OK : FALSE
1632
+ end
1633
+
1634
+ # Methode 93c (Variante 2, Fall a)
1635
+ def m3093(kto, blz, um, rv)
1636
+ if rv
1637
+ rv.methode = "93c"
1638
+ rv.pz_methode = 3093
1639
+ end
1640
+ p1 = 0
1641
+ i = 0
1642
+ while i < 5
1643
+ p1 += kto[4 - i] * W93[i]
1644
+ i += 1
1645
+ end
1646
+ kto[9] = kto[5] # Pruefziffer nach Stelle 10
1647
+
1648
+ pz = p1 % 7
1649
+ pz = 7 - pz if pz != 0
1650
+ # CHECK_PZ10
1651
+ if rv
1652
+ rv.pz_pos = 10
1653
+ rv.pz = pz
1654
+ end
1655
+ kto[9] == pz ? OK : FALSE
1656
+ end
1657
+
1658
+ # Methode 94
1659
+ # Modulus 10, Gewichtung 1, 2, 1, 2, 1, 2, 1, 2, 1.
1660
+ def m94(kto, blz, um, rv)
1661
+ if rv
1662
+ rv.methode = "94"
1663
+ rv.pz_methode = 94
1664
+ end
1665
+ pz = kto[0] + kto[2] + kto[4] + kto[6] + kto[8]
1666
+ pz += kto[1] < 5 ? kto[1] * 2 : kto[1] * 2 - 9
1667
+ pz += kto[3] < 5 ? kto[3] * 2 : kto[3] * 2 - 9
1668
+ pz += kto[5] < 5 ? kto[5] * 2 : kto[5] * 2 - 9
1669
+ pz += kto[7] < 5 ? kto[7] * 2 : kto[7] * 2 - 9
1670
+
1671
+ pz %= 10
1672
+ pz = 10 - pz if pz != 0
1673
+ # CHECK_PZ10
1674
+ if rv
1675
+ rv.pz_pos = 10
1676
+ rv.pz = pz
1677
+ end
1678
+ kto[9] == pz ? OK : FALSE
1679
+ end
1680
+
1681
+ # Methode 95
1682
+ # Modulus 11, Gewichtung 2, 3, 4, 5, 6, 7, 2, 3, 4; fuer bestimmte
1683
+ # Nummernkreise (Sach- und Verrechnungskonten) entfaellt die Pruefung.
1684
+ def m95(kto, blz, um, rv)
1685
+ if rv
1686
+ rv.methode = "95"
1687
+ rv.pz_methode = 95
1688
+ end
1689
+ tmp = kto[0] * 1000 + kto[1] * 100 + kto[2] * 10 + kto[3]
1690
+ # Ausnahmen: keine Pruefzifferberechnung
1691
+ if tmp <= 1 ||
1692
+ (tmp >= 9 && tmp <= 25) ||
1693
+ (tmp >= 396 && tmp <= 499) ||
1694
+ (tmp >= 700 && tmp <= 799) ||
1695
+ (tmp >= 910 && tmp <= 989)
1696
+ return OK_NO_CHK
1697
+ end
1698
+
1699
+ pz = kto[0] * 4 +
1700
+ kto[1] * 3 +
1701
+ kto[2] * 2 +
1702
+ kto[3] * 7 +
1703
+ kto[4] * 6 +
1704
+ kto[5] * 5 +
1705
+ kto[6] * 4 +
1706
+ kto[7] * 3 +
1707
+ kto[8] * 2
1708
+
1709
+ pz %= 11
1710
+ pz = pz <= 1 ? 0 : 11 - pz
1711
+ # CHECK_PZ10
1712
+ if rv
1713
+ rv.pz_pos = 10
1714
+ rv.pz = pz
1715
+ end
1716
+ kto[9] == pz ? OK : FALSE
1717
+ end
1718
+
1719
+ # Methode 96
1720
+ # Variante A: Verfahren 19, Variante B: Verfahren 00; Kontonummern von
1721
+ # 0001300000 bis 0099399999 sind ohne Pruefzifferberechnung gueltig.
1722
+ def m96(kto, blz, um, rv)
1723
+ m3096(kto, blz, um, rv)
1724
+ end
1725
+
1726
+ # Methode 96c (Nummernkreis ohne Pruefzifferberechnung)
1727
+ def m3096(kto, blz, um, rv)
1728
+ if rv
1729
+ rv.methode = "96c"
1730
+ rv.pz_methode = 3096
1731
+ end
1732
+ # die Berechnung muss in diesem Fall nicht gemacht werden
1733
+ s = kto.join
1734
+ return OK_NO_CHK if s >= "0001300000" && s < "0099400000"
1735
+
1736
+ m1096(kto, blz, um, rv)
1737
+ end
1738
+
1739
+ # Methode 96a (Verfahren 19)
1740
+ def m1096(kto, blz, um, rv)
1741
+ if rv
1742
+ rv.methode = "96a"
1743
+ rv.pz_methode = 1096
1744
+ end
1745
+ pz = kto[0] +
1746
+ kto[1] * 9 +
1747
+ kto[2] * 8 +
1748
+ kto[3] * 7 +
1749
+ kto[4] * 6 +
1750
+ kto[5] * 5 +
1751
+ kto[6] * 4 +
1752
+ kto[7] * 3 +
1753
+ kto[8] * 2
1754
+
1755
+ pz %= 11
1756
+ pz = pz <= 1 ? 0 : 11 - pz
1757
+ # CHECK_PZX10
1758
+ if rv
1759
+ rv.pz_pos = 10
1760
+ rv.pz = pz
1761
+ end
1762
+ return OK if kto[9] == pz
1763
+ return FALSE if um != 0
1764
+
1765
+ m2096(kto, blz, um, rv)
1766
+ end
1767
+
1768
+ # Methode 96b (Verfahren 00)
1769
+ def m2096(kto, blz, um, rv)
1770
+ if rv
1771
+ rv.methode = "96b"
1772
+ rv.pz_methode = 2096
1773
+ end
1774
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
1775
+ pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
1776
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
1777
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
1778
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
1779
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
1780
+
1781
+ pz %= 10
1782
+ pz = 10 - pz if pz != 0
1783
+ # CHECK_PZ10
1784
+ if rv
1785
+ rv.pz_pos = 10
1786
+ rv.pz = pz
1787
+ end
1788
+ kto[9] == pz ? OK : FALSE
1789
+ end
1790
+
1791
+ # Methode 97
1792
+ # Die ersten 9 Stellen werden als Zahl modulo 11 gerechnet; ein Rest von
1793
+ # 10 ergibt die Pruefziffer 0.
1794
+ def m97(kto, blz, um, rv)
1795
+ if rv
1796
+ rv.methode = "97"
1797
+ rv.pz_methode = 97
1798
+ end
1799
+ if kto[0] == 0 && kto[1] == 0 && kto[2] == 0 && kto[3] == 0 && kto[4] == 0 &&
1800
+ kto[5] == 0
1801
+ return INVALID_KTO
1802
+ end
1803
+
1804
+ # Pruefziffer temporaer loeschen -> atoi() ueber die ersten 9 Stellen
1805
+ pz = kto[0, 9].join.to_i % 11
1806
+ pz = 0 if pz == 10
1807
+ # CHECK_PZ10
1808
+ if rv
1809
+ rv.pz_pos = 10
1810
+ rv.pz = pz
1811
+ end
1812
+ kto[9] == pz ? OK : FALSE
1813
+ end
1814
+
1815
+ # Methode 98
1816
+ # Variante A: Modulus 10, Gewichtung 3, 1, 7, 3, 1, 7, 3;
1817
+ # Variante B: Verfahren 32 (Modulus 11, Gewichtung 2..7).
1818
+ def m98(kto, blz, um, rv)
1819
+ m1098(kto, blz, um, rv)
1820
+ end
1821
+
1822
+ # Methode 98a
1823
+ def m1098(kto, blz, um, rv)
1824
+ if rv
1825
+ rv.methode = "98a"
1826
+ rv.pz_methode = 1098
1827
+ end
1828
+ pz = kto[2] * 3 +
1829
+ kto[3] * 7 +
1830
+ kto[4] +
1831
+ kto[5] * 3 +
1832
+ kto[6] * 7 +
1833
+ kto[7] +
1834
+ kto[8] * 3
1835
+
1836
+ pz %= 10
1837
+ pz = 10 - pz if pz != 0
1838
+ # CHECK_PZX10
1839
+ if rv
1840
+ rv.pz_pos = 10
1841
+ rv.pz = pz
1842
+ end
1843
+ return OK if kto[9] == pz
1844
+ return FALSE if um != 0
1845
+
1846
+ m2098(kto, blz, um, rv)
1847
+ end
1848
+
1849
+ # Methode 98b (Verfahren 32)
1850
+ def m2098(kto, blz, um, rv)
1851
+ if rv
1852
+ rv.methode = "98b"
1853
+ rv.pz_methode = 2098
1854
+ end
1855
+ pz = kto[3] * 7 +
1856
+ kto[4] * 6 +
1857
+ kto[5] * 5 +
1858
+ kto[6] * 4 +
1859
+ kto[7] * 3 +
1860
+ kto[8] * 2
1861
+
1862
+ pz %= 11
1863
+ pz = pz <= 1 ? 0 : 11 - pz
1864
+ # CHECK_PZ10
1865
+ if rv
1866
+ rv.pz_pos = 10
1867
+ rv.pz = pz
1868
+ end
1869
+ kto[9] == pz ? OK : FALSE
1870
+ end
1871
+
1872
+ # Methode 99
1873
+ # Modulus 11, Gewichtung 2, 3, 4, 5, 6, 7, 2, 3, 4; Kontonummern von
1874
+ # 0396000000 bis 0499999999 sind ohne Pruefzifferberechnung gueltig.
1875
+ def m99(kto, blz, um, rv)
1876
+ if rv
1877
+ rv.methode = "99"
1878
+ rv.pz_methode = 99
1879
+ end
1880
+ s = kto.join
1881
+ if s >= "0396000000" && s < "0500000000"
1882
+ return OK
1883
+ end
1884
+
1885
+ pz = kto[0] * 4 +
1886
+ kto[1] * 3 +
1887
+ kto[2] * 2 +
1888
+ kto[3] * 7 +
1889
+ kto[4] * 6 +
1890
+ kto[5] * 5 +
1891
+ kto[6] * 4 +
1892
+ kto[7] * 3 +
1893
+ kto[8] * 2
1894
+
1895
+ pz %= 11
1896
+ pz = pz <= 1 ? 0 : 11 - pz
1897
+ # CHECK_PZ10
1898
+ if rv
1899
+ rv.pz_pos = 10
1900
+ rv.pz = pz
1901
+ end
1902
+ kto[9] == pz ? OK : FALSE
1903
+ end
1904
+ end
1905
+ end