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,1738 @@
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 der Prüfziffermethoden A0 bis C2 (numerisch 100 bis 122) aus
14
+ # kto_check_int() von konto_check.c.
15
+
16
+ module KontoCheckRuby
17
+ module CheckMethods
18
+ extend self
19
+
20
+ # Methode A0
21
+ # Modulus 11, Gewichtung 10, 5, 8, 4, 2 (Stellen 5 bis 9).
22
+ # Kontonummern, die mit 0000000 beginnen, werden nicht geprüft.
23
+ def m100(kto, blz, um, rv)
24
+ if rv
25
+ rv.methode = "A0"
26
+ rv.pz_methode = 100
27
+ end
28
+ return OK_NO_CHK if kto[0] == 0 && kto[1] == 0 && kto[2] == 0 && kto[3] == 0 &&
29
+ kto[4] == 0 && kto[5] == 0 && kto[6] == 0
30
+ pz = kto[4] * 10 +
31
+ kto[5] * 5 +
32
+ kto[6] * 8 +
33
+ kto[7] * 4 +
34
+ kto[8] * 2
35
+
36
+ pz %= 11
37
+ if pz <= 1
38
+ pz = 0
39
+ else
40
+ pz = 11 - pz
41
+ end
42
+ # CHECK_PZ10
43
+ if rv
44
+ rv.pz_pos = 10
45
+ rv.pz = pz
46
+ end
47
+ kto[9] == pz ? OK : FALSE
48
+ end
49
+
50
+ # Methode A1
51
+ # Modulus 10, Gewichtung 2, 1, 2, 1, 2, 1, 2 (Stellen 3 bis 9).
52
+ # Kontonummern mit 0 an Stelle 1 sind nur gültig, wenn Stelle 2 und 3
53
+ # nicht beide 0 sind bzw. Stelle 2 nicht 0 ist.
54
+ def m101(kto, blz, um, rv)
55
+ if rv
56
+ rv.methode = "A1"
57
+ rv.pz_methode = 101
58
+ end
59
+ if (kto[0] == 0 && kto[1] != 0) ||
60
+ (kto[0] == 0 && kto[1] == 0 && kto[2] == 0)
61
+ return INVALID_KTO
62
+ end
63
+
64
+ pz = kto[3] + kto[5] + kto[7]
65
+ if kto[2] < 5 then pz += kto[2] * 2 else pz += kto[2] * 2 - 9 end
66
+ if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
67
+ if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
68
+ if kto[8] < 5 then pz += kto[8] * 2 else pz += kto[8] * 2 - 9 end
69
+
70
+ pz %= 10
71
+ pz = 10 - pz if pz != 0
72
+ # CHECK_PZ10
73
+ if rv
74
+ rv.pz_pos = 10
75
+ rv.pz = pz
76
+ end
77
+ kto[9] == pz ? OK : FALSE
78
+ end
79
+
80
+ # Methode A2: Variante 1 nach Methode 00, Variante 2 nach Methode 04.
81
+ def m102(kto, blz, um, rv)
82
+ m1102(kto, blz, um, rv)
83
+ end
84
+
85
+ # Methode A2, Variante 1 (Methode 00)
86
+ def m1102(kto, blz, um, rv)
87
+ if rv
88
+ rv.methode = "A2a"
89
+ rv.pz_methode = 1102
90
+ end
91
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
92
+ if kto[0] < 5 then pz += kto[0] * 2 else pz += kto[0] * 2 - 9 end
93
+ if kto[2] < 5 then pz += kto[2] * 2 else pz += kto[2] * 2 - 9 end
94
+ if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
95
+ if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
96
+ if kto[8] < 5 then pz += kto[8] * 2 else pz += kto[8] * 2 - 9 end
97
+
98
+ pz %= 10
99
+ pz = 10 - pz if pz != 0
100
+ # CHECK_PZX10
101
+ if rv
102
+ rv.pz_pos = 10
103
+ rv.pz = pz
104
+ end
105
+ return OK if kto[9] == pz
106
+ return FALSE if um != 0
107
+ m2102(kto, blz, um, rv)
108
+ end
109
+
110
+ # Methode A2, Variante 2 (Methode 04)
111
+ def m2102(kto, blz, um, rv)
112
+ if rv
113
+ rv.methode = "A2b"
114
+ rv.pz_methode = 2102
115
+ end
116
+ pz = kto[0] * 4 +
117
+ kto[1] * 3 +
118
+ kto[2] * 2 +
119
+ kto[3] * 7 +
120
+ kto[4] * 6 +
121
+ kto[5] * 5 +
122
+ kto[6] * 4 +
123
+ kto[7] * 3 +
124
+ kto[8] * 2
125
+
126
+ pz %= 11
127
+ pz = 11 - pz if pz != 0
128
+ # INVALID_PZ10
129
+ if rv
130
+ rv.pz_pos = 10
131
+ rv.pz = pz
132
+ end
133
+ return INVALID_KTO if pz == 10
134
+ # CHECK_PZ10
135
+ if rv
136
+ rv.pz_pos = 10
137
+ rv.pz = pz
138
+ end
139
+ kto[9] == pz ? OK : FALSE
140
+ end
141
+
142
+ # Methode A3: Variante 1 nach Methode 00, Variante 2 nach Methode 10.
143
+ def m103(kto, blz, um, rv)
144
+ m1103(kto, blz, um, rv)
145
+ end
146
+
147
+ # Methode A3, Variante 1 (Methode 00)
148
+ def m1103(kto, blz, um, rv)
149
+ if rv
150
+ rv.methode = "A3a"
151
+ rv.pz_methode = 1103
152
+ end
153
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
154
+ if kto[0] < 5 then pz += kto[0] * 2 else pz += kto[0] * 2 - 9 end
155
+ if kto[2] < 5 then pz += kto[2] * 2 else pz += kto[2] * 2 - 9 end
156
+ if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
157
+ if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
158
+ if kto[8] < 5 then pz += kto[8] * 2 else pz += kto[8] * 2 - 9 end
159
+
160
+ pz %= 10
161
+ pz = 10 - pz if pz != 0
162
+ # CHECK_PZX10
163
+ if rv
164
+ rv.pz_pos = 10
165
+ rv.pz = pz
166
+ end
167
+ return OK if kto[9] == pz
168
+ return FALSE if um != 0
169
+ m2103(kto, blz, um, rv)
170
+ end
171
+
172
+ # Methode A3, Variante 2 (Methode 10)
173
+ def m2103(kto, blz, um, rv)
174
+ if rv
175
+ rv.methode = "A3b"
176
+ rv.pz_methode = 2103
177
+ end
178
+ pz = kto[0] * 10 +
179
+ kto[1] * 9 +
180
+ kto[2] * 8 +
181
+ kto[3] * 7 +
182
+ kto[4] * 6 +
183
+ kto[5] * 5 +
184
+ kto[6] * 4 +
185
+ kto[7] * 3 +
186
+ kto[8] * 2
187
+
188
+ pz %= 11
189
+ if pz <= 1
190
+ pz = 0
191
+ else
192
+ pz = 11 - pz
193
+ end
194
+ # CHECK_PZ10
195
+ if rv
196
+ rv.pz_pos = 10
197
+ rv.pz = pz
198
+ end
199
+ kto[9] == pz ? OK : FALSE
200
+ end
201
+
202
+ # Methode A4: vier bzw. fünf Varianten; Variante 1/2 wenn Stelle 3 und 4
203
+ # nicht beide 9 sind, sonst Variante 3. Danach Methode 93 (Var. 4 und 5).
204
+ def m104(kto, blz, um, rv)
205
+ if kto[2] != 9 || kto[3] != 9
206
+ m1104(kto, blz, um, rv)
207
+ else
208
+ m3104(kto, blz, um, rv)
209
+ end
210
+ end
211
+
212
+ # Methode A4, Variante 1 (Modulus 11, Gewichtung 7, 6, 5, 4, 3, 2)
213
+ def m1104(kto, blz, um, rv)
214
+ if rv
215
+ rv.methode = "A4a"
216
+ rv.pz_methode = 1104
217
+ end
218
+ pz = kto[3] * 7 +
219
+ kto[4] * 6 +
220
+ kto[5] * 5 +
221
+ kto[6] * 4 +
222
+ kto[7] * 3 +
223
+ kto[8] * 2
224
+
225
+ pz %= 11
226
+ if pz <= 1
227
+ pz = 0
228
+ else
229
+ pz = 11 - pz
230
+ end
231
+ # CHECK_PZX10
232
+ if rv
233
+ rv.pz_pos = 10
234
+ rv.pz = pz
235
+ end
236
+ return OK if kto[9] == pz
237
+ return FALSE if um != 0
238
+ m2104(kto, blz, um, rv)
239
+ end
240
+
241
+ # Methode A4, Variante 2 (Modulus 7, Gewichtung 7, 6, 5, 4, 3, 2)
242
+ def m2104(kto, blz, um, rv)
243
+ if rv
244
+ rv.methode = "A4b"
245
+ rv.pz_methode = 2104
246
+ end
247
+ pz = kto[3] * 7 +
248
+ kto[4] * 6 +
249
+ kto[5] * 5 +
250
+ kto[6] * 4 +
251
+ kto[7] * 3 +
252
+ kto[8] * 2
253
+
254
+ pz %= 7
255
+ pz = 7 - pz if pz != 0
256
+ # CHECK_PZX10
257
+ if rv
258
+ rv.pz_pos = 10
259
+ rv.pz = pz
260
+ end
261
+ return OK if kto[9] == pz
262
+ return FALSE if um != 0
263
+ m4104(kto, blz, um, rv)
264
+ end
265
+
266
+ # Methode A4, Variante 3 (3. und 4. Stelle sind 9)
267
+ def m3104(kto, blz, um, rv)
268
+ if rv
269
+ rv.methode = "A4c"
270
+ rv.pz_methode = 3104
271
+ end
272
+ pz = kto[4] * 6 +
273
+ kto[5] * 5 +
274
+ kto[6] * 4 +
275
+ kto[7] * 3 +
276
+ kto[8] * 2
277
+
278
+ pz %= 11
279
+ if pz <= 1
280
+ pz = 0
281
+ else
282
+ pz = 11 - pz
283
+ end
284
+ # CHECK_PZX10
285
+ if rv
286
+ rv.pz_pos = 10
287
+ rv.pz = pz
288
+ end
289
+ return OK if kto[9] == pz
290
+ return FALSE if um != 0
291
+ m4104(kto, blz, um, rv)
292
+ end
293
+
294
+ # Methode A4, Variante 4 (Methode 93, Variante 1)
295
+ def m4104(kto, blz, um, rv)
296
+ if rv
297
+ rv.methode = "A4d"
298
+ rv.pz_methode = 4104
299
+ end
300
+ if kto[0] == 0 && kto[1] == 0 && kto[2] == 0 && kto[3] == 0 # Fall b)
301
+ pz = kto[4] * 6 +
302
+ kto[5] * 5 +
303
+ kto[6] * 4 +
304
+ kto[7] * 3 +
305
+ kto[8] * 2
306
+ p1 = pz
307
+ pz %= 11
308
+ else
309
+ pz = kto[0] * 6 +
310
+ kto[1] * 5 +
311
+ kto[2] * 4 +
312
+ kto[3] * 3 +
313
+ kto[4] * 2
314
+ kto[9] = kto[5] # Prüfziffer nach Stelle 10
315
+ p1 = pz
316
+ pz %= 11
317
+ end
318
+ if pz <= 1
319
+ pz = 0
320
+ else
321
+ pz = 11 - pz
322
+ end
323
+ # CHECK_PZX10
324
+ if rv
325
+ rv.pz_pos = 10
326
+ rv.pz = pz
327
+ end
328
+ return OK if kto[9] == pz
329
+ return FALSE if um != 0
330
+ m5104(kto, blz, um, rv, p1)
331
+ end
332
+
333
+ # Methode A4, Variante 5 (Methode 93, Variante 2)
334
+ def m5104(kto, blz, um, rv, p1 = 0)
335
+ if rv
336
+ rv.methode = "A4e"
337
+ rv.pz_methode = 5104
338
+ end
339
+ if um != 0 # pz wurde noch nicht berechnet
340
+ if kto[0] == 0 && kto[1] == 0 && kto[2] == 0 && kto[3] == 0 # Fall b)
341
+ p1 = kto[8] * W93[0] +
342
+ kto[7] * W93[1] +
343
+ kto[6] * W93[2] +
344
+ kto[5] * W93[3] +
345
+ kto[4] * W93[4]
346
+ else
347
+ p1 = kto[4] * W93[0] +
348
+ kto[3] * W93[1] +
349
+ kto[2] * W93[2] +
350
+ kto[1] * W93[3] +
351
+ kto[0] * W93[4]
352
+ kto[9] = kto[5] # Prüfziffer nach Stelle 10
353
+ end
354
+ end
355
+ pz = p1 % 7
356
+ pz = 7 - pz if pz != 0
357
+ # CHECK_PZ10
358
+ if rv
359
+ rv.pz_pos = 10
360
+ rv.pz = pz
361
+ end
362
+ kto[9] == pz ? OK : FALSE
363
+ end
364
+
365
+ # Methode A5: Variante 1 nach Methode 00, Variante 2 nach Methode 10.
366
+ # Bei Kontonummern mit 9 an Stelle 1 ist nur Variante 1 zulässig.
367
+ def m105(kto, blz, um, rv)
368
+ m1105(kto, blz, um, rv)
369
+ end
370
+
371
+ # Methode A5, Variante 1 (Methode 00)
372
+ def m1105(kto, blz, um, rv)
373
+ if rv
374
+ rv.methode = "A5a"
375
+ rv.pz_methode = 1105
376
+ end
377
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
378
+ if kto[0] < 5 then pz += kto[0] * 2 else pz += kto[0] * 2 - 9 end
379
+ if kto[2] < 5 then pz += kto[2] * 2 else pz += kto[2] * 2 - 9 end
380
+ if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
381
+ if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
382
+ if kto[8] < 5 then pz += kto[8] * 2 else pz += kto[8] * 2 - 9 end
383
+
384
+ pz %= 10
385
+ pz = 10 - pz if pz != 0
386
+ # CHECK_PZX10
387
+ if rv
388
+ rv.pz_pos = 10
389
+ rv.pz = pz
390
+ end
391
+ return OK if kto[9] == pz
392
+ return FALSE if um != 0
393
+ return INVALID_KTO if kto[0] == 9
394
+ m2105(kto, blz, um, rv)
395
+ end
396
+
397
+ # Methode A5, Variante 2 (Methode 10)
398
+ def m2105(kto, blz, um, rv)
399
+ if rv
400
+ rv.methode = "A5b"
401
+ rv.pz_methode = 2105
402
+ end
403
+ pz = kto[0] * 10 +
404
+ kto[1] * 9 +
405
+ kto[2] * 8 +
406
+ kto[3] * 7 +
407
+ kto[4] * 6 +
408
+ kto[5] * 5 +
409
+ kto[6] * 4 +
410
+ kto[7] * 3 +
411
+ kto[8] * 2
412
+
413
+ pz %= 11
414
+ if pz <= 1
415
+ pz = 0
416
+ else
417
+ pz = 11 - pz
418
+ end
419
+ # CHECK_PZ10
420
+ if rv
421
+ rv.pz_pos = 10
422
+ rv.pz = pz
423
+ end
424
+ kto[9] == pz ? OK : FALSE
425
+ end
426
+
427
+ # Methode A6: Variante 1 (Methode 00) wenn Stelle 2 eine 8 ist,
428
+ # sonst Variante 2 (Methode 01).
429
+ def m106(kto, blz, um, rv)
430
+ if kto[1] == 8
431
+ m1106(kto, blz, um, rv)
432
+ else
433
+ m2106(kto, blz, um, rv)
434
+ end
435
+ end
436
+
437
+ # Methode A6, Variante 1 (Methode 00)
438
+ def m1106(kto, blz, um, rv)
439
+ if rv
440
+ rv.methode = "A6a"
441
+ rv.pz_methode = 1106
442
+ end
443
+ pz = 8 + kto[3] + kto[5] + kto[7]
444
+ if kto[0] < 5 then pz += kto[0] * 2 else pz += kto[0] * 2 - 9 end
445
+ if kto[2] < 5 then pz += kto[2] * 2 else pz += kto[2] * 2 - 9 end
446
+ if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
447
+ if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
448
+ if kto[8] < 5 then pz += kto[8] * 2 else pz += kto[8] * 2 - 9 end
449
+
450
+ pz %= 10
451
+ pz = 10 - pz if pz != 0
452
+ # CHECK_PZ10
453
+ if rv
454
+ rv.pz_pos = 10
455
+ rv.pz = pz
456
+ end
457
+ kto[9] == pz ? OK : FALSE
458
+ end
459
+
460
+ # Methode A6, Variante 2 (Methode 01)
461
+ def m2106(kto, blz, um, rv)
462
+ if rv
463
+ rv.methode = "A6b"
464
+ rv.pz_methode = 2106
465
+ end
466
+ pz = kto[0] +
467
+ kto[1] * 7 +
468
+ kto[2] * 3 +
469
+ kto[3] +
470
+ kto[4] * 7 +
471
+ kto[5] * 3 +
472
+ kto[6] +
473
+ kto[7] * 7 +
474
+ kto[8] * 3
475
+
476
+ pz %= 10
477
+ pz = 10 - pz if pz != 0
478
+ # CHECK_PZ10
479
+ if rv
480
+ rv.pz_pos = 10
481
+ rv.pz = pz
482
+ end
483
+ kto[9] == pz ? OK : FALSE
484
+ end
485
+
486
+ # Methode A7: Variante 1 nach Methode 00, Variante 2 nach Methode 03.
487
+ def m107(kto, blz, um, rv)
488
+ m1107(kto, blz, um, rv)
489
+ end
490
+
491
+ # Methode A7, Variante 1 (Methode 00)
492
+ def m1107(kto, blz, um, rv)
493
+ if rv
494
+ rv.methode = "A7a"
495
+ rv.pz_methode = 1107
496
+ end
497
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
498
+ if kto[0] < 5 then pz += kto[0] * 2 else pz += kto[0] * 2 - 9 end
499
+ if kto[2] < 5 then pz += kto[2] * 2 else pz += kto[2] * 2 - 9 end
500
+ if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
501
+ if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
502
+ if kto[8] < 5 then pz += kto[8] * 2 else pz += kto[8] * 2 - 9 end
503
+
504
+ pz %= 10
505
+ pz = 10 - pz if pz != 0
506
+ # CHECK_PZX10
507
+ if rv
508
+ rv.pz_pos = 10
509
+ rv.pz = pz
510
+ end
511
+ return OK if kto[9] == pz
512
+ return FALSE if um != 0
513
+ m2107(kto, blz, um, rv)
514
+ end
515
+
516
+ # Methode A7, Variante 2 (Gewichtung 2, 1, 2, 1, ... ohne Quersumme)
517
+ def m2107(kto, blz, um, rv)
518
+ if rv
519
+ rv.methode = "A7b"
520
+ rv.pz_methode = 2107
521
+ end
522
+ pz = kto[0] * 2 +
523
+ kto[1] +
524
+ kto[2] * 2 +
525
+ kto[3] +
526
+ kto[4] * 2 +
527
+ kto[5] +
528
+ kto[6] * 2 +
529
+ kto[7] +
530
+ kto[8] * 2
531
+
532
+ pz %= 10
533
+ pz = 10 - pz if pz != 0
534
+ # CHECK_PZ10
535
+ if rv
536
+ rv.pz_pos = 10
537
+ rv.pz = pz
538
+ end
539
+ kto[9] == pz ? OK : FALSE
540
+ end
541
+
542
+ # Methode A8: bei 9 an Stelle 3 zuerst die Ausnahmevarianten c und d
543
+ # (Methode 51 bzw. 10), sonst die Varianten a (Methode 32) und b.
544
+ def m108(kto, blz, um, rv)
545
+ if kto[2] == 9
546
+ m3108(kto, blz, um, rv)
547
+ else
548
+ m1108(kto, blz, um, rv)
549
+ end
550
+ end
551
+
552
+ # Methode A8, Ausnahme Variante 1 (wie Verfahren 51)
553
+ def m3108(kto, blz, um, rv)
554
+ if rv
555
+ rv.methode = "A8c"
556
+ rv.pz_methode = 3108
557
+ end
558
+ pz = 9 * 8 +
559
+ kto[3] * 7 +
560
+ kto[4] * 6 +
561
+ kto[5] * 5 +
562
+ kto[6] * 4 +
563
+ kto[7] * 3 +
564
+ kto[8] * 2
565
+
566
+ pz %= 11
567
+ if pz <= 1
568
+ pz = 0
569
+ else
570
+ pz = 11 - pz
571
+ end
572
+ # CHECK_PZX10
573
+ if rv
574
+ rv.pz_pos = 10
575
+ rv.pz = pz
576
+ end
577
+ return OK if kto[9] == pz
578
+ return FALSE if um != 0
579
+ m4108(kto, blz, um, rv)
580
+ end
581
+
582
+ # Methode A8, Ausnahme Variante 2 (Methode 10)
583
+ def m4108(kto, blz, um, rv)
584
+ if rv
585
+ rv.methode = "A8d"
586
+ rv.pz_methode = 4108
587
+ end
588
+ pz = kto[0] * 10 +
589
+ kto[1] * 9 +
590
+ kto[2] * 8 +
591
+ kto[3] * 7 +
592
+ kto[4] * 6 +
593
+ kto[5] * 5 +
594
+ kto[6] * 4 +
595
+ kto[7] * 3 +
596
+ kto[8] * 2
597
+
598
+ pz %= 11
599
+ if pz <= 1
600
+ pz = 0
601
+ else
602
+ pz = 11 - pz
603
+ end
604
+ # CHECK_PZ10
605
+ if rv
606
+ rv.pz_pos = 10
607
+ rv.pz = pz
608
+ end
609
+ kto[9] == pz ? OK : FALSE
610
+ end
611
+
612
+ # Methode A8, Variante 1 (Methode 32)
613
+ def m1108(kto, blz, um, rv)
614
+ if rv
615
+ rv.methode = "A8a"
616
+ rv.pz_methode = 1108
617
+ end
618
+ pz = kto[3] * 7 +
619
+ kto[4] * 6 +
620
+ kto[5] * 5 +
621
+ kto[6] * 4 +
622
+ kto[7] * 3 +
623
+ kto[8] * 2
624
+
625
+ pz %= 11
626
+ if pz <= 1
627
+ pz = 0
628
+ else
629
+ pz = 11 - pz
630
+ end
631
+ # CHECK_PZX10
632
+ if rv
633
+ rv.pz_pos = 10
634
+ rv.pz = pz
635
+ end
636
+ return OK if kto[9] == pz
637
+ return FALSE if um != 0
638
+ m2108(kto, blz, um, rv)
639
+ end
640
+
641
+ # Methode A8, Variante 2 (Methode 00 über die Stellen 4 bis 9)
642
+ def m2108(kto, blz, um, rv)
643
+ if rv
644
+ rv.methode = "A8b"
645
+ rv.pz_methode = 2108
646
+ end
647
+ pz = kto[3] + kto[5] + kto[7]
648
+ if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
649
+ if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
650
+ if kto[8] < 5 then pz += kto[8] * 2 else pz += kto[8] * 2 - 9 end
651
+
652
+ pz %= 10
653
+ pz = 10 - pz if pz != 0
654
+ # CHECK_PZ10
655
+ if rv
656
+ rv.pz_pos = 10
657
+ rv.pz = pz
658
+ end
659
+ kto[9] == pz ? OK : FALSE
660
+ end
661
+
662
+ # Methode A9: Variante 1 nach Methode 01, Variante 2 nach Methode 06.
663
+ def m109(kto, blz, um, rv)
664
+ m1109(kto, blz, um, rv)
665
+ end
666
+
667
+ # Methode A9, Variante 1 (Methode 01)
668
+ def m1109(kto, blz, um, rv)
669
+ if rv
670
+ rv.methode = "A9a"
671
+ rv.pz_methode = 1109
672
+ end
673
+ pz = kto[0] +
674
+ kto[1] * 7 +
675
+ kto[2] * 3 +
676
+ kto[3] +
677
+ kto[4] * 7 +
678
+ kto[5] * 3 +
679
+ kto[6] +
680
+ kto[7] * 7 +
681
+ kto[8] * 3
682
+
683
+ pz %= 10
684
+ pz = 10 - pz if pz != 0
685
+ # CHECK_PZX10
686
+ if rv
687
+ rv.pz_pos = 10
688
+ rv.pz = pz
689
+ end
690
+ return OK if kto[9] == pz
691
+ return FALSE if um != 0
692
+ m2109(kto, blz, um, rv)
693
+ end
694
+
695
+ # Methode A9, Variante 2 (Methode 06)
696
+ def m2109(kto, blz, um, rv)
697
+ if rv
698
+ rv.methode = "A9b"
699
+ rv.pz_methode = 2109
700
+ end
701
+ pz = kto[0] * 4 +
702
+ kto[1] * 3 +
703
+ kto[2] * 2 +
704
+ kto[3] * 7 +
705
+ kto[4] * 6 +
706
+ kto[5] * 5 +
707
+ kto[6] * 4 +
708
+ kto[7] * 3 +
709
+ kto[8] * 2
710
+
711
+ pz %= 11
712
+ if pz <= 1
713
+ pz = 0
714
+ else
715
+ pz = 11 - pz
716
+ end
717
+ # CHECK_PZ10
718
+ if rv
719
+ rv.pz_pos = 10
720
+ rv.pz = pz
721
+ end
722
+ kto[9] == pz ? OK : FALSE
723
+ end
724
+
725
+ # Methode B0
726
+ # Kontonummern mit 0 oder 8 an Stelle 1 sind ungültig. Bei 1, 2, 3 oder 6
727
+ # an Stelle 8 entfällt die Prüfung, sonst Methode 06.
728
+ def m110(kto, blz, um, rv)
729
+ if rv
730
+ rv.methode = "B0"
731
+ rv.pz_methode = 110
732
+ end
733
+ return INVALID_KTO if kto[0] == 0 || kto[0] == 8
734
+
735
+ if kto[7] == 1 || kto[7] == 2 || kto[7] == 3 || kto[7] == 6
736
+ m1110(kto, blz, um, rv)
737
+ else
738
+ m2110(kto, blz, um, rv)
739
+ end
740
+ end
741
+
742
+ # Methode B0, Variante 1 (keine Prüfung)
743
+ def m1110(kto, blz, um, rv)
744
+ if rv
745
+ rv.methode = "B0a"
746
+ rv.pz_methode = 1110
747
+ end
748
+ OK_NO_CHK
749
+ end
750
+
751
+ # Methode B0, Variante 2 (Methode 06)
752
+ def m2110(kto, blz, um, rv)
753
+ if rv
754
+ rv.methode = "B0b"
755
+ rv.pz_methode = 2110
756
+ end
757
+ pz = kto[0] * 4 +
758
+ kto[1] * 3 +
759
+ kto[2] * 2 +
760
+ kto[3] * 7 +
761
+ kto[4] * 6 +
762
+ kto[5] * 5 +
763
+ kto[6] * 4 +
764
+ kto[7] * 3 +
765
+ kto[8] * 2
766
+
767
+ pz %= 11
768
+ if pz <= 1
769
+ pz = 0
770
+ else
771
+ pz = 11 - pz
772
+ end
773
+ # CHECK_PZ10
774
+ if rv
775
+ rv.pz_pos = 10
776
+ rv.pz = pz
777
+ end
778
+ kto[9] == pz ? OK : FALSE
779
+ end
780
+
781
+ # Methode B1: Varianten nach den Methoden 05, 01 und 00.
782
+ def m111(kto, blz, um, rv)
783
+ m1111(kto, blz, um, rv)
784
+ end
785
+
786
+ # Methode B1, Variante 1 (Methode 05)
787
+ def m1111(kto, blz, um, rv)
788
+ if rv
789
+ rv.methode = "B1a"
790
+ rv.pz_methode = 1111
791
+ end
792
+ pz = kto[0] +
793
+ kto[1] * 3 +
794
+ kto[2] * 7 +
795
+ kto[3] +
796
+ kto[4] * 3 +
797
+ kto[5] * 7 +
798
+ kto[6] +
799
+ kto[7] * 3 +
800
+ kto[8] * 7
801
+
802
+ pz %= 10
803
+ pz = 10 - pz if pz != 0
804
+ # CHECK_PZX10
805
+ if rv
806
+ rv.pz_pos = 10
807
+ rv.pz = pz
808
+ end
809
+ return OK if kto[9] == pz
810
+ return FALSE if um != 0
811
+ m2111(kto, blz, um, rv)
812
+ end
813
+
814
+ # Methode B1, Variante 2 (Methode 01)
815
+ def m2111(kto, blz, um, rv)
816
+ if rv
817
+ rv.methode = "B1b"
818
+ rv.pz_methode = 2111
819
+ end
820
+ pz = kto[0] +
821
+ kto[1] * 7 +
822
+ kto[2] * 3 +
823
+ kto[3] +
824
+ kto[4] * 7 +
825
+ kto[5] * 3 +
826
+ kto[6] +
827
+ kto[7] * 7 +
828
+ kto[8] * 3
829
+
830
+ pz %= 10
831
+ pz = 10 - pz if pz != 0
832
+ # CHECK_PZX10
833
+ if rv
834
+ rv.pz_pos = 10
835
+ rv.pz = pz
836
+ end
837
+ return OK if kto[9] == pz
838
+ return FALSE if um != 0
839
+ m3111(kto, blz, um, rv)
840
+ end
841
+
842
+ # Methode B1, Variante 3 (Methode 00)
843
+ def m3111(kto, blz, um, rv)
844
+ if rv
845
+ rv.methode = "B1c"
846
+ rv.pz_methode = 3111
847
+ end
848
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
849
+ if kto[0] < 5 then pz += kto[0] * 2 else pz += kto[0] * 2 - 9 end
850
+ if kto[2] < 5 then pz += kto[2] * 2 else pz += kto[2] * 2 - 9 end
851
+ if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
852
+ if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
853
+ if kto[8] < 5 then pz += kto[8] * 2 else pz += kto[8] * 2 - 9 end
854
+
855
+ pz %= 10
856
+ pz = 10 - pz if pz != 0
857
+ # CHECK_PZ10
858
+ if rv
859
+ rv.pz_pos = 10
860
+ rv.pz = pz
861
+ end
862
+ kto[9] == pz ? OK : FALSE
863
+ end
864
+
865
+ # Methode B2: bei Stelle 1 kleiner 8 Methode 02, sonst Methode 00.
866
+ def m112(kto, blz, um, rv)
867
+ if kto[0] < 8
868
+ m1112(kto, blz, um, rv)
869
+ else
870
+ m2112(kto, blz, um, rv)
871
+ end
872
+ end
873
+
874
+ # Methode B2, Variante 1 (Methode 02)
875
+ def m1112(kto, blz, um, rv)
876
+ if rv
877
+ rv.methode = "B2a"
878
+ rv.pz_methode = 1112
879
+ end
880
+ pz = kto[0] * 2 +
881
+ kto[1] * 9 +
882
+ kto[2] * 8 +
883
+ kto[3] * 7 +
884
+ kto[4] * 6 +
885
+ kto[5] * 5 +
886
+ kto[6] * 4 +
887
+ kto[7] * 3 +
888
+ kto[8] * 2
889
+
890
+ pz %= 11
891
+ pz = 11 - pz if pz != 0
892
+ # INVALID_PZ10
893
+ if rv
894
+ rv.pz_pos = 10
895
+ rv.pz = pz
896
+ end
897
+ return INVALID_KTO if pz == 10
898
+ # CHECK_PZ10
899
+ if rv
900
+ rv.pz_pos = 10
901
+ rv.pz = pz
902
+ end
903
+ kto[9] == pz ? OK : FALSE
904
+ end
905
+
906
+ # Methode B2, Variante 2 (Methode 00)
907
+ def m2112(kto, blz, um, rv)
908
+ if rv
909
+ rv.methode = "B2b"
910
+ rv.pz_methode = 2112
911
+ end
912
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
913
+ if kto[0] < 5 then pz += kto[0] * 2 else pz += kto[0] * 2 - 9 end
914
+ if kto[2] < 5 then pz += kto[2] * 2 else pz += kto[2] * 2 - 9 end
915
+ if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
916
+ if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
917
+ if kto[8] < 5 then pz += kto[8] * 2 else pz += kto[8] * 2 - 9 end
918
+
919
+ pz %= 10
920
+ pz = 10 - pz if pz != 0
921
+ # CHECK_PZ10
922
+ if rv
923
+ rv.pz_pos = 10
924
+ rv.pz = pz
925
+ end
926
+ kto[9] == pz ? OK : FALSE
927
+ end
928
+
929
+ # Methode B3: bei Stelle 1 kleiner 9 Methode 32, sonst Methode 06.
930
+ def m113(kto, blz, um, rv)
931
+ if kto[0] < 9
932
+ m1113(kto, blz, um, rv)
933
+ else
934
+ m2113(kto, blz, um, rv)
935
+ end
936
+ end
937
+
938
+ # Methode B3, Variante 1 (Methode 32)
939
+ def m1113(kto, blz, um, rv)
940
+ if rv
941
+ rv.methode = "B3a"
942
+ rv.pz_methode = 1113
943
+ end
944
+ pz = kto[3] * 7 +
945
+ kto[4] * 6 +
946
+ kto[5] * 5 +
947
+ kto[6] * 4 +
948
+ kto[7] * 3 +
949
+ kto[8] * 2
950
+
951
+ pz %= 11
952
+ if pz <= 1
953
+ pz = 0
954
+ else
955
+ pz = 11 - pz
956
+ end
957
+ # CHECK_PZ10
958
+ if rv
959
+ rv.pz_pos = 10
960
+ rv.pz = pz
961
+ end
962
+ kto[9] == pz ? OK : FALSE
963
+ end
964
+
965
+ # Methode B3, Variante 2 (Methode 06)
966
+ def m2113(kto, blz, um, rv)
967
+ if rv
968
+ rv.methode = "B3b"
969
+ rv.pz_methode = 2113
970
+ end
971
+ pz = kto[0] * 4 +
972
+ kto[1] * 3 +
973
+ kto[2] * 2 +
974
+ kto[3] * 7 +
975
+ kto[4] * 6 +
976
+ kto[5] * 5 +
977
+ kto[6] * 4 +
978
+ kto[7] * 3 +
979
+ kto[8] * 2
980
+
981
+ pz %= 11
982
+ if pz <= 1
983
+ pz = 0
984
+ else
985
+ pz = 11 - pz
986
+ end
987
+ # CHECK_PZ10
988
+ if rv
989
+ rv.pz_pos = 10
990
+ rv.pz = pz
991
+ end
992
+ kto[9] == pz ? OK : FALSE
993
+ end
994
+
995
+ # Methode B4: bei 9 an Stelle 1 Methode 00, sonst Methode 02.
996
+ def m114(kto, blz, um, rv)
997
+ if kto[0] == 9
998
+ m1114(kto, blz, um, rv)
999
+ else
1000
+ m2114(kto, blz, um, rv)
1001
+ end
1002
+ end
1003
+
1004
+ # Methode B4, Variante 1 (Methode 00)
1005
+ def m1114(kto, blz, um, rv)
1006
+ if rv
1007
+ rv.methode = "B4a"
1008
+ rv.pz_methode = 1114
1009
+ end
1010
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
1011
+ if kto[0] < 5 then pz += kto[0] * 2 else pz += kto[0] * 2 - 9 end
1012
+ if kto[2] < 5 then pz += kto[2] * 2 else pz += kto[2] * 2 - 9 end
1013
+ if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
1014
+ if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
1015
+ if kto[8] < 5 then pz += kto[8] * 2 else pz += kto[8] * 2 - 9 end
1016
+
1017
+ pz %= 10
1018
+ pz = 10 - pz if pz != 0
1019
+ # CHECK_PZ10
1020
+ if rv
1021
+ rv.pz_pos = 10
1022
+ rv.pz = pz
1023
+ end
1024
+ kto[9] == pz ? OK : FALSE
1025
+ end
1026
+
1027
+ # Methode B4, Variante 2 (Methode 02)
1028
+ def m2114(kto, blz, um, rv)
1029
+ if rv
1030
+ rv.methode = "B4b"
1031
+ rv.pz_methode = 2114
1032
+ end
1033
+ pz = kto[0] * 10 +
1034
+ kto[1] * 9 +
1035
+ kto[2] * 8 +
1036
+ kto[3] * 7 +
1037
+ kto[4] * 6 +
1038
+ kto[5] * 5 +
1039
+ kto[6] * 4 +
1040
+ kto[7] * 3 +
1041
+ kto[8] * 2
1042
+
1043
+ pz %= 11
1044
+ pz = 11 - pz if pz != 0
1045
+ # INVALID_PZ10
1046
+ if rv
1047
+ rv.pz_pos = 10
1048
+ rv.pz = pz
1049
+ end
1050
+ return INVALID_KTO if pz == 10
1051
+ # CHECK_PZ10
1052
+ if rv
1053
+ rv.pz_pos = 10
1054
+ rv.pz = pz
1055
+ end
1056
+ kto[9] == pz ? OK : FALSE
1057
+ end
1058
+
1059
+ # Methode B5: Variante 1 nach Methode 05, Variante 2 nach Methode 00;
1060
+ # Variante 2 nur für Kontonummern mit 0 bis 7 an Stelle 1.
1061
+ def m115(kto, blz, um, rv)
1062
+ m1115(kto, blz, um, rv)
1063
+ end
1064
+
1065
+ # Methode B5, Variante 1 (Methode 05)
1066
+ def m1115(kto, blz, um, rv)
1067
+ if rv
1068
+ rv.methode = "B5a"
1069
+ rv.pz_methode = 1115
1070
+ end
1071
+ pz = kto[0] +
1072
+ kto[1] * 3 +
1073
+ kto[2] * 7 +
1074
+ kto[3] +
1075
+ kto[4] * 3 +
1076
+ kto[5] * 7 +
1077
+ kto[6] +
1078
+ kto[7] * 3 +
1079
+ kto[8] * 7
1080
+
1081
+ pz %= 10
1082
+ pz = 10 - pz if pz != 0
1083
+ # CHECK_PZX10
1084
+ if rv
1085
+ rv.pz_pos = 10
1086
+ rv.pz = pz
1087
+ end
1088
+ return OK if kto[9] == pz
1089
+ return FALSE if um != 0
1090
+ return FALSE if kto[0] > 7
1091
+ m2115(kto, blz, um, rv)
1092
+ end
1093
+
1094
+ # Methode B5, Variante 2 (Methode 00)
1095
+ def m2115(kto, blz, um, rv)
1096
+ if rv
1097
+ rv.methode = "B5b"
1098
+ rv.pz_methode = 2115
1099
+ end
1100
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
1101
+ if kto[0] < 5 then pz += kto[0] * 2 else pz += kto[0] * 2 - 9 end
1102
+ if kto[2] < 5 then pz += kto[2] * 2 else pz += kto[2] * 2 - 9 end
1103
+ if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
1104
+ if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
1105
+ if kto[8] < 5 then pz += kto[8] * 2 else pz += kto[8] * 2 - 9 end
1106
+
1107
+ pz %= 10
1108
+ pz = 10 - pz if pz != 0
1109
+ # CHECK_PZ10
1110
+ if rv
1111
+ rv.pz_pos = 10
1112
+ rv.pz = pz
1113
+ end
1114
+ kto[9] == pz ? OK : FALSE
1115
+ end
1116
+
1117
+ # Methode B6: bei Kontonummern mit Stelle 1 größer 0 (oder 269 an den
1118
+ # Stellen 2 bis 4 und Stelle 5 größer 0) Prüfung nach Methode 20,
1119
+ # sonst Prüfung des ESER-Altsystems wie Methode 52.
1120
+ def m116(kto, blz, um, rv)
1121
+ if kto[0] > 0 || (kto[1] == 2 && kto[2] == 6 && kto[3] == 9 && kto[4] > 0)
1122
+ m1116(kto, blz, um, rv)
1123
+ else
1124
+ m2116(kto, blz, um, rv)
1125
+ end
1126
+ end
1127
+
1128
+ # Methode B6, Variante 1 (Methode 20)
1129
+ def m1116(kto, blz, um, rv)
1130
+ if rv
1131
+ rv.methode = "B6a"
1132
+ rv.pz_methode = 1116
1133
+ end
1134
+ pz = kto[0] * 3 +
1135
+ kto[1] * 9 +
1136
+ kto[2] * 8 +
1137
+ kto[3] * 7 +
1138
+ kto[4] * 6 +
1139
+ kto[5] * 5 +
1140
+ kto[6] * 4 +
1141
+ kto[7] * 3 +
1142
+ kto[8] * 2
1143
+
1144
+ pz %= 11
1145
+ if pz <= 1
1146
+ pz = 0
1147
+ else
1148
+ pz = 11 - pz
1149
+ end
1150
+ # CHECK_PZ10
1151
+ if rv
1152
+ rv.pz_pos = 10
1153
+ rv.pz = pz
1154
+ end
1155
+ kto[9] == pz ? OK : FALSE
1156
+ end
1157
+
1158
+ # Methode B6, Variante 2 (ESER-Altsystem, Rechnung wie Methode 52)
1159
+ def m2116(kto, blz, um, rv)
1160
+ if rv
1161
+ rv.methode = "B6b"
1162
+ rv.pz_methode = 2116
1163
+ end
1164
+ if blz.nil?
1165
+ ok = OK_TEST_BLZ_USED
1166
+ blz = "80053762"
1167
+ else
1168
+ ok = OK
1169
+ end
1170
+
1171
+ # Generieren der Konto-Nr. des ESER-Altsystems
1172
+ return INVALID_KTO if kto[0] != 0 || kto[1] == 0 # Kto-Nr. muß neunstellig sein
1173
+
1174
+ kto_alt = Array.new(6)
1175
+ kto_alt[0] = blz[4].to_i
1176
+ kto_alt[1] = blz[5].to_i
1177
+ kto_alt[2] = kto[2] # T-Ziffer
1178
+ kto_alt[3] = blz[7].to_i
1179
+ kto_alt[4] = kto[1]
1180
+ kto_alt[5] = kto[3]
1181
+ j = 4
1182
+ j += 1 while j < 10 && kto[j] == 0
1183
+ while j < 10
1184
+ kto_alt << kto[j]
1185
+ j += 1
1186
+ end
1187
+
1188
+ p1 = kto_alt[5] # Prüfziffer merken
1189
+ kto_alt[5] = 0
1190
+ pz = 0
1191
+ i = 0
1192
+ k = kto_alt.length - 1
1193
+ while k >= 0
1194
+ pz += kto_alt[k] * W52[i]
1195
+ k -= 1
1196
+ i += 1
1197
+ end
1198
+ kto_alt[5] = p1 # Prüfziffer zurückschreiben
1199
+ pz %= 11
1200
+ p1 = W52[i - 6]
1201
+
1202
+ # passenden Faktor suchen
1203
+ tmp = pz
1204
+ i = 0
1205
+ while i < 10
1206
+ pz = tmp + p1 * i
1207
+ pz %= 11
1208
+ break if pz == 10
1209
+ i += 1
1210
+ end
1211
+ pz = i # Prüfziffer ist der verwendete Faktor des Gewichtes
1212
+ rv.pz = pz if rv
1213
+ # INVALID_PZ10
1214
+ if rv
1215
+ rv.pz_pos = 10
1216
+ rv.pz = pz
1217
+ end
1218
+ return INVALID_KTO if pz == 10
1219
+
1220
+ if kto_alt[5] == pz
1221
+ ok
1222
+ else
1223
+ FALSE
1224
+ end
1225
+ end
1226
+
1227
+ # Methode B7: Prüfung nach Methode 01 nur für bestimmte Kontonummern
1228
+ # (Stelle 1 = 0 und Stelle 2 = 7 oder 8, bzw. 00 und Stelle 4 in 1..5);
1229
+ # alle anderen Kontonummern werden nicht geprüft.
1230
+ def m117(kto, blz, um, rv)
1231
+ m1117(kto, blz, um, rv)
1232
+ end
1233
+
1234
+ # Methode B7, Variante 1 (Methode 01)
1235
+ def m1117(kto, blz, um, rv)
1236
+ if rv
1237
+ rv.methode = "B7a"
1238
+ rv.pz_methode = 1117
1239
+ end
1240
+ if kto[0] == 0 && ((kto[1] == 7 || kto[1] == 8) ||
1241
+ (kto[1] == 0 && kto[2] == 0 && kto[3] >= 1 && kto[3] < 6))
1242
+ pz = kto[0] +
1243
+ kto[1] * 7 +
1244
+ kto[2] * 3 +
1245
+ kto[3] +
1246
+ kto[4] * 7 +
1247
+ kto[5] * 3 +
1248
+ kto[6] +
1249
+ kto[7] * 7 +
1250
+ kto[8] * 3
1251
+
1252
+ pz %= 10
1253
+ pz = 10 - pz if pz != 0
1254
+ # CHECK_PZ10
1255
+ if rv
1256
+ rv.pz_pos = 10
1257
+ rv.pz = pz
1258
+ end
1259
+ kto[9] == pz ? OK : FALSE
1260
+ else
1261
+ m2117(kto, blz, um, rv)
1262
+ end
1263
+ end
1264
+
1265
+ # Methode B7, Variante 2 (keine Prüfung)
1266
+ def m2117(kto, blz, um, rv)
1267
+ if rv
1268
+ rv.methode = "B7b"
1269
+ rv.pz_methode = 2117
1270
+ end
1271
+ OK_NO_CHK
1272
+ end
1273
+
1274
+ # Methode B8: Variante 1 nach Methode 20, Variante 2 nach Methode 29,
1275
+ # Variante 3 (seit 6.6.2011) ohne Prüfung für bestimmte Kontonummern.
1276
+ def m118(kto, blz, um, rv)
1277
+ m1118(kto, blz, um, rv)
1278
+ end
1279
+
1280
+ # Methode B8, Variante 1 (Methode 20)
1281
+ def m1118(kto, blz, um, rv)
1282
+ if rv
1283
+ rv.methode = "B8a"
1284
+ rv.pz_methode = 1118
1285
+ end
1286
+ pz = kto[0] * 3 +
1287
+ kto[1] * 9 +
1288
+ kto[2] * 8 +
1289
+ kto[3] * 7 +
1290
+ kto[4] * 6 +
1291
+ kto[5] * 5 +
1292
+ kto[6] * 4 +
1293
+ kto[7] * 3 +
1294
+ kto[8] * 2
1295
+
1296
+ pz %= 11
1297
+ if pz <= 1
1298
+ pz = 0
1299
+ else
1300
+ pz = 11 - pz
1301
+ end
1302
+ # CHECK_PZX10
1303
+ if rv
1304
+ rv.pz_pos = 10
1305
+ rv.pz = pz
1306
+ end
1307
+ return OK if kto[9] == pz
1308
+ return FALSE if um != 0
1309
+ m2118(kto, blz, um, rv)
1310
+ end
1311
+
1312
+ # Methode B8, Variante 2 (Methode 29)
1313
+ def m2118(kto, blz, um, rv)
1314
+ if rv
1315
+ rv.methode = "B8b"
1316
+ rv.pz_methode = 2118
1317
+ end
1318
+ pz = M10H_DIGITS[0][kto[0]] +
1319
+ M10H_DIGITS[3][kto[1]] +
1320
+ M10H_DIGITS[2][kto[2]] +
1321
+ M10H_DIGITS[1][kto[3]] +
1322
+ M10H_DIGITS[0][kto[4]] +
1323
+ M10H_DIGITS[3][kto[5]] +
1324
+ M10H_DIGITS[2][kto[6]] +
1325
+ M10H_DIGITS[1][kto[7]] +
1326
+ M10H_DIGITS[0][kto[8]]
1327
+ pz %= 10
1328
+ pz = 10 - pz if pz != 0
1329
+ # CHECK_PZX10
1330
+ if rv
1331
+ rv.pz_pos = 10
1332
+ rv.pz = pz
1333
+ end
1334
+ return OK if kto[9] == pz
1335
+ return FALSE if um != 0
1336
+ m3118(kto, blz, um, rv)
1337
+ end
1338
+
1339
+ # Methode B8, Variante 3 (neu zum 6.6.2011): keine Prüfung
1340
+ def m3118(kto, blz, um, rv)
1341
+ if rv
1342
+ rv.methode = "B8c"
1343
+ rv.pz_methode = 3118
1344
+ end
1345
+ if (kto[0] == 5 && kto[1] > 0) ||
1346
+ (kto[0] == 9 && kto[1] == 0 && kto[2] >= 1) ||
1347
+ (kto[0] == 9 && kto[1] == 1 && kto[2] == 0)
1348
+ return OK_NO_CHK
1349
+ end
1350
+ FALSE
1351
+ end
1352
+
1353
+ # Methode B9
1354
+ # Nur Kontonummern mit 00 an den Stellen 1 und 2 (aber nicht 0000) sind
1355
+ # gültig. Bei Stelle 3 ungleich 0 Variante 1, sonst Variante 2. In beiden
1356
+ # Fällen wird bei Fehlschlag zusätzlich die um 5 erhöhte Prüfziffer geprüft.
1357
+ def m119(kto, blz, um, rv)
1358
+ if rv
1359
+ rv.methode = "B9"
1360
+ rv.pz_methode = 119
1361
+ end
1362
+ return INVALID_KTO if kto[0] != 0 || kto[1] != 0
1363
+ return INVALID_KTO if kto[0] == 0 && kto[1] == 0 && kto[2] == 0 && kto[3] == 0
1364
+
1365
+ if kto[2] != 0
1366
+ m1119(kto, blz, um, rv)
1367
+ else
1368
+ m2119(kto, blz, um, rv)
1369
+ end
1370
+ end
1371
+
1372
+ # Methode B9, Variante 1 (Gewichtung 1, 2, 3, 1, 2, 3, 1 mit Modulo-11-
1373
+ # Reduktion jedes Produkts)
1374
+ def m1119(kto, blz, um, rv)
1375
+ if rv
1376
+ rv.methode = "B9a"
1377
+ rv.pz_methode = 1119
1378
+ end
1379
+ pz = kto[2] * 1 + 1 # Maximum ist 9*1+1=10 -> kann direkt genommen werden
1380
+
1381
+ pz1 = kto[3] * 2 + 2 # Maximum ist 9*2+2=20 -> nur ein Test auf >=11
1382
+ if pz1 >= 11
1383
+ pz += pz1 - 11
1384
+ else
1385
+ pz += pz1
1386
+ end
1387
+
1388
+ pz1 = kto[4] * 3 + 3 # Maximum ist 9*3+3=30 -> zwei Tests nötig
1389
+ if pz1 >= 22
1390
+ pz += pz1 - 22
1391
+ elsif pz1 >= 11
1392
+ pz += pz1 - 11
1393
+ else
1394
+ pz += pz1
1395
+ end
1396
+
1397
+ pz += kto[5] * 1 + 1
1398
+
1399
+ pz1 = kto[6] * 2 + 2
1400
+ if pz1 >= 11
1401
+ pz += pz1 - 11
1402
+ else
1403
+ pz += pz1
1404
+ end
1405
+
1406
+ pz1 = kto[7] * 3 + 3
1407
+ if pz1 >= 22
1408
+ pz += pz1 - 22
1409
+ elsif pz1 >= 11
1410
+ pz += pz1 - 11
1411
+ else
1412
+ pz += pz1
1413
+ end
1414
+
1415
+ pz += kto[8] * 1 + 1
1416
+
1417
+ pz %= 10
1418
+ rv.pz = pz if rv
1419
+ return OK if kto[9] == pz
1420
+ pz += 5
1421
+ pz %= 10
1422
+ # CHECK_PZ10
1423
+ if rv
1424
+ rv.pz_pos = 10
1425
+ rv.pz = pz
1426
+ end
1427
+ kto[9] == pz ? OK : FALSE
1428
+ end
1429
+
1430
+ # Methode B9, Variante 2 (Modulus 11, Gewichtung 6, 5, 4, 3, 2, 1)
1431
+ def m2119(kto, blz, um, rv)
1432
+ if rv
1433
+ rv.methode = "B9b"
1434
+ rv.pz_methode = 2119
1435
+ end
1436
+ pz = kto[3] * 6 +
1437
+ kto[4] * 5 +
1438
+ kto[5] * 4 +
1439
+ kto[6] * 3 +
1440
+ kto[7] * 2 +
1441
+ kto[8] * 1
1442
+
1443
+ pz %= 11
1444
+ rv.pz = pz if rv
1445
+ return OK if kto[9] == pz
1446
+ pz += 5
1447
+ pz %= 10
1448
+ # CHECK_PZ10
1449
+ if rv
1450
+ rv.pz_pos = 10
1451
+ rv.pz = pz
1452
+ end
1453
+ kto[9] == pz ? OK : FALSE
1454
+ end
1455
+
1456
+ # Methode C0: bei Kontonummern mit 00 an Stelle 1/2 und Stelle 3 ungleich 0
1457
+ # zuerst die Prüfung des ESER-Altsystems (wie Methode 52), danach bzw.
1458
+ # sonst die Prüfung nach Methode 20.
1459
+ def m120(kto, blz, um, rv)
1460
+ if kto[0] == 0 && kto[1] == 0 && kto[2] != 0
1461
+ m1120(kto, blz, um, rv)
1462
+ else
1463
+ m2120(kto, blz, um, rv)
1464
+ end
1465
+ end
1466
+
1467
+ # Methode C0, Variante 1 (ESER-Altsystem, Rechnung wie Methode 52)
1468
+ def m1120(kto, blz, um, rv)
1469
+ if rv
1470
+ rv.methode = "C0a"
1471
+ rv.pz_methode = 1120
1472
+ end
1473
+ if blz.nil?
1474
+ ok = OK_TEST_BLZ_USED
1475
+ blz = "13051172"
1476
+ else
1477
+ ok = OK
1478
+ end
1479
+
1480
+ # Generieren der Konto-Nr. des ESER-Altsystems
1481
+ j = 0
1482
+ j += 1 while j < 10 && kto[j] == 0
1483
+ return INVALID_KTO if j > 2
1484
+
1485
+ kto_alt = Array.new(6)
1486
+ kto_alt[0] = blz[4].to_i
1487
+ kto_alt[1] = blz[5].to_i
1488
+ kto_alt[2] = blz[6].to_i
1489
+ kto_alt[3] = blz[7].to_i
1490
+ kto_alt[4] = kto[j]
1491
+ j += 1
1492
+ kto_alt[5] = kto[j]
1493
+ j += 1
1494
+ j += 1 while j < 10 && kto[j] == 0
1495
+ while j < 10
1496
+ kto_alt << kto[j]
1497
+ j += 1
1498
+ end
1499
+
1500
+ p1 = kto_alt[5] # Prüfziffer
1501
+ kto_alt[5] = 0
1502
+ pz = 0
1503
+ i = 0
1504
+ k = kto_alt.length - 1
1505
+ while k >= 0
1506
+ pz += kto_alt[k] * W52[i]
1507
+ k -= 1
1508
+ i += 1
1509
+ end
1510
+ kto_alt[5] = p1
1511
+ pz %= 11
1512
+ p1 = W52[i - 6]
1513
+
1514
+ # passenden Faktor suchen
1515
+ tmp = pz
1516
+ i = 0
1517
+ while i < 10
1518
+ pz = tmp + p1 * i
1519
+ pz %= 11
1520
+ break if pz == 10
1521
+ i += 1
1522
+ end
1523
+ pz = i
1524
+ return ok if kto_alt[5] == pz
1525
+ return FALSE if um != 0
1526
+ m2120(kto, blz, um, rv)
1527
+ end
1528
+
1529
+ # Methode C0, Variante 2 (Methode 20)
1530
+ def m2120(kto, blz, um, rv)
1531
+ if rv
1532
+ rv.methode = "C0b"
1533
+ rv.pz_methode = 2120
1534
+ end
1535
+ pz = kto[0] * 3 +
1536
+ kto[1] * 9 +
1537
+ kto[2] * 8 +
1538
+ kto[3] * 7 +
1539
+ kto[4] * 6 +
1540
+ kto[5] * 5 +
1541
+ kto[6] * 4 +
1542
+ kto[7] * 3 +
1543
+ kto[8] * 2
1544
+
1545
+ pz %= 11
1546
+ if pz <= 1
1547
+ pz = 0
1548
+ else
1549
+ pz = 11 - pz
1550
+ end
1551
+ # CHECK_PZ10
1552
+ if rv
1553
+ rv.pz_pos = 10
1554
+ rv.pz = pz
1555
+ end
1556
+ kto[9] == pz ? OK : FALSE
1557
+ end
1558
+
1559
+ # Methode C1: bei Stelle 1 ungleich 5 Prüfung nach Methode 17 (Prüfziffer
1560
+ # an Stelle 8), sonst Methode 00 mit Prüfziffer an Stelle 10.
1561
+ def m121(kto, blz, um, rv)
1562
+ if kto[0] != 5
1563
+ m1121(kto, blz, um, rv)
1564
+ else
1565
+ m2121(kto, blz, um, rv)
1566
+ end
1567
+ end
1568
+
1569
+ # Methode C1, Variante 1 (Methode 17)
1570
+ def m1121(kto, blz, um, rv)
1571
+ if rv
1572
+ rv.methode = "C1a"
1573
+ rv.pz_methode = 1121
1574
+ end
1575
+ pz = kto[1] + kto[3] + kto[5]
1576
+ if kto[2] < 5 then pz += kto[2] * 2 else pz += kto[2] * 2 - 9 end
1577
+ if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
1578
+ if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
1579
+
1580
+ pz -= 1
1581
+ pz %= 11 if pz >= 0 # MOD_11_44 läßt negative Werte unverändert
1582
+ pz = 10 - pz if pz != 0
1583
+ # CHECK_PZ8
1584
+ if rv
1585
+ rv.pz_pos = 8
1586
+ rv.pz = pz
1587
+ end
1588
+ kto[7] == pz ? OK : FALSE
1589
+ end
1590
+
1591
+ # Methode C1, Variante 2 (Stelle 1 = 5)
1592
+ def m2121(kto, blz, um, rv)
1593
+ if rv
1594
+ rv.methode = "C1b"
1595
+ rv.pz_methode = 2121
1596
+ end
1597
+ pz = kto[0] + kto[2] + kto[4] + kto[6] + kto[8]
1598
+ if kto[1] < 5 then pz += kto[1] * 2 else pz += kto[1] * 2 - 9 end
1599
+ if kto[3] < 5 then pz += kto[3] * 2 else pz += kto[3] * 2 - 9 end
1600
+ if kto[5] < 5 then pz += kto[5] * 2 else pz += kto[5] * 2 - 9 end
1601
+ if kto[7] < 5 then pz += kto[7] * 2 else pz += kto[7] * 2 - 9 end
1602
+
1603
+ pz -= 1
1604
+ pz %= 11 if pz >= 0 # MOD_11_44 läßt negative Werte unverändert
1605
+ pz = 10 - pz if pz != 0
1606
+ # CHECK_PZ10
1607
+ if rv
1608
+ rv.pz_pos = 10
1609
+ rv.pz = pz
1610
+ end
1611
+ kto[9] == pz ? OK : FALSE
1612
+ end
1613
+
1614
+ # Methode C2: Variante 1 (Gewichtung 3, 1, 3, ... mit Quersumme),
1615
+ # Variante 2 nach Methode 00, Variante 3 (ab September 2017) nach
1616
+ # Methode 04.
1617
+ def m122(kto, blz, um, rv)
1618
+ m1122(kto, blz, um, rv)
1619
+ end
1620
+
1621
+ # Methode C2, Variante 1
1622
+ def m1122(kto, blz, um, rv)
1623
+ if rv
1624
+ rv.methode = "C2a"
1625
+ rv.pz_methode = 1122
1626
+ end
1627
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
1628
+
1629
+ if kto[0] < 4
1630
+ pz += kto[0] * 3
1631
+ elsif kto[0] < 7
1632
+ pz += kto[0] * 3 - 10
1633
+ else
1634
+ pz += kto[0] * 3 - 20
1635
+ end
1636
+
1637
+ if kto[2] < 4
1638
+ pz += kto[2] * 3
1639
+ elsif kto[2] < 7
1640
+ pz += kto[2] * 3 - 10
1641
+ else
1642
+ pz += kto[2] * 3 - 20
1643
+ end
1644
+
1645
+ if kto[4] < 4
1646
+ pz += kto[4] * 3
1647
+ elsif kto[4] < 7
1648
+ pz += kto[4] * 3 - 10
1649
+ else
1650
+ pz += kto[4] * 3 - 20
1651
+ end
1652
+
1653
+ if kto[6] < 4
1654
+ pz += kto[6] * 3
1655
+ elsif kto[6] < 7
1656
+ pz += kto[6] * 3 - 10
1657
+ else
1658
+ pz += kto[6] * 3 - 20
1659
+ end
1660
+
1661
+ if kto[8] < 4
1662
+ pz += kto[8] * 3
1663
+ elsif kto[8] < 7
1664
+ pz += kto[8] * 3 - 10
1665
+ else
1666
+ pz += kto[8] * 3 - 20
1667
+ end
1668
+
1669
+ pz %= 10
1670
+ pz = 10 - pz if pz != 0
1671
+ # CHECK_PZX10
1672
+ if rv
1673
+ rv.pz_pos = 10
1674
+ rv.pz = pz
1675
+ end
1676
+ return OK if kto[9] == pz
1677
+ return FALSE if um != 0
1678
+ m2122(kto, blz, um, rv)
1679
+ end
1680
+
1681
+ # Methode C2, Variante 2 (Methode 00)
1682
+ def m2122(kto, blz, um, rv)
1683
+ if rv
1684
+ rv.methode = "C2b"
1685
+ rv.pz_methode = 2122
1686
+ end
1687
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
1688
+ if kto[0] < 5 then pz += kto[0] * 2 else pz += kto[0] * 2 - 9 end
1689
+ if kto[2] < 5 then pz += kto[2] * 2 else pz += kto[2] * 2 - 9 end
1690
+ if kto[4] < 5 then pz += kto[4] * 2 else pz += kto[4] * 2 - 9 end
1691
+ if kto[6] < 5 then pz += kto[6] * 2 else pz += kto[6] * 2 - 9 end
1692
+ if kto[8] < 5 then pz += kto[8] * 2 else pz += kto[8] * 2 - 9 end
1693
+
1694
+ pz %= 10
1695
+ pz = 10 - pz if pz != 0
1696
+ # CHECK_PZX10
1697
+ if rv
1698
+ rv.pz_pos = 10
1699
+ rv.pz = pz
1700
+ end
1701
+ return OK if kto[9] == pz
1702
+ return FALSE if um != 0
1703
+ m3122(kto, blz, um, rv)
1704
+ end
1705
+
1706
+ # Methode C2, Variante 3 (gültig ab September 2017, Methode 04)
1707
+ def m3122(kto, blz, um, rv)
1708
+ if rv
1709
+ rv.methode = "C2c"
1710
+ rv.pz_methode = 3122
1711
+ end
1712
+ pz = kto[0] * 4 +
1713
+ kto[1] * 3 +
1714
+ kto[2] * 2 +
1715
+ kto[3] * 7 +
1716
+ kto[4] * 6 +
1717
+ kto[5] * 5 +
1718
+ kto[6] * 4 +
1719
+ kto[7] * 3 +
1720
+ kto[8] * 2
1721
+
1722
+ pz %= 11
1723
+ pz = 11 - pz if pz != 0
1724
+ # INVALID_PZ10
1725
+ if rv
1726
+ rv.pz_pos = 10
1727
+ rv.pz = pz
1728
+ end
1729
+ return INVALID_KTO if pz == 10
1730
+ # CHECK_PZ10
1731
+ if rv
1732
+ rv.pz_pos = 10
1733
+ rv.pz = pz
1734
+ end
1735
+ kto[9] == pz ? OK : FALSE
1736
+ end
1737
+ end
1738
+ end