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,1634 @@
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
+ # Port of the C case labels 0..50 (including the sub-methods 13a/13b, 49a/49b
14
+ # and 50a/50b) of kto_check_int() from konto_check.c.
15
+
16
+ module KontoCheckRuby
17
+ module CheckMethods
18
+ extend self
19
+
20
+ # Methode 00
21
+ # Modulus 10, Gewichtung 2, 1, 2, 1, 2, 1, 2, 1, 2 (mit Quersumme).
22
+ def m0(kto, blz, um, rv)
23
+ if rv
24
+ rv.methode = "00"
25
+ rv.pz_methode = 0
26
+ end
27
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
28
+ pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
29
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
30
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
31
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
32
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
33
+ pz %= 10
34
+ pz = 10 - pz if pz != 0
35
+ # CHECK_PZ10
36
+ if rv
37
+ rv.pz_pos = 10
38
+ rv.pz = pz
39
+ end
40
+ kto[9] == pz ? OK : FALSE
41
+ end
42
+
43
+ # Methode 01
44
+ # Modulus 10, Gewichtung 3, 7, 1, 3, 7, 1, 3, 7, 1.
45
+ def m1(kto, blz, um, rv)
46
+ if rv
47
+ rv.methode = "01"
48
+ rv.pz_methode = 1
49
+ end
50
+ pz = kto[0] +
51
+ kto[1] * 7 +
52
+ kto[2] * 3 +
53
+ kto[3] +
54
+ kto[4] * 7 +
55
+ kto[5] * 3 +
56
+ kto[6] +
57
+ kto[7] * 7 +
58
+ kto[8] * 3
59
+ pz %= 10
60
+ pz = 10 - pz if pz != 0
61
+ # CHECK_PZ10
62
+ if rv
63
+ rv.pz_pos = 10
64
+ rv.pz = pz
65
+ end
66
+ kto[9] == pz ? OK : FALSE
67
+ end
68
+
69
+ # Methode 02
70
+ # Modulus 11, Gewichtung 2, 3, 4, 5, 6, 7, 8, 9, 2.
71
+ def m2(kto, blz, um, rv)
72
+ if rv
73
+ rv.methode = "02"
74
+ rv.pz_methode = 2
75
+ end
76
+ pz = kto[0] * 2 +
77
+ kto[1] * 9 +
78
+ kto[2] * 8 +
79
+ kto[3] * 7 +
80
+ kto[4] * 6 +
81
+ kto[5] * 5 +
82
+ kto[6] * 4 +
83
+ kto[7] * 3 +
84
+ kto[8] * 2
85
+ pz %= 11
86
+ pz = 11 - pz if pz != 0
87
+ # INVALID_PZ10
88
+ if rv
89
+ rv.pz_pos = 10
90
+ rv.pz = pz
91
+ end
92
+ return INVALID_KTO if pz == 10
93
+ # CHECK_PZ10
94
+ if rv
95
+ rv.pz_pos = 10
96
+ rv.pz = pz
97
+ end
98
+ kto[9] == pz ? OK : FALSE
99
+ end
100
+
101
+ # Methode 03
102
+ # Modulus 10, Gewichtung 2, 1, 2, 1, 2, 1, 2, 1, 2 (ohne Quersumme).
103
+ def m3(kto, blz, um, rv)
104
+ if rv
105
+ rv.methode = "03"
106
+ rv.pz_methode = 3
107
+ end
108
+ pz = kto[0] * 2 +
109
+ kto[1] +
110
+ kto[2] * 2 +
111
+ kto[3] +
112
+ kto[4] * 2 +
113
+ kto[5] +
114
+ kto[6] * 2 +
115
+ kto[7] +
116
+ kto[8] * 2
117
+ pz %= 10
118
+ pz = 10 - pz if pz != 0
119
+ # CHECK_PZ10
120
+ if rv
121
+ rv.pz_pos = 10
122
+ rv.pz = pz
123
+ end
124
+ kto[9] == pz ? OK : FALSE
125
+ end
126
+
127
+ # Methode 04
128
+ # Modulus 11, Gewichtung 2, 3, 4, 5, 6, 7, 2, 3, 4.
129
+ def m4(kto, blz, um, rv)
130
+ if rv
131
+ rv.methode = "04"
132
+ rv.pz_methode = 4
133
+ end
134
+ pz = kto[0] * 4 +
135
+ kto[1] * 3 +
136
+ kto[2] * 2 +
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
+ pz %= 11
144
+ pz = 11 - pz if pz != 0
145
+ # INVALID_PZ10
146
+ if rv
147
+ rv.pz_pos = 10
148
+ rv.pz = pz
149
+ end
150
+ return INVALID_KTO if pz == 10
151
+ # CHECK_PZ10
152
+ if rv
153
+ rv.pz_pos = 10
154
+ rv.pz = pz
155
+ end
156
+ kto[9] == pz ? OK : FALSE
157
+ end
158
+
159
+ # Methode 05
160
+ # Modulus 10, Gewichtung 7, 3, 1, 7, 3, 1, 7, 3, 1.
161
+ def m5(kto, blz, um, rv)
162
+ if rv
163
+ rv.methode = "05"
164
+ rv.pz_methode = 5
165
+ end
166
+ pz = kto[0] +
167
+ kto[1] * 3 +
168
+ kto[2] * 7 +
169
+ kto[3] +
170
+ kto[4] * 3 +
171
+ kto[5] * 7 +
172
+ kto[6] +
173
+ kto[7] * 3 +
174
+ kto[8] * 7
175
+ pz %= 10
176
+ pz = 10 - 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 06
186
+ # Modulus 11, Gewichtung 2, 3, 4, 5, 6, 7, 2, 3, 4; Rest 0 und 1 -> Pz 0.
187
+ def m6(kto, blz, um, rv)
188
+ if rv
189
+ rv.methode = "06"
190
+ rv.pz_methode = 6
191
+ end
192
+ pz = kto[0] * 4 +
193
+ kto[1] * 3 +
194
+ kto[2] * 2 +
195
+ kto[3] * 7 +
196
+ kto[4] * 6 +
197
+ kto[5] * 5 +
198
+ kto[6] * 4 +
199
+ kto[7] * 3 +
200
+ kto[8] * 2
201
+ pz %= 11
202
+ pz = if pz <= 1
203
+ 0
204
+ else
205
+ 11 - pz
206
+ end
207
+ # CHECK_PZ10
208
+ if rv
209
+ rv.pz_pos = 10
210
+ rv.pz = pz
211
+ end
212
+ kto[9] == pz ? OK : FALSE
213
+ end
214
+
215
+ # Methode 07
216
+ # Modulus 11, Gewichtung 2, 3, 4, 5, 6, 7, 8, 9, 10.
217
+ def m7(kto, blz, um, rv)
218
+ if rv
219
+ rv.methode = "07"
220
+ rv.pz_methode = 7
221
+ end
222
+ pz = kto[0] * 10 +
223
+ kto[1] * 9 +
224
+ kto[2] * 8 +
225
+ kto[3] * 7 +
226
+ kto[4] * 6 +
227
+ kto[5] * 5 +
228
+ kto[6] * 4 +
229
+ kto[7] * 3 +
230
+ kto[8] * 2
231
+ pz %= 11
232
+ pz = 11 - pz if pz != 0
233
+ # INVALID_PZ10
234
+ if rv
235
+ rv.pz_pos = 10
236
+ rv.pz = pz
237
+ end
238
+ return INVALID_KTO if pz == 10
239
+ # CHECK_PZ10
240
+ if rv
241
+ rv.pz_pos = 10
242
+ rv.pz = pz
243
+ end
244
+ kto[9] == pz ? OK : FALSE
245
+ end
246
+
247
+ # Methode 08
248
+ # Wie Methode 00, jedoch nur fuer Kontonummern ab 60 000.
249
+ def m8(kto, blz, um, rv)
250
+ if rv
251
+ rv.methode = "08"
252
+ rv.pz_methode = 8
253
+ end
254
+ return OK_NO_CHK if kto.join < "0000060000"
255
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
256
+ pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
257
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
258
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
259
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
260
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
261
+ pz %= 10
262
+ pz = 10 - pz if pz != 0
263
+ # CHECK_PZ10
264
+ if rv
265
+ rv.pz_pos = 10
266
+ rv.pz = pz
267
+ end
268
+ kto[9] == pz ? OK : FALSE
269
+ end
270
+
271
+ # Methode 09
272
+ # Keine Pruefzifferberechnung.
273
+ def m9(kto, blz, um, rv)
274
+ if rv
275
+ rv.methode = "09"
276
+ rv.pz_methode = 9
277
+ end
278
+ OK_NO_CHK
279
+ end
280
+
281
+ # Methode 10
282
+ # Modulus 11, Gewichtung 2 bis 10; Rest 0 und 1 -> Pz 0.
283
+ def m10(kto, blz, um, rv)
284
+ if rv
285
+ rv.methode = "10"
286
+ rv.pz_methode = 10
287
+ end
288
+ pz = kto[0] * 10 +
289
+ kto[1] * 9 +
290
+ kto[2] * 8 +
291
+ kto[3] * 7 +
292
+ kto[4] * 6 +
293
+ kto[5] * 5 +
294
+ kto[6] * 4 +
295
+ kto[7] * 3 +
296
+ kto[8] * 2
297
+ pz %= 11
298
+ pz = if pz <= 1
299
+ 0
300
+ else
301
+ 11 - pz
302
+ end
303
+ # CHECK_PZ10
304
+ if rv
305
+ rv.pz_pos = 10
306
+ rv.pz = pz
307
+ end
308
+ kto[9] == pz ? OK : FALSE
309
+ end
310
+
311
+ # Methode 11
312
+ # Wie Methode 10, jedoch Rest 1 -> Pruefziffer 9.
313
+ def m11(kto, blz, um, rv)
314
+ if rv
315
+ rv.methode = "11"
316
+ rv.pz_methode = 11
317
+ end
318
+ pz = kto[0] * 10 +
319
+ kto[1] * 9 +
320
+ kto[2] * 8 +
321
+ kto[3] * 7 +
322
+ kto[4] * 6 +
323
+ kto[5] * 5 +
324
+ kto[6] * 4 +
325
+ kto[7] * 3 +
326
+ kto[8] * 2
327
+ pz %= 11
328
+ if pz == 1
329
+ pz = 9
330
+ elsif pz > 1
331
+ pz = 11 - pz
332
+ end
333
+ # CHECK_PZ10
334
+ if rv
335
+ rv.pz_pos = 10
336
+ rv.pz = pz
337
+ end
338
+ kto[9] == pz ? OK : FALSE
339
+ end
340
+
341
+ # Methode 12
342
+ # Nicht definiert.
343
+ def m12(kto, blz, um, rv)
344
+ if rv
345
+ rv.methode = "12"
346
+ rv.pz_methode = 12
347
+ end
348
+ NOT_DEFINED
349
+ end
350
+
351
+ # Methode 13
352
+ def m13(kto, blz, um, rv)
353
+ m1013(kto, blz, um, rv)
354
+ end
355
+
356
+ # Methode 13a
357
+ # Modulus 10, Gewichtung 2, 1, 2, 1, 2 ueber die Stellen 2 bis 7,
358
+ # Pruefziffer an Stelle 8.
359
+ def m1013(kto, blz, um, rv)
360
+ if rv
361
+ rv.methode = "13a"
362
+ rv.pz_methode = 1013
363
+ end
364
+ pz = kto[1] + kto[3] + kto[5]
365
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
366
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
367
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
368
+ pz %= 10
369
+ pz = 10 - pz if pz != 0
370
+ # CHECK_PZX8
371
+ if rv
372
+ rv.pz_pos = 8
373
+ rv.pz = pz
374
+ end
375
+ return OK if kto[7] == pz
376
+ return FALSE if um != 0
377
+ # falls die beiden ersten Stellen nicht 00 sind, kann keine
378
+ # Unterkontonummer weggelassen sein
379
+ return FALSE if kto[0] != 0 || kto[1] != 0
380
+ m2013(kto, blz, um, rv)
381
+ end
382
+
383
+ # Methode 13b
384
+ # Wie 13a, jedoch um zwei Stellen nach rechts verschoben.
385
+ def m2013(kto, blz, um, rv)
386
+ if rv
387
+ rv.methode = "13b"
388
+ rv.pz_methode = 2013
389
+ end
390
+ pz = kto[3] + kto[5] + kto[7]
391
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
392
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
393
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
394
+ pz %= 10
395
+ pz = 10 - pz if pz != 0
396
+ # CHECK_PZ10
397
+ if rv
398
+ rv.pz_pos = 10
399
+ rv.pz = pz
400
+ end
401
+ kto[9] == pz ? OK : FALSE
402
+ end
403
+
404
+ # Methode 14
405
+ # Modulus 11, Gewichtung 2, 3, 4, 5, 6, 7 ueber die Stellen 4 bis 9.
406
+ def m14(kto, blz, um, rv)
407
+ if rv
408
+ rv.methode = "14"
409
+ rv.pz_methode = 14
410
+ end
411
+ pz = kto[3] * 7 +
412
+ kto[4] * 6 +
413
+ kto[5] * 5 +
414
+ kto[6] * 4 +
415
+ kto[7] * 3 +
416
+ kto[8] * 2
417
+ pz %= 11
418
+ pz = 11 - pz if pz != 0
419
+ # INVALID_PZ10
420
+ if rv
421
+ rv.pz_pos = 10
422
+ rv.pz = pz
423
+ end
424
+ return INVALID_KTO if pz == 10
425
+ # CHECK_PZ10
426
+ if rv
427
+ rv.pz_pos = 10
428
+ rv.pz = pz
429
+ end
430
+ kto[9] == pz ? OK : FALSE
431
+ end
432
+
433
+ # Methode 15
434
+ # Modulus 11, Gewichtung 2, 3, 4, 5 ueber die Stellen 6 bis 9.
435
+ def m15(kto, blz, um, rv)
436
+ if rv
437
+ rv.methode = "15"
438
+ rv.pz_methode = 15
439
+ end
440
+ pz = kto[5] * 5 +
441
+ kto[6] * 4 +
442
+ kto[7] * 3 +
443
+ kto[8] * 2
444
+ pz %= 11
445
+ pz = if pz <= 1
446
+ 0
447
+ else
448
+ 11 - pz
449
+ end
450
+ # CHECK_PZ10
451
+ if rv
452
+ rv.pz_pos = 10
453
+ rv.pz = pz
454
+ end
455
+ kto[9] == pz ? OK : FALSE
456
+ end
457
+
458
+ # Methode 16
459
+ # Wie Methode 06; bei Rest 1 muessen die Stellen 9 und 10 uebereinstimmen.
460
+ def m16(kto, blz, um, rv)
461
+ if rv
462
+ rv.methode = "16"
463
+ rv.pz_methode = 16
464
+ end
465
+ pz = kto[0] * 4 +
466
+ kto[1] * 3 +
467
+ kto[2] * 2 +
468
+ kto[3] * 7 +
469
+ kto[4] * 6 +
470
+ kto[5] * 5 +
471
+ kto[6] * 4 +
472
+ kto[7] * 3 +
473
+ kto[8] * 2
474
+ pz %= 11
475
+ pz = 11 - pz if pz != 0
476
+ if pz == 10
477
+ if rv
478
+ rv.pz_pos = 10
479
+ rv.pz = kto[8]
480
+ end
481
+ return kto[8] == kto[9] ? OK : FALSE
482
+ end
483
+ # CHECK_PZ10
484
+ if rv
485
+ rv.pz_pos = 10
486
+ rv.pz = pz
487
+ end
488
+ kto[9] == pz ? OK : FALSE
489
+ end
490
+
491
+ # Methode 17
492
+ # Modulus 11, Gewichtung 1, 2, 1, 2, 1, 2 ueber die Stellen 2 bis 7,
493
+ # Summe minus 1, Pruefziffer an Stelle 8.
494
+ def m17(kto, blz, um, rv)
495
+ if rv
496
+ rv.methode = "17"
497
+ rv.pz_methode = 17
498
+ end
499
+ pz = kto[1] + kto[3] + kto[5]
500
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
501
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
502
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
503
+ pz -= 1
504
+ # MOD_11_44: iterierte Subtraktion, ein negativer Wert bleibt unveraendert
505
+ pz %= 11 if pz >= 0
506
+ pz = 10 - pz if pz != 0
507
+ # CHECK_PZ8
508
+ if rv
509
+ rv.pz_pos = 8
510
+ rv.pz = pz
511
+ end
512
+ kto[7] == pz ? OK : FALSE
513
+ end
514
+
515
+ # Methode 18
516
+ # Modulus 10, Gewichtung 3, 9, 7, 1, 3, 9, 7, 1, 3.
517
+ def m18(kto, blz, um, rv)
518
+ if rv
519
+ rv.methode = "18"
520
+ rv.pz_methode = 18
521
+ end
522
+ pz = kto[0] * 3 +
523
+ kto[1] +
524
+ kto[2] * 7 +
525
+ kto[3] * 9 +
526
+ kto[4] * 3 +
527
+ kto[5] +
528
+ kto[6] * 7 +
529
+ kto[7] * 9 +
530
+ kto[8] * 3
531
+ pz %= 10
532
+ pz = 10 - pz if pz != 0
533
+ # CHECK_PZ10
534
+ if rv
535
+ rv.pz_pos = 10
536
+ rv.pz = pz
537
+ end
538
+ kto[9] == pz ? OK : FALSE
539
+ end
540
+
541
+ # Methode 19
542
+ # Modulus 11, Gewichtung 2, 3, 4, 5, 6, 7, 8, 9, 1.
543
+ def m19(kto, blz, um, rv)
544
+ if rv
545
+ rv.methode = "19"
546
+ rv.pz_methode = 19
547
+ end
548
+ pz = kto[0] +
549
+ kto[1] * 9 +
550
+ kto[2] * 8 +
551
+ kto[3] * 7 +
552
+ kto[4] * 6 +
553
+ kto[5] * 5 +
554
+ kto[6] * 4 +
555
+ kto[7] * 3 +
556
+ kto[8] * 2
557
+ pz %= 11
558
+ pz = if pz <= 1
559
+ 0
560
+ else
561
+ 11 - pz
562
+ end
563
+ # CHECK_PZ10
564
+ if rv
565
+ rv.pz_pos = 10
566
+ rv.pz = pz
567
+ end
568
+ kto[9] == pz ? OK : FALSE
569
+ end
570
+
571
+ # Methode 20
572
+ # Modulus 11, Gewichtung 2, 3, 4, 5, 6, 7, 8, 9, 3.
573
+ def m20(kto, blz, um, rv)
574
+ if rv
575
+ rv.methode = "20"
576
+ rv.pz_methode = 20
577
+ end
578
+ pz = kto[0] * 3 +
579
+ kto[1] * 9 +
580
+ kto[2] * 8 +
581
+ kto[3] * 7 +
582
+ kto[4] * 6 +
583
+ kto[5] * 5 +
584
+ kto[6] * 4 +
585
+ kto[7] * 3 +
586
+ kto[8] * 2
587
+ pz %= 11
588
+ pz = if pz <= 1
589
+ 0
590
+ else
591
+ 11 - pz
592
+ end
593
+ # CHECK_PZ10
594
+ if rv
595
+ rv.pz_pos = 10
596
+ rv.pz = pz
597
+ end
598
+ kto[9] == pz ? OK : FALSE
599
+ end
600
+
601
+ # Methode 21
602
+ # Modulus 10, Gewichtung 2, 1, 2, 1, 2 ...; iterierte Quersumme der Summe.
603
+ def m21(kto, blz, um, rv)
604
+ if rv
605
+ rv.methode = "21"
606
+ rv.pz_methode = 21
607
+ end
608
+ pz = kto[0] * 2 +
609
+ kto[1] +
610
+ kto[2] * 2 +
611
+ kto[3] +
612
+ kto[4] * 2 +
613
+ kto[5] +
614
+ kto[6] * 2 +
615
+ kto[7] +
616
+ kto[8] * 2
617
+ pz = pz - 80 + 8 if pz >= 80
618
+ pz = pz - 40 + 4 if pz >= 40
619
+ pz = pz - 20 + 2 if pz >= 20
620
+ pz = pz - 10 + 1 if pz >= 10
621
+ pz = pz - 10 + 1 if pz >= 10
622
+ pz = 10 - pz if pz != 0
623
+ # CHECK_PZ10
624
+ if rv
625
+ rv.pz_pos = 10
626
+ rv.pz = pz
627
+ end
628
+ kto[9] == pz ? OK : FALSE
629
+ end
630
+
631
+ # Methode 22
632
+ # Modulus 10, Gewichtung 3, 1, 3, 1, 3 ...; von zweistelligen Produkten
633
+ # wird nur die Einerstelle gewertet.
634
+ def m22(kto, blz, um, rv)
635
+ if rv
636
+ rv.methode = "22"
637
+ rv.pz_methode = 22
638
+ end
639
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
640
+
641
+ pz += if kto[0] < 4
642
+ kto[0] * 3
643
+ elsif kto[0] < 7
644
+ kto[0] * 3 - 10
645
+ else
646
+ kto[0] * 3 - 20
647
+ end
648
+
649
+ pz += if kto[2] < 4
650
+ kto[2] * 3
651
+ elsif kto[2] < 7
652
+ kto[2] * 3 - 10
653
+ else
654
+ kto[2] * 3 - 20
655
+ end
656
+
657
+ pz += if kto[4] < 4
658
+ kto[4] * 3
659
+ elsif kto[4] < 7
660
+ kto[4] * 3 - 10
661
+ else
662
+ kto[4] * 3 - 20
663
+ end
664
+
665
+ pz += if kto[6] < 4
666
+ kto[6] * 3
667
+ elsif kto[6] < 7
668
+ kto[6] * 3 - 10
669
+ else
670
+ kto[6] * 3 - 20
671
+ end
672
+
673
+ pz += if kto[8] < 4
674
+ kto[8] * 3
675
+ elsif kto[8] < 7
676
+ kto[8] * 3 - 10
677
+ else
678
+ kto[8] * 3 - 20
679
+ end
680
+
681
+ pz %= 10
682
+ pz = 10 - pz if pz != 0
683
+ # CHECK_PZ10
684
+ if rv
685
+ rv.pz_pos = 10
686
+ rv.pz = pz
687
+ end
688
+ kto[9] == pz ? OK : FALSE
689
+ end
690
+
691
+ # Methode 23
692
+ # Wie Methode 16, jedoch ueber die Stellen 1 bis 6, Pruefziffer Stelle 7.
693
+ def m23(kto, blz, um, rv)
694
+ if rv
695
+ rv.methode = "23"
696
+ rv.pz_methode = 23
697
+ end
698
+ pz = kto[0] * 7 +
699
+ kto[1] * 6 +
700
+ kto[2] * 5 +
701
+ kto[3] * 4 +
702
+ kto[4] * 3 +
703
+ kto[5] * 2
704
+ pz %= 11
705
+ pz = 11 - pz if pz != 0
706
+ if pz == 10
707
+ if rv
708
+ rv.pz_pos = 7
709
+ rv.pz = kto[6]
710
+ end
711
+ return kto[5] == kto[6] ? OK : FALSE
712
+ end
713
+ # CHECK_PZ7
714
+ if rv
715
+ rv.pz_pos = 7
716
+ rv.pz = pz
717
+ end
718
+ kto[6] == pz ? OK : FALSE
719
+ end
720
+
721
+ # Methode 24
722
+ # Modulus 10, Gewichtung 1, 2, 3, 1, 2, 3 ...; Sonderbehandlung der
723
+ # ersten Stellen, fuehrende Nullen werden uebergangen.
724
+ def m24(kto, blz, um, rv)
725
+ if rv
726
+ rv.methode = "24"
727
+ rv.pz_methode = 24
728
+ end
729
+ kto[0] = 0 if kto[0] >= 3 && kto[0] <= 6
730
+ if kto[0] == 9
731
+ kto[0] = 0
732
+ kto[1] = 0
733
+ kto[2] = 0
734
+ end
735
+ ptr = 0
736
+ ptr += 1 while ptr < 10 && kto[ptr] == 0
737
+ i = 0
738
+ pz = 0
739
+ while ptr < 9
740
+ p1 = kto[ptr] * W24[i] + W24[i]
741
+ p1 %= 11 if p1 >= 11 # SUB1_22
742
+ pz += p1
743
+ ptr += 1
744
+ i += 1
745
+ end
746
+ pz %= 10
747
+ # CHECK_PZ10
748
+ if rv
749
+ rv.pz_pos = 10
750
+ rv.pz = pz
751
+ end
752
+ kto[9] == pz ? OK : FALSE
753
+ end
754
+
755
+ # Methode 25
756
+ # Modulus 11, Gewichtung 2 bis 9; Rest 1 nur fuer Konten mit 8 oder 9
757
+ # an der zweiten Stelle zulaessig.
758
+ def m25(kto, blz, um, rv)
759
+ if rv
760
+ rv.methode = "25"
761
+ rv.pz_methode = 25
762
+ end
763
+ pz = kto[1] * 9 +
764
+ kto[2] * 8 +
765
+ kto[3] * 7 +
766
+ kto[4] * 6 +
767
+ kto[5] * 5 +
768
+ kto[6] * 4 +
769
+ kto[7] * 3 +
770
+ kto[8] * 2
771
+ pz %= 11
772
+ pz = 11 - pz if pz != 0
773
+ if pz == 10
774
+ pz = 0
775
+ return INVALID_KTO if kto[1] != 8 && kto[1] != 9
776
+ end
777
+ # CHECK_PZ10
778
+ if rv
779
+ rv.pz_pos = 10
780
+ rv.pz = pz
781
+ end
782
+ kto[9] == pz ? OK : FALSE
783
+ end
784
+
785
+ # Methode 26
786
+ # Modulus 11, Gewichtung 2 bis 7 (plus 2); bei ausgelassener
787
+ # Unterkontonummer (Stellen 1 und 2 = 00) verschobene Berechnung.
788
+ def m26(kto, blz, um, rv)
789
+ if rv
790
+ rv.methode = "26"
791
+ rv.pz_methode = 26
792
+ end
793
+ if kto[0] == 0 && kto[1] == 0
794
+ # Unterkontonummer ausgelassen
795
+ pz = kto[2] * 2 +
796
+ kto[3] * 7 +
797
+ kto[4] * 6 +
798
+ kto[5] * 5 +
799
+ kto[6] * 4 +
800
+ kto[7] * 3 +
801
+ kto[8] * 2
802
+ pz %= 11
803
+ pz = if pz <= 1
804
+ 0
805
+ else
806
+ 11 - pz
807
+ end
808
+ # CHECK_PZ10
809
+ if rv
810
+ rv.pz_pos = 10
811
+ rv.pz = pz
812
+ end
813
+ kto[9] == pz ? OK : FALSE
814
+ else
815
+ pz = kto[0] * 2 +
816
+ kto[1] * 7 +
817
+ kto[2] * 6 +
818
+ kto[3] * 5 +
819
+ kto[4] * 4 +
820
+ kto[5] * 3 +
821
+ kto[6] * 2
822
+ pz %= 11
823
+ pz = if pz <= 1
824
+ 0
825
+ else
826
+ 11 - pz
827
+ end
828
+ # CHECK_PZ8
829
+ if rv
830
+ rv.pz_pos = 8
831
+ rv.pz = pz
832
+ end
833
+ kto[7] == pz ? OK : FALSE
834
+ end
835
+ end
836
+
837
+ # Methode 27
838
+ # Modulus 10, Gewichtung 2, 1, 2, 1, ... fuer Konten bis 999.999.999,
839
+ # sonst Modulus 10 iteriert (Methode 10h).
840
+ def m27(kto, blz, um, rv)
841
+ if rv
842
+ rv.methode = "27"
843
+ rv.pz_methode = 27
844
+ end
845
+ if kto[0] == 0 # Kontonummern von 1 bis 999.999.999
846
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
847
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
848
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
849
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
850
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
851
+ pz %= 10
852
+ else
853
+ pz = M10H_DIGITS[0][kto[0]] +
854
+ M10H_DIGITS[3][kto[1]] +
855
+ M10H_DIGITS[2][kto[2]] +
856
+ M10H_DIGITS[1][kto[3]] +
857
+ M10H_DIGITS[0][kto[4]] +
858
+ M10H_DIGITS[3][kto[5]] +
859
+ M10H_DIGITS[2][kto[6]] +
860
+ M10H_DIGITS[1][kto[7]] +
861
+ M10H_DIGITS[0][kto[8]]
862
+ pz %= 10
863
+ end
864
+ pz = 10 - pz if pz != 0
865
+ # CHECK_PZ10
866
+ if rv
867
+ rv.pz_pos = 10
868
+ rv.pz = pz
869
+ end
870
+ kto[9] == pz ? OK : FALSE
871
+ end
872
+
873
+ # Methode 28
874
+ # Modulus 11, Gewichtung 2 bis 8, Pruefziffer an Stelle 8.
875
+ def m28(kto, blz, um, rv)
876
+ if rv
877
+ rv.methode = "28"
878
+ rv.pz_methode = 28
879
+ end
880
+ pz = kto[0] * 8 +
881
+ kto[1] * 7 +
882
+ kto[2] * 6 +
883
+ kto[3] * 5 +
884
+ kto[4] * 4 +
885
+ kto[5] * 3 +
886
+ kto[6] * 2
887
+ pz %= 11
888
+ pz = if pz <= 1
889
+ 0
890
+ else
891
+ 11 - pz
892
+ end
893
+ # CHECK_PZ8
894
+ if rv
895
+ rv.pz_pos = 8
896
+ rv.pz = pz
897
+ end
898
+ kto[7] == pz ? OK : FALSE
899
+ end
900
+
901
+ # Methode 29
902
+ # Modulus 10 iteriert (Transformationstabelle, Methode 10h).
903
+ def m29(kto, blz, um, rv)
904
+ if rv
905
+ rv.methode = "29"
906
+ rv.pz_methode = 29
907
+ end
908
+ pz = M10H_DIGITS[0][kto[0]] +
909
+ M10H_DIGITS[3][kto[1]] +
910
+ M10H_DIGITS[2][kto[2]] +
911
+ M10H_DIGITS[1][kto[3]] +
912
+ M10H_DIGITS[0][kto[4]] +
913
+ M10H_DIGITS[3][kto[5]] +
914
+ M10H_DIGITS[2][kto[6]] +
915
+ M10H_DIGITS[1][kto[7]] +
916
+ M10H_DIGITS[0][kto[8]]
917
+ pz %= 10
918
+ pz = 10 - pz if pz != 0
919
+ # CHECK_PZ10
920
+ if rv
921
+ rv.pz_pos = 10
922
+ rv.pz = pz
923
+ end
924
+ kto[9] == pz ? OK : FALSE
925
+ end
926
+
927
+ # Methode 30
928
+ # Modulus 10, Gewichtung 2, 0, 0, 0, 0, 1, 2, 1, 2.
929
+ def m30(kto, blz, um, rv)
930
+ if rv
931
+ rv.methode = "30"
932
+ rv.pz_methode = 30
933
+ end
934
+ pz = kto[0] * 2 +
935
+ kto[5] +
936
+ kto[6] * 2 +
937
+ kto[7] +
938
+ kto[8] * 2
939
+ pz %= 10
940
+ pz = 10 - pz if pz != 0
941
+ # CHECK_PZ10
942
+ if rv
943
+ rv.pz_pos = 10
944
+ rv.pz = pz
945
+ end
946
+ kto[9] == pz ? OK : FALSE
947
+ end
948
+
949
+ # Methode 31
950
+ # Modulus 11, Gewichtung 9, 8, 7, 6, 5, 4, 3, 2, 1; Rest = Pruefziffer,
951
+ # Rest 10 -> Konto ungueltig.
952
+ def m31(kto, blz, um, rv)
953
+ if rv
954
+ rv.methode = "31"
955
+ rv.pz_methode = 31
956
+ end
957
+ pz = kto[0] +
958
+ kto[1] * 2 +
959
+ kto[2] * 3 +
960
+ kto[3] * 4 +
961
+ kto[4] * 5 +
962
+ kto[5] * 6 +
963
+ kto[6] * 7 +
964
+ kto[7] * 8 +
965
+ kto[8] * 9
966
+ pz %= 11
967
+ return INVALID_KTO if pz == 10
968
+ # CHECK_PZ10
969
+ if rv
970
+ rv.pz_pos = 10
971
+ rv.pz = pz
972
+ end
973
+ kto[9] == pz ? OK : FALSE
974
+ end
975
+
976
+ # Methode 32
977
+ # Modulus 11, Gewichtung 2 bis 7 ueber die Stellen 4 bis 9.
978
+ def m32(kto, blz, um, rv)
979
+ if rv
980
+ rv.methode = "32"
981
+ rv.pz_methode = 32
982
+ end
983
+ pz = kto[3] * 7 +
984
+ kto[4] * 6 +
985
+ kto[5] * 5 +
986
+ kto[6] * 4 +
987
+ kto[7] * 3 +
988
+ kto[8] * 2
989
+ pz %= 11
990
+ pz = if pz <= 1
991
+ 0
992
+ else
993
+ 11 - pz
994
+ end
995
+ # CHECK_PZ10
996
+ if rv
997
+ rv.pz_pos = 10
998
+ rv.pz = pz
999
+ end
1000
+ kto[9] == pz ? OK : FALSE
1001
+ end
1002
+
1003
+ # Methode 33
1004
+ # Modulus 11, Gewichtung 2 bis 6 ueber die Stellen 5 bis 9.
1005
+ def m33(kto, blz, um, rv)
1006
+ if rv
1007
+ rv.methode = "33"
1008
+ rv.pz_methode = 33
1009
+ end
1010
+ pz = kto[4] * 6 +
1011
+ kto[5] * 5 +
1012
+ kto[6] * 4 +
1013
+ kto[7] * 3 +
1014
+ kto[8] * 2
1015
+ pz %= 11
1016
+ pz = if pz <= 1
1017
+ 0
1018
+ else
1019
+ 11 - pz
1020
+ end
1021
+ # CHECK_PZ10
1022
+ if rv
1023
+ rv.pz_pos = 10
1024
+ rv.pz = pz
1025
+ end
1026
+ kto[9] == pz ? OK : FALSE
1027
+ end
1028
+
1029
+ # Methode 34
1030
+ # Modulus 11, Gewichtung 2, 4, 8, 5, 10, 9, 7, Pruefziffer Stelle 8.
1031
+ def m34(kto, blz, um, rv)
1032
+ if rv
1033
+ rv.methode = "34"
1034
+ rv.pz_methode = 34
1035
+ end
1036
+ pz = kto[0] * 7 +
1037
+ kto[1] * 9 +
1038
+ kto[2] * 10 +
1039
+ kto[3] * 5 +
1040
+ kto[4] * 8 +
1041
+ kto[5] * 4 +
1042
+ kto[6] * 2
1043
+ pz %= 11
1044
+ pz = if pz <= 1
1045
+ 0
1046
+ else
1047
+ 11 - pz
1048
+ end
1049
+ # CHECK_PZ8
1050
+ if rv
1051
+ rv.pz_pos = 8
1052
+ rv.pz = pz
1053
+ end
1054
+ kto[7] == pz ? OK : FALSE
1055
+ end
1056
+
1057
+ # Methode 35
1058
+ # Modulus 11, Gewichtung 2 bis 10; Rest = Pruefziffer, Rest 10 nur gueltig
1059
+ # wenn die Stellen 9 und 10 uebereinstimmen.
1060
+ def m35(kto, blz, um, rv)
1061
+ if rv
1062
+ rv.methode = "35"
1063
+ rv.pz_methode = 35
1064
+ end
1065
+ pz = kto[0] * 10 +
1066
+ kto[1] * 9 +
1067
+ kto[2] * 8 +
1068
+ kto[3] * 7 +
1069
+ kto[4] * 6 +
1070
+ kto[5] * 5 +
1071
+ kto[6] * 4 +
1072
+ kto[7] * 3 +
1073
+ kto[8] * 2
1074
+ pz %= 11
1075
+ if pz == 10
1076
+ if kto[8] == kto[9]
1077
+ return OK
1078
+ else
1079
+ return INVALID_KTO
1080
+ end
1081
+ end
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 36
1091
+ # Modulus 11, Gewichtung 2, 4, 8, 5 ueber die Stellen 6 bis 9.
1092
+ def m36(kto, blz, um, rv)
1093
+ if rv
1094
+ rv.methode = "36"
1095
+ rv.pz_methode = 36
1096
+ end
1097
+ pz = kto[5] * 5 +
1098
+ kto[6] * 8 +
1099
+ kto[7] * 4 +
1100
+ kto[8] * 2
1101
+ pz %= 11
1102
+ pz = if pz <= 1
1103
+ 0
1104
+ else
1105
+ 11 - pz
1106
+ end
1107
+ # CHECK_PZ10
1108
+ if rv
1109
+ rv.pz_pos = 10
1110
+ rv.pz = pz
1111
+ end
1112
+ kto[9] == pz ? OK : FALSE
1113
+ end
1114
+
1115
+ # Methode 37
1116
+ # Modulus 11, Gewichtung 2, 4, 8, 5, 10 ueber die Stellen 5 bis 9.
1117
+ def m37(kto, blz, um, rv)
1118
+ if rv
1119
+ rv.methode = "37"
1120
+ rv.pz_methode = 37
1121
+ end
1122
+ pz = kto[4] * 10 +
1123
+ kto[5] * 5 +
1124
+ kto[6] * 8 +
1125
+ kto[7] * 4 +
1126
+ kto[8] * 2
1127
+ pz %= 11
1128
+ pz = if pz <= 1
1129
+ 0
1130
+ else
1131
+ 11 - pz
1132
+ end
1133
+ # CHECK_PZ10
1134
+ if rv
1135
+ rv.pz_pos = 10
1136
+ rv.pz = pz
1137
+ end
1138
+ kto[9] == pz ? OK : FALSE
1139
+ end
1140
+
1141
+ # Methode 38
1142
+ # Modulus 11, Gewichtung 2, 4, 8, 5, 10, 9 ueber die Stellen 4 bis 9.
1143
+ def m38(kto, blz, um, rv)
1144
+ if rv
1145
+ rv.methode = "38"
1146
+ rv.pz_methode = 38
1147
+ end
1148
+ pz = kto[3] * 9 +
1149
+ kto[4] * 10 +
1150
+ kto[5] * 5 +
1151
+ kto[6] * 8 +
1152
+ kto[7] * 4 +
1153
+ kto[8] * 2
1154
+ pz %= 11
1155
+ pz = if pz <= 1
1156
+ 0
1157
+ else
1158
+ 11 - pz
1159
+ end
1160
+ # CHECK_PZ10
1161
+ if rv
1162
+ rv.pz_pos = 10
1163
+ rv.pz = pz
1164
+ end
1165
+ kto[9] == pz ? OK : FALSE
1166
+ end
1167
+
1168
+ # Methode 39
1169
+ # Modulus 11, Gewichtung 2, 4, 8, 5, 10, 9, 7 ueber die Stellen 3 bis 9.
1170
+ def m39(kto, blz, um, rv)
1171
+ if rv
1172
+ rv.methode = "39"
1173
+ rv.pz_methode = 39
1174
+ end
1175
+ pz = kto[2] * 7 +
1176
+ kto[3] * 9 +
1177
+ kto[4] * 10 +
1178
+ kto[5] * 5 +
1179
+ kto[6] * 8 +
1180
+ kto[7] * 4 +
1181
+ kto[8] * 2
1182
+ pz %= 11
1183
+ pz = if pz <= 1
1184
+ 0
1185
+ else
1186
+ 11 - pz
1187
+ end
1188
+ # CHECK_PZ10
1189
+ if rv
1190
+ rv.pz_pos = 10
1191
+ rv.pz = pz
1192
+ end
1193
+ kto[9] == pz ? OK : FALSE
1194
+ end
1195
+
1196
+ # Methode 40
1197
+ # Modulus 11, Gewichtung 2, 4, 8, 5, 10, 9, 7, 3, 6.
1198
+ def m40(kto, blz, um, rv)
1199
+ if rv
1200
+ rv.methode = "40"
1201
+ rv.pz_methode = 40
1202
+ end
1203
+ pz = kto[0] * 6 +
1204
+ kto[1] * 3 +
1205
+ kto[2] * 7 +
1206
+ kto[3] * 9 +
1207
+ kto[4] * 10 +
1208
+ kto[5] * 5 +
1209
+ kto[6] * 8 +
1210
+ kto[7] * 4 +
1211
+ kto[8] * 2
1212
+ pz %= 11
1213
+ pz = if pz <= 1
1214
+ 0
1215
+ else
1216
+ 11 - pz
1217
+ end
1218
+ # CHECK_PZ10
1219
+ if rv
1220
+ rv.pz_pos = 10
1221
+ rv.pz = pz
1222
+ end
1223
+ kto[9] == pz ? OK : FALSE
1224
+ end
1225
+
1226
+ # Methode 41
1227
+ # Wie Methode 00; bei einer 9 an der 4. Stelle werden nur die Stellen
1228
+ # 4 bis 9 einbezogen.
1229
+ def m41(kto, blz, um, rv)
1230
+ if rv
1231
+ rv.methode = "41"
1232
+ rv.pz_methode = 41
1233
+ end
1234
+ if kto[3] == 9
1235
+ pz = kto[3] + kto[5] + kto[7]
1236
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
1237
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
1238
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
1239
+ pz %= 10
1240
+ else
1241
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
1242
+ pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
1243
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
1244
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
1245
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
1246
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
1247
+ pz %= 10
1248
+ end
1249
+ pz %= 10
1250
+ pz = 10 - pz if pz != 0
1251
+ # CHECK_PZ10
1252
+ if rv
1253
+ rv.pz_pos = 10
1254
+ rv.pz = pz
1255
+ end
1256
+ kto[9] == pz ? OK : FALSE
1257
+ end
1258
+
1259
+ # Methode 42
1260
+ # Modulus 11, Gewichtung 2 bis 9 ueber die Stellen 2 bis 9.
1261
+ def m42(kto, blz, um, rv)
1262
+ if rv
1263
+ rv.methode = "42"
1264
+ rv.pz_methode = 42
1265
+ end
1266
+ pz = kto[1] * 9 +
1267
+ kto[2] * 8 +
1268
+ kto[3] * 7 +
1269
+ kto[4] * 6 +
1270
+ kto[5] * 5 +
1271
+ kto[6] * 4 +
1272
+ kto[7] * 3 +
1273
+ kto[8] * 2
1274
+ pz %= 11
1275
+ pz = if pz <= 1
1276
+ 0
1277
+ else
1278
+ 11 - pz
1279
+ end
1280
+ # CHECK_PZ10
1281
+ if rv
1282
+ rv.pz_pos = 10
1283
+ rv.pz = pz
1284
+ end
1285
+ kto[9] == pz ? OK : FALSE
1286
+ end
1287
+
1288
+ # Methode 43
1289
+ # Modulus 10, Gewichtung 1, 2, 3, 4, 5, 6, 7, 8, 9.
1290
+ def m43(kto, blz, um, rv)
1291
+ if rv
1292
+ rv.methode = "43"
1293
+ rv.pz_methode = 43
1294
+ end
1295
+ pz = kto[0] * 9 +
1296
+ kto[1] * 8 +
1297
+ kto[2] * 7 +
1298
+ kto[3] * 6 +
1299
+ kto[4] * 5 +
1300
+ kto[5] * 4 +
1301
+ kto[6] * 3 +
1302
+ kto[7] * 2 +
1303
+ kto[8]
1304
+ pz %= 10
1305
+ pz = 10 - pz if pz != 0
1306
+ # CHECK_PZ10
1307
+ if rv
1308
+ rv.pz_pos = 10
1309
+ rv.pz = pz
1310
+ end
1311
+ kto[9] == pz ? OK : FALSE
1312
+ end
1313
+
1314
+ # Methode 44
1315
+ # Modulus 11, Gewichtung 2, 4, 8, 5, 10 ueber die Stellen 5 bis 9;
1316
+ # Sonderfall der IBAN-Regel 49 (9 an Stelle 1 oder 5).
1317
+ def m44(kto, blz, um, rv)
1318
+ if rv
1319
+ rv.methode = "44"
1320
+ rv.pz_methode = 44
1321
+ end
1322
+ pz = kto[4] * 10 +
1323
+ kto[5] * 5 +
1324
+ kto[6] * 8 +
1325
+ kto[7] * 4 +
1326
+ kto[8] * 2
1327
+ pz %= 11
1328
+ pz = if pz <= 1
1329
+ 0
1330
+ else
1331
+ 11 - pz
1332
+ end
1333
+ # CHECK_PZX10
1334
+ if rv
1335
+ rv.pz_pos = 10
1336
+ rv.pz = pz
1337
+ end
1338
+ return OK if kto[9] == pz
1339
+ return FALSE if um != 0
1340
+ if kto[0] == 9 || kto[4] == 9
1341
+ OK_NO_CHK
1342
+ else
1343
+ FALSE
1344
+ end
1345
+ end
1346
+
1347
+ # Methode 45
1348
+ # Wie Methode 00; keine Pruefung bei einer 0 an Stelle 1 oder einer 1
1349
+ # an Stelle 5.
1350
+ def m45(kto, blz, um, rv)
1351
+ if rv
1352
+ rv.methode = "45"
1353
+ rv.pz_methode = 45
1354
+ end
1355
+ return OK_NO_CHK if kto[0] == 0 || kto[4] == 1
1356
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
1357
+ pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
1358
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
1359
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
1360
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
1361
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
1362
+ pz %= 10
1363
+ pz = 10 - pz if pz != 0
1364
+ # CHECK_PZ10
1365
+ if rv
1366
+ rv.pz_pos = 10
1367
+ rv.pz = pz
1368
+ end
1369
+ kto[9] == pz ? OK : FALSE
1370
+ end
1371
+
1372
+ # Methode 46
1373
+ # Modulus 11, Gewichtung 2 bis 6 ueber die Stellen 3 bis 7.
1374
+ def m46(kto, blz, um, rv)
1375
+ if rv
1376
+ rv.methode = "46"
1377
+ rv.pz_methode = 46
1378
+ end
1379
+ pz = kto[2] * 6 +
1380
+ kto[3] * 5 +
1381
+ kto[4] * 4 +
1382
+ kto[5] * 3 +
1383
+ kto[6] * 2
1384
+ pz %= 11
1385
+ pz = if pz <= 1
1386
+ 0
1387
+ else
1388
+ 11 - pz
1389
+ end
1390
+ # CHECK_PZ8
1391
+ if rv
1392
+ rv.pz_pos = 8
1393
+ rv.pz = pz
1394
+ end
1395
+ kto[7] == pz ? OK : FALSE
1396
+ end
1397
+
1398
+ # Methode 47
1399
+ # Modulus 11, Gewichtung 2 bis 6 ueber die Stellen 4 bis 8.
1400
+ def m47(kto, blz, um, rv)
1401
+ if rv
1402
+ rv.methode = "47"
1403
+ rv.pz_methode = 47
1404
+ end
1405
+ pz = kto[3] * 6 +
1406
+ kto[4] * 5 +
1407
+ kto[5] * 4 +
1408
+ kto[6] * 3 +
1409
+ kto[7] * 2
1410
+ pz %= 11
1411
+ pz = if pz <= 1
1412
+ 0
1413
+ else
1414
+ 11 - pz
1415
+ end
1416
+ # CHECK_PZ9
1417
+ if rv
1418
+ rv.pz_pos = 9
1419
+ rv.pz = pz
1420
+ end
1421
+ kto[8] == pz ? OK : FALSE
1422
+ end
1423
+
1424
+ # Methode 48
1425
+ # Modulus 11, Gewichtung 2 bis 7 ueber die Stellen 3 bis 8.
1426
+ def m48(kto, blz, um, rv)
1427
+ if rv
1428
+ rv.methode = "48"
1429
+ rv.pz_methode = 48
1430
+ end
1431
+ pz = kto[2] * 7 +
1432
+ kto[3] * 6 +
1433
+ kto[4] * 5 +
1434
+ kto[5] * 4 +
1435
+ kto[6] * 3 +
1436
+ kto[7] * 2
1437
+ pz %= 11
1438
+ pz = if pz <= 1
1439
+ 0
1440
+ else
1441
+ 11 - pz
1442
+ end
1443
+ # CHECK_PZ9
1444
+ if rv
1445
+ rv.pz_pos = 9
1446
+ rv.pz = pz
1447
+ end
1448
+ kto[8] == pz ? OK : FALSE
1449
+ end
1450
+
1451
+ # Methode 49
1452
+ def m49(kto, blz, um, rv)
1453
+ m1049(kto, blz, um, rv)
1454
+ end
1455
+
1456
+ # Methode 49a
1457
+ # Berechnung nach Methode 00.
1458
+ def m1049(kto, blz, um, rv)
1459
+ if rv
1460
+ rv.methode = "49a"
1461
+ rv.pz_methode = 1049
1462
+ end
1463
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
1464
+ pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
1465
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
1466
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
1467
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
1468
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
1469
+ pz %= 10
1470
+ pz = 10 - pz if pz != 0
1471
+ # CHECK_PZX10
1472
+ if rv
1473
+ rv.pz_pos = 10
1474
+ rv.pz = pz
1475
+ end
1476
+ return OK if kto[9] == pz
1477
+ return FALSE if um != 0
1478
+ m2049(kto, blz, um, rv)
1479
+ end
1480
+
1481
+ # Methode 49b
1482
+ # Berechnung nach Methode 01.
1483
+ def m2049(kto, blz, um, rv)
1484
+ if rv
1485
+ rv.methode = "49b"
1486
+ rv.pz_methode = 2049
1487
+ end
1488
+ pz = kto[0] +
1489
+ kto[1] * 7 +
1490
+ kto[2] * 3 +
1491
+ kto[3] +
1492
+ kto[4] * 7 +
1493
+ kto[5] * 3 +
1494
+ kto[6] +
1495
+ kto[7] * 7 +
1496
+ kto[8] * 3
1497
+ pz %= 10
1498
+ pz = 10 - pz if pz != 0
1499
+ # CHECK_PZ10
1500
+ if rv
1501
+ rv.pz_pos = 10
1502
+ rv.pz = pz
1503
+ end
1504
+ kto[9] == pz ? OK : FALSE
1505
+ end
1506
+
1507
+ # Methode 50
1508
+ def m50(kto, blz, um, rv)
1509
+ m1050(kto, blz, um, rv)
1510
+ end
1511
+
1512
+ # Methode 50a
1513
+ # Modulus 11, Gewichtung 2 bis 7 ueber die Stellen 1 bis 6,
1514
+ # Pruefziffer an Stelle 7.
1515
+ def m1050(kto, blz, um, rv)
1516
+ if rv
1517
+ rv.methode = "50a"
1518
+ rv.pz_methode = 1050
1519
+ end
1520
+ pz = kto[0] * 7 +
1521
+ kto[1] * 6 +
1522
+ kto[2] * 5 +
1523
+ kto[3] * 4 +
1524
+ kto[4] * 3 +
1525
+ kto[5] * 2
1526
+ pz %= 11
1527
+ pz = if pz <= 1
1528
+ 0
1529
+ else
1530
+ 11 - pz
1531
+ end
1532
+ # CHECK_PZX7
1533
+ if rv
1534
+ rv.pz_pos = 7
1535
+ rv.pz = pz
1536
+ end
1537
+ return OK if kto[6] == pz
1538
+ return FALSE if um != 0
1539
+ m2050(kto, blz, um, rv)
1540
+ end
1541
+
1542
+ # Methode 50b
1543
+ # Wie 50a, jedoch mit weggelassener Unterkontonummer (eine, zwei oder
1544
+ # drei Stellen).
1545
+ def m2050(kto, blz, um, rv)
1546
+ if rv
1547
+ rv.methode = "50b"
1548
+ rv.pz_methode = 2050
1549
+ end
1550
+ if kto[0] == 0 && kto[1] == 0 && kto[2] == 0
1551
+ pz = kto[3] * 7 +
1552
+ kto[4] * 6 +
1553
+ kto[5] * 5 +
1554
+ kto[6] * 4 +
1555
+ kto[7] * 3 +
1556
+ kto[8] * 2
1557
+ pz %= 11
1558
+ pz = if pz <= 1
1559
+ 0
1560
+ else
1561
+ 11 - pz
1562
+ end
1563
+ # CHECK_PZ10
1564
+ if rv
1565
+ rv.pz_pos = 10
1566
+ rv.pz = pz
1567
+ end
1568
+ kto[9] == pz ? OK : FALSE
1569
+ elsif kto[0] == 0 && kto[1] == 0 && kto[9] == 0
1570
+ pz = kto[2] * 7 +
1571
+ kto[3] * 6 +
1572
+ kto[4] * 5 +
1573
+ kto[5] * 4 +
1574
+ kto[6] * 3 +
1575
+ kto[7] * 2
1576
+ pz %= 11
1577
+ pz = if pz <= 1
1578
+ 0
1579
+ else
1580
+ 11 - pz
1581
+ end
1582
+ # CHECK_PZ9
1583
+ if rv
1584
+ rv.pz_pos = 9
1585
+ rv.pz = pz
1586
+ end
1587
+ kto[8] == pz ? OK : FALSE
1588
+ elsif kto[0] == 0 && kto[8] == 0 && kto[9] == 0
1589
+ pz = kto[1] * 7 +
1590
+ kto[2] * 6 +
1591
+ kto[3] * 5 +
1592
+ kto[4] * 4 +
1593
+ kto[5] * 3 +
1594
+ kto[6] * 2
1595
+ pz %= 11
1596
+ pz = if pz <= 1
1597
+ 0
1598
+ else
1599
+ 11 - pz
1600
+ end
1601
+ # CHECK_PZ8
1602
+ if rv
1603
+ rv.pz_pos = 8
1604
+ rv.pz = pz
1605
+ end
1606
+ kto[7] == pz ? OK : FALSE
1607
+ else
1608
+ # bei DEBUG wurde evl. direkt die Methode angesprungen; daher mit 50a testen
1609
+ if rv
1610
+ rv.methode = "50a"
1611
+ rv.pz_methode = 1050
1612
+ end
1613
+ pz = kto[0] * 7 +
1614
+ kto[1] * 6 +
1615
+ kto[2] * 5 +
1616
+ kto[3] * 4 +
1617
+ kto[4] * 3 +
1618
+ kto[5] * 2
1619
+ pz %= 11
1620
+ pz = if pz <= 1
1621
+ 0
1622
+ else
1623
+ 11 - pz
1624
+ end
1625
+ # CHECK_PZ7
1626
+ if rv
1627
+ rv.pz_pos = 7
1628
+ rv.pz = pz
1629
+ end
1630
+ kto[6] == pz ? OK : FALSE
1631
+ end
1632
+ end
1633
+ end
1634
+ end