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,1407 @@
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 C3
18
+ # Kontonummern mit 1. Stelle != 9: Methode 00 (Modulus 10, Gewichtung
19
+ # 2,1,2,1,2,1,2,1,2); Kontonummern mit 1. Stelle == 9: Modulus 11,
20
+ # Gewichtung 2,3,4,5,6 (Stellen 5 bis 9), Prüfziffer 10 ist ungültig.
21
+ def m123(kto, blz, um, rv)
22
+ if kto[0] != 9
23
+ m1123(kto, blz, um, rv)
24
+ else
25
+ m2123(kto, blz, um, rv)
26
+ end
27
+ end
28
+
29
+ # Methode C3a (Variante 1: Methode 00)
30
+ def m1123(kto, blz, um, rv)
31
+ if rv
32
+ rv.methode = "C3a"
33
+ rv.pz_methode = 1123
34
+ end
35
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
36
+ pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
37
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
38
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
39
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
40
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
41
+ pz %= 10
42
+ pz = 10 - pz if pz != 0
43
+ # CHECK_PZ10
44
+ if rv
45
+ rv.pz_pos = 10
46
+ rv.pz = pz
47
+ end
48
+ kto[9] == pz ? OK : FALSE
49
+ end
50
+
51
+ # Methode C3b (Variante 2: Modulus 11, Gewichtung 6,5,4,3,2)
52
+ def m2123(kto, blz, um, rv)
53
+ if rv
54
+ rv.methode = "C3b"
55
+ rv.pz_methode = 2123
56
+ end
57
+ pz = kto[4] * 6 +
58
+ kto[5] * 5 +
59
+ kto[6] * 4 +
60
+ kto[7] * 3 +
61
+ kto[8] * 2
62
+ pz %= 11
63
+ pz = 11 - pz if pz != 0
64
+ # INVALID_PZ10
65
+ if rv
66
+ rv.pz_pos = 10
67
+ rv.pz = pz
68
+ end
69
+ return INVALID_KTO if pz == 10
70
+ # CHECK_PZ10
71
+ if rv
72
+ rv.pz_pos = 10
73
+ rv.pz = pz
74
+ end
75
+ kto[9] == pz ? OK : FALSE
76
+ end
77
+
78
+ # Methode C4
79
+ # 1. Stelle != 9: Modulus 11, Gewichtung 2,3,4,5 (Rest 0 und 1 -> Pz 0);
80
+ # 1. Stelle == 9: Modulus 11, Gewichtung 2,3,4,5,6, Pz 10 ungültig.
81
+ def m124(kto, blz, um, rv)
82
+ if kto[0] != 9
83
+ m1124(kto, blz, um, rv)
84
+ else
85
+ m2124(kto, blz, um, rv)
86
+ end
87
+ end
88
+
89
+ # Methode C4a
90
+ def m1124(kto, blz, um, rv)
91
+ if rv
92
+ rv.methode = "C4a"
93
+ rv.pz_methode = 1124
94
+ end
95
+ pz = kto[5] * 5 +
96
+ kto[6] * 4 +
97
+ kto[7] * 3 +
98
+ kto[8] * 2
99
+ pz %= 11
100
+ if pz <= 1
101
+ pz = 0
102
+ else
103
+ pz = 11 - pz
104
+ end
105
+ # CHECK_PZ10
106
+ if rv
107
+ rv.pz_pos = 10
108
+ rv.pz = pz
109
+ end
110
+ kto[9] == pz ? OK : FALSE
111
+ end
112
+
113
+ # Methode C4b
114
+ def m2124(kto, blz, um, rv)
115
+ if rv
116
+ rv.methode = "C4b"
117
+ rv.pz_methode = 2124
118
+ end
119
+ pz = kto[4] * 6 +
120
+ kto[5] * 5 +
121
+ kto[6] * 4 +
122
+ kto[7] * 3 +
123
+ kto[8] * 2
124
+ pz %= 11
125
+ pz = 11 - pz if pz != 0
126
+ # INVALID_PZ10
127
+ if rv
128
+ rv.pz_pos = 10
129
+ rv.pz = pz
130
+ end
131
+ return INVALID_KTO if pz == 10
132
+ # CHECK_PZ10
133
+ if rv
134
+ rv.pz_pos = 10
135
+ rv.pz = pz
136
+ end
137
+ kto[9] == pz ? OK : FALSE
138
+ end
139
+
140
+ # Methode C5
141
+ # Vier Kontenkreise mit unterschiedlichen Verfahren (Methode 00 auf
142
+ # verschiedenen Stellen, Methode 06/M10H-Variante, keine Prüfung).
143
+ def m125(kto, blz, um, rv)
144
+ m1125(kto, blz, um, rv)
145
+ end
146
+
147
+ # Methode C5a (Varianten 1a und 1b: Methode 00 auf 6- bzw. 9-stelligen
148
+ # Kontonummern; Prüfziffer an Stelle 10 bzw. 7)
149
+ def m1125(kto, blz, um, rv)
150
+ if rv
151
+ rv.methode = "C5a"
152
+ rv.pz_methode = 1125
153
+ end
154
+
155
+ # Variante 1a: 6-stellige Kontonummern, 5. Stelle = 1-8, Pz an Stelle 10
156
+ if kto[0] == 0 && kto[1] == 0 && kto[2] == 0 && kto[3] == 0 && kto[4] >= 1 && kto[4] <= 8
157
+ pz = kto[5] + kto[7]
158
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
159
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
160
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
161
+ pz %= 10
162
+ pz = 10 - pz if pz != 0
163
+ # CHECK_PZ10
164
+ if rv
165
+ rv.pz_pos = 10
166
+ rv.pz = pz
167
+ end
168
+ return kto[9] == pz ? OK : FALSE
169
+
170
+ # Variante 1b: 9-stellige Kontonummern, 2. Stelle = 1-8, Pz an Stelle 7
171
+ elsif kto[0] == 0 && kto[1] >= 1 && kto[1] <= 8
172
+ pz = kto[2] + kto[4]
173
+ pz += kto[1] < 5 ? kto[1] * 2 : kto[1] * 2 - 9
174
+ pz += kto[3] < 5 ? kto[3] * 2 : kto[3] * 2 - 9
175
+ pz += kto[5] < 5 ? kto[5] * 2 : kto[5] * 2 - 9
176
+ pz %= 10
177
+ pz = 10 - pz if pz != 0
178
+ # CHECK_PZ7
179
+ if rv
180
+ rv.pz_pos = 7
181
+ rv.pz = pz
182
+ end
183
+ return kto[6] == pz ? OK : FALSE
184
+
185
+ # Variante 2: 10-stellige Kontonummern, 1. Stelle = 1, 4, 5, 6 oder 9
186
+ elsif kto[0] == 1 || (kto[0] >= 4 && kto[0] <= 6) || kto[0] == 9
187
+ return m2125(kto, blz, um, rv)
188
+
189
+ # Variante 3: 10-stellige Kontonummern, 1. Stelle = 3
190
+ elsif kto[0] == 3
191
+ return m3125(kto, blz, um, rv)
192
+
193
+ # Variante 4: 8-stellige Kontonummern mit 3. Stelle = 3, 4 oder 5 bzw.
194
+ # 10-stellige Kontonummern mit 1. und 2. Stelle = 70 oder 85
195
+ elsif (kto[0] == 0 && kto[1] == 0 && kto[2] >= 3 && kto[2] <= 5) ||
196
+ (kto[0] == 7 && kto[1] == 0) ||
197
+ (kto[0] == 8 && kto[1] == 5)
198
+ return m4125(kto, blz, um, rv)
199
+ else
200
+ # Kontonummer entspricht keinem vorgegebenen Kontenkreis
201
+ return INVALID_KTO
202
+ end
203
+ end
204
+
205
+ # Methode C5b (Variante 2: Modulus 10, iterierte Transformation)
206
+ def m2125(kto, blz, um, rv)
207
+ if rv
208
+ rv.methode = "C5b"
209
+ rv.pz_methode = 2125
210
+ end
211
+ pz = M10H_DIGITS[0][kto[0]] +
212
+ M10H_DIGITS[3][kto[1]] +
213
+ M10H_DIGITS[2][kto[2]] +
214
+ M10H_DIGITS[1][kto[3]] +
215
+ M10H_DIGITS[0][kto[4]] +
216
+ M10H_DIGITS[3][kto[5]] +
217
+ M10H_DIGITS[2][kto[6]] +
218
+ M10H_DIGITS[1][kto[7]] +
219
+ M10H_DIGITS[0][kto[8]]
220
+ pz %= 10
221
+ pz = 10 - pz if pz != 0
222
+ # CHECK_PZ10
223
+ if rv
224
+ rv.pz_pos = 10
225
+ rv.pz = pz
226
+ end
227
+ kto[9] == pz ? OK : FALSE
228
+ end
229
+
230
+ # Methode C5c (Variante 3: Methode 00)
231
+ def m3125(kto, blz, um, rv)
232
+ if rv
233
+ rv.methode = "C5c"
234
+ rv.pz_methode = 3125
235
+ end
236
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
237
+ pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
238
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
239
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
240
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
241
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
242
+ pz %= 10
243
+ pz = 10 - pz if pz != 0
244
+ # CHECK_PZ10
245
+ if rv
246
+ rv.pz_pos = 10
247
+ rv.pz = pz
248
+ end
249
+ kto[9] == pz ? OK : FALSE
250
+ end
251
+
252
+ # Methode C5d (Variante 4: keine Prüfzifferberechnung)
253
+ def m4125(kto, blz, um, rv)
254
+ if rv
255
+ rv.methode = "C5d"
256
+ rv.pz_methode = 4125
257
+ end
258
+ OK_NO_CHK
259
+ end
260
+
261
+ # Methode C6
262
+ # Methode 00 über die Stellen 2 bis 9, wobei zur Summe abhängig von der
263
+ # 1. Stelle der Kontonummer eine Konstante addiert wird.
264
+ def m126(kto, blz, um, rv)
265
+ if rv
266
+ rv.methode = "C6"
267
+ rv.pz_methode = 126
268
+ end
269
+ case kto[0]
270
+ when 0 then pz = 30
271
+ when 1 then pz = 33
272
+ when 2 then pz = 36
273
+ when 3 then pz = 38
274
+ when 4 then pz = 45
275
+ when 5 then pz = 41
276
+ when 6 then pz = 43
277
+ when 7 then pz = 31
278
+ when 8 then pz = 40
279
+ when 9 then pz = 40
280
+ else return INVALID_KTO
281
+ end
282
+
283
+ pz += kto[1] + kto[3] + kto[5] + kto[7]
284
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
285
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
286
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
287
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
288
+ pz %= 10
289
+ pz = 10 - pz if pz != 0
290
+ # CHECK_PZ10
291
+ if rv
292
+ rv.pz_pos = 10
293
+ rv.pz = pz
294
+ end
295
+ kto[9] == pz ? OK : FALSE
296
+ end
297
+
298
+ # Methode C7
299
+ # Variante 1 (evl. weggelassenes Unterkonto) und Variante 1 entsprechen
300
+ # der Methode 63, Variante 2 der Methode 06 (Modulus 11).
301
+ def m127(kto, blz, um, rv)
302
+ if kto[0] == 0
303
+ # bei Methode 63 sind 10-stellige Kontonummern falsch
304
+ if kto[1] == 0 && kto[2] == 0
305
+ # evl. Unterkonto weggelassen
306
+ m3127(kto, blz, um, rv)
307
+ else
308
+ m1127(kto, blz, um, rv)
309
+ end
310
+ else
311
+ m2127(kto, blz, um, rv)
312
+ end
313
+ end
314
+
315
+ # Methode C7c (Methode 63 mit weggelassenem Unterkonto)
316
+ def m3127(kto, blz, um, rv)
317
+ if rv
318
+ rv.methode = "C7c"
319
+ rv.pz_methode = 3127
320
+ end
321
+ return INVALID_KTO if kto[0] != 0
322
+ pz = kto[3] + kto[5] + kto[7]
323
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
324
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
325
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
326
+ pz %= 10
327
+ pz = 10 - pz if pz != 0
328
+ # CHECK_PZX10
329
+ if rv
330
+ rv.pz_pos = 10
331
+ rv.pz = pz
332
+ end
333
+ return OK if kto[9] == pz
334
+ return FALSE if um != 0
335
+ # hier darf kein else-Zweig hin, damit nach 63c auch 63a geprüft wird
336
+ m1127(kto, blz, um, rv)
337
+ end
338
+
339
+ # Methode C7a (Methode 63)
340
+ def m1127(kto, blz, um, rv)
341
+ if rv
342
+ rv.methode = "C7a"
343
+ rv.pz_methode = 1127
344
+ end
345
+ return INVALID_KTO if kto[0] != 0
346
+ pz = kto[1] + kto[3] + kto[5]
347
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
348
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
349
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
350
+ pz %= 10
351
+ pz = 10 - pz if pz != 0
352
+ # CHECK_PZX8
353
+ if rv
354
+ rv.pz_pos = 8
355
+ rv.pz = pz
356
+ end
357
+ return OK if kto[7] == pz
358
+ return FALSE if um != 0
359
+ m2127(kto, blz, um, rv)
360
+ end
361
+
362
+ # Methode C7b (Variante 2: Modulus 11, Gewichtung 2,3,4,5,6,7,2,3,4)
363
+ def m2127(kto, blz, um, rv)
364
+ if rv
365
+ rv.methode = "C7b"
366
+ rv.pz_methode = 2127
367
+ end
368
+ pz = kto[0] * 4 +
369
+ kto[1] * 3 +
370
+ kto[2] * 2 +
371
+ kto[3] * 7 +
372
+ kto[4] * 6 +
373
+ kto[5] * 5 +
374
+ kto[6] * 4 +
375
+ kto[7] * 3 +
376
+ kto[8] * 2
377
+ pz %= 11
378
+ if pz <= 1
379
+ pz = 0
380
+ else
381
+ pz = 11 - pz
382
+ end
383
+ # CHECK_PZ10
384
+ if rv
385
+ rv.pz_pos = 10
386
+ rv.pz = pz
387
+ end
388
+ kto[9] == pz ? OK : FALSE
389
+ end
390
+
391
+ # Methode C8
392
+ # Variante 1: Methode 00, Variante 2: Modulus 11 mit Gewichtung
393
+ # 2,3,4,5,6,7,2,3,4, Variante 3: Methode 07 (Pz 10 ungültig).
394
+ def m128(kto, blz, um, rv)
395
+ m1128(kto, blz, um, rv)
396
+ end
397
+
398
+ # Methode C8a (Variante 1: Methode 00)
399
+ def m1128(kto, blz, um, rv)
400
+ if rv
401
+ rv.methode = "C8a"
402
+ rv.pz_methode = 1128
403
+ end
404
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
405
+ pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
406
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
407
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
408
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
409
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
410
+ pz %= 10
411
+ pz = 10 - pz if pz != 0
412
+ # CHECK_PZX10
413
+ if rv
414
+ rv.pz_pos = 10
415
+ rv.pz = pz
416
+ end
417
+ return OK if kto[9] == pz
418
+ return FALSE if um != 0
419
+ m2128(kto, blz, um, rv)
420
+ end
421
+
422
+ # Methode C8b (Variante 2)
423
+ def m2128(kto, blz, um, rv)
424
+ if rv
425
+ rv.methode = "C8b"
426
+ rv.pz_methode = 2128
427
+ end
428
+ pz = kto[0] * 4 +
429
+ kto[1] * 3 +
430
+ kto[2] * 2 +
431
+ kto[3] * 7 +
432
+ kto[4] * 6 +
433
+ kto[5] * 5 +
434
+ kto[6] * 4 +
435
+ kto[7] * 3 +
436
+ kto[8] * 2
437
+ pz %= 11
438
+ pz = 11 - pz if pz != 0
439
+ # CHECK_PZX10
440
+ if rv
441
+ rv.pz_pos = 10
442
+ rv.pz = pz
443
+ end
444
+ return OK if kto[9] == pz
445
+ return FALSE if um != 0
446
+ m3128(kto, blz, um, rv)
447
+ end
448
+
449
+ # Methode C8c (Variante 3: Methode 07)
450
+ def m3128(kto, blz, um, rv)
451
+ if rv
452
+ rv.methode = "C8c"
453
+ rv.pz_methode = 3128
454
+ end
455
+ pz = kto[0] * 10 +
456
+ kto[1] * 9 +
457
+ kto[2] * 8 +
458
+ kto[3] * 7 +
459
+ kto[4] * 6 +
460
+ kto[5] * 5 +
461
+ kto[6] * 4 +
462
+ kto[7] * 3 +
463
+ kto[8] * 2
464
+ pz %= 11
465
+ pz = 11 - pz if pz != 0
466
+ # INVALID_PZ10
467
+ if rv
468
+ rv.pz_pos = 10
469
+ rv.pz = pz
470
+ end
471
+ return INVALID_KTO if pz == 10
472
+ # CHECK_PZ10
473
+ if rv
474
+ rv.pz_pos = 10
475
+ rv.pz = pz
476
+ end
477
+ kto[9] == pz ? OK : FALSE
478
+ end
479
+
480
+ # Methode C9
481
+ # Variante 1: Methode 00, Variante 2: Methode 07 (Pz 10 ungültig).
482
+ def m129(kto, blz, um, rv)
483
+ m1129(kto, blz, um, rv)
484
+ end
485
+
486
+ # Methode C9a (Variante 1: Methode 00)
487
+ def m1129(kto, blz, um, rv)
488
+ if rv
489
+ rv.methode = "C9a"
490
+ rv.pz_methode = 1129
491
+ end
492
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
493
+ pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
494
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
495
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
496
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
497
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
498
+ pz %= 10
499
+ pz = 10 - pz if pz != 0
500
+ # CHECK_PZX10
501
+ if rv
502
+ rv.pz_pos = 10
503
+ rv.pz = pz
504
+ end
505
+ return OK if kto[9] == pz
506
+ return FALSE if um != 0
507
+ m2129(kto, blz, um, rv)
508
+ end
509
+
510
+ # Methode C9b (Variante 2: Methode 07)
511
+ def m2129(kto, blz, um, rv)
512
+ if rv
513
+ rv.methode = "C9b"
514
+ rv.pz_methode = 2129
515
+ end
516
+ pz = kto[0] * 10 +
517
+ kto[1] * 9 +
518
+ kto[2] * 8 +
519
+ kto[3] * 7 +
520
+ kto[4] * 6 +
521
+ kto[5] * 5 +
522
+ kto[6] * 4 +
523
+ kto[7] * 3 +
524
+ kto[8] * 2
525
+ pz %= 11
526
+ pz = 11 - pz if pz != 0
527
+ # INVALID_PZ10
528
+ if rv
529
+ rv.pz_pos = 10
530
+ rv.pz = pz
531
+ end
532
+ return INVALID_KTO if pz == 10
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 D0
542
+ # Variante 2: Kontonummern, die mit 57 beginnen, werden nicht geprüft;
543
+ # Variante 1: Modulus 11, Gewichtung 2,3,4,5,6,7,8,9,3.
544
+ def m130(kto, blz, um, rv)
545
+ m2130(kto, blz, um, rv)
546
+ end
547
+
548
+ # Methode D0b (Variante 2: keine Prüfung für Kontonummern mit 57)
549
+ def m2130(kto, blz, um, rv)
550
+ if rv
551
+ rv.methode = "D0b"
552
+ rv.pz_methode = 2130
553
+ end
554
+ if kto[0] == 5 && kto[1] == 7
555
+ OK_NO_CHK
556
+ else
557
+ m1130(kto, blz, um, rv)
558
+ end
559
+ end
560
+
561
+ # Methode D0a (Variante 1)
562
+ def m1130(kto, blz, um, rv)
563
+ if rv
564
+ rv.methode = "D0a"
565
+ rv.pz_methode = 1130
566
+ end
567
+ pz = kto[0] * 3 +
568
+ kto[1] * 9 +
569
+ kto[2] * 8 +
570
+ kto[3] * 7 +
571
+ kto[4] * 6 +
572
+ kto[5] * 5 +
573
+ kto[6] * 4 +
574
+ kto[7] * 3 +
575
+ kto[8] * 2
576
+ pz %= 11
577
+ if pz <= 1
578
+ pz = 0
579
+ else
580
+ pz = 11 - pz
581
+ end
582
+ # CHECK_PZ10
583
+ if rv
584
+ rv.pz_pos = 10
585
+ rv.pz = pz
586
+ end
587
+ kto[9] == pz ? OK : FALSE
588
+ end
589
+
590
+ # Methode D1
591
+ # Methode 00 mit zusätzlicher Konstante 31; Kontonummern, die mit 8
592
+ # beginnen, sind ungültig.
593
+ def m131(kto, blz, um, rv)
594
+ if rv
595
+ rv.methode = "D1"
596
+ rv.pz_methode = 131
597
+ end
598
+ return INVALID_KTO if kto[0] == 8
599
+ pz = 31
600
+
601
+ pz += kto[1] + kto[3] + kto[5] + kto[7]
602
+ pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
603
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
604
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
605
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
606
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
607
+ pz %= 10
608
+ pz = 10 - pz if pz != 0
609
+ # CHECK_PZ10
610
+ if rv
611
+ rv.pz_pos = 10
612
+ rv.pz = pz
613
+ end
614
+ kto[9] == pz ? OK : FALSE
615
+ end
616
+
617
+ # Methode D2
618
+ # Variante 1: Methode 95 (mit Ausnahmen), Variante 2: Methode 00,
619
+ # Variante 3: Methode 68 (mit diversen Sonderfällen).
620
+ def m132(kto, blz, um, rv)
621
+ if rv
622
+ rv.methode = "D2"
623
+ rv.pz_methode = 132
624
+ end
625
+ m1132(kto, blz, um, rv)
626
+ end
627
+
628
+ # Methode D2a (Variante 1: Methode 95)
629
+ def m1132(kto, blz, um, rv)
630
+ if rv
631
+ rv.methode = "D2a"
632
+ rv.pz_methode = 1132
633
+ end
634
+ s = kto.join
635
+ # Ausnahmen: keine Prüfzifferberechnung
636
+ if (s >= "0000000001" && s <= "0001999999") ||
637
+ (s >= "0009000000" && s <= "0025999999") ||
638
+ (s >= "0396000000" && s <= "0499999999") ||
639
+ (s >= "0700000000" && s <= "0799999999")
640
+ return OK_NO_CHK
641
+ end
642
+ pz = kto[0] * 4 +
643
+ kto[1] * 3 +
644
+ kto[2] * 2 +
645
+ kto[3] * 7 +
646
+ kto[4] * 6 +
647
+ kto[5] * 5 +
648
+ kto[6] * 4 +
649
+ kto[7] * 3 +
650
+ kto[8] * 2
651
+ pz %= 11
652
+ if pz <= 1
653
+ pz = 0
654
+ else
655
+ pz = 11 - pz
656
+ end
657
+ # CHECK_PZX10
658
+ if rv
659
+ rv.pz_pos = 10
660
+ rv.pz = pz
661
+ end
662
+ return OK if kto[9] == pz
663
+ return FALSE if um != 0
664
+ m2132(kto, blz, um, rv)
665
+ end
666
+
667
+ # Methode D2b (Variante 2: Methode 00)
668
+ def m2132(kto, blz, um, rv)
669
+ if rv
670
+ rv.methode = "D2b"
671
+ rv.pz_methode = 2132
672
+ end
673
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
674
+ pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
675
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
676
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
677
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
678
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
679
+ pz %= 10
680
+ pz = 10 - pz if pz != 0
681
+ # CHECK_PZX10
682
+ if rv
683
+ rv.pz_pos = 10
684
+ rv.pz = pz
685
+ end
686
+ return OK if kto[9] == pz
687
+ return FALSE if um != 0
688
+ m3132(kto, blz, um, rv)
689
+ end
690
+
691
+ # Methode D2c (Variante 3: Methode 68, mit diversen Sonderfällen; sie
692
+ # werden hier nicht getrennt nummeriert, sondern alle unter Variante 3
693
+ # geführt)
694
+ def m3132(kto, blz, um, rv)
695
+ if rv
696
+ rv.methode = "D2c"
697
+ rv.pz_methode = 3132
698
+ end
699
+
700
+ # Sonderfall: keine Prüfziffer
701
+ return OK_NO_CHK if kto[0] == 0 && kto[1] == 4
702
+
703
+ # 10stellige Kontonummern
704
+ if kto[0] != 0
705
+ return INVALID_KTO if kto[3] != 9
706
+ pz = 9 + kto[5] + kto[7] # 9: 7. Stelle von rechts
707
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
708
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
709
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
710
+ pz %= 10
711
+ pz = 10 - pz if pz != 0
712
+ # CHECK_PZ10
713
+ if rv
714
+ rv.pz_pos = 10
715
+ rv.pz = pz
716
+ end
717
+ return kto[9] == pz ? OK : FALSE
718
+ end
719
+
720
+ # 6 bis 9stellige Kontonummern: Variante 1
721
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
722
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
723
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
724
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
725
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
726
+ pz %= 10
727
+ pz = 10 - pz if pz != 0
728
+ rv.pz = pz if rv
729
+ return OK if kto[9] == pz
730
+
731
+ # 6 bis 9stellige Kontonummern: Variante 2
732
+ pz = kto[1] + kto[5] + kto[7]
733
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
734
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
735
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
736
+ pz %= 10
737
+ pz = 10 - pz if pz != 0
738
+ # CHECK_PZ10
739
+ if rv
740
+ rv.pz_pos = 10
741
+ rv.pz = pz
742
+ end
743
+ kto[9] == pz ? OK : FALSE
744
+ end
745
+
746
+ # Methode D3
747
+ # Variante 1: Methode 00, Variante 2: Methode 27 (Modulus 10, iterierte
748
+ # Transformation) für Kontonummern ab 1.000.000.000.
749
+ def m133(kto, blz, um, rv)
750
+ if rv
751
+ rv.methode = "D3"
752
+ rv.pz_methode = 133
753
+ end
754
+ m1133(kto, blz, um, rv)
755
+ end
756
+
757
+ # Methode D3a (Variante 1: Methode 00)
758
+ def m1133(kto, blz, um, rv)
759
+ if rv
760
+ rv.methode = "D3a"
761
+ rv.pz_methode = 1133
762
+ end
763
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
764
+ pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
765
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
766
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
767
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
768
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
769
+ pz %= 10
770
+ pz = 10 - pz if pz != 0
771
+ # CHECK_PZX10
772
+ if rv
773
+ rv.pz_pos = 10
774
+ rv.pz = pz
775
+ end
776
+ return OK if kto[9] == pz
777
+ return FALSE if um != 0
778
+ m2133(kto, blz, um, rv)
779
+ end
780
+
781
+ # Methode D3b (Variante 2: Methode 27)
782
+ def m2133(kto, blz, um, rv)
783
+ if rv
784
+ rv.methode = "D3b"
785
+ rv.pz_methode = 2133
786
+ end
787
+ # Kontonummern von 1 bis 999.999.999 wurden schon nach Methode 00
788
+ # geprüft, hier kann einfach FALSE zurückgegeben werden.
789
+ return FALSE if kto[0] == 0
790
+ pz = M10H_DIGITS[0][kto[0]] +
791
+ M10H_DIGITS[3][kto[1]] +
792
+ M10H_DIGITS[2][kto[2]] +
793
+ M10H_DIGITS[1][kto[3]] +
794
+ M10H_DIGITS[0][kto[4]] +
795
+ M10H_DIGITS[3][kto[5]] +
796
+ M10H_DIGITS[2][kto[6]] +
797
+ M10H_DIGITS[1][kto[7]] +
798
+ M10H_DIGITS[0][kto[8]]
799
+ pz %= 10
800
+ pz = 10 - pz if pz != 0
801
+ # CHECK_PZ10
802
+ if rv
803
+ rv.pz_pos = 10
804
+ rv.pz = pz
805
+ end
806
+ kto[9] == pz ? OK : FALSE
807
+ end
808
+
809
+ # Methode D4
810
+ # Methode 00 mit zusätzlicher Konstante 29; Kontonummern, die mit 0
811
+ # beginnen, sind ungültig.
812
+ def m134(kto, blz, um, rv)
813
+ if rv
814
+ rv.methode = "D4"
815
+ rv.pz_methode = 134
816
+ end
817
+ if kto[0] == 0
818
+ return INVALID_KTO
819
+ else
820
+ pz = 29
821
+ end
822
+
823
+ pz += kto[1] + kto[3] + kto[5] + kto[7]
824
+ pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
825
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
826
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
827
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
828
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
829
+ pz %= 10
830
+ pz = 10 - pz if pz != 0
831
+ # CHECK_PZ10
832
+ if rv
833
+ rv.pz_pos = 10
834
+ rv.pz = pz
835
+ end
836
+ kto[9] == pz ? OK : FALSE
837
+ end
838
+
839
+ # Methode D5
840
+ # Variante 1 (Stellen 3 und 4 == 99): Modulus 11, Gewichtung 2..7;
841
+ # Varianten 2-4: Modulus 11, Modulus 7 und Modulus 10, Gewichtung 2..7.
842
+ def m135(kto, blz, um, rv)
843
+ if rv
844
+ rv.methode = "D5"
845
+ rv.pz_methode = 135
846
+ end
847
+ if kto[2] == 9 && kto[3] == 9
848
+ m1135(kto, blz, um, rv)
849
+ else
850
+ m2135(kto, blz, um, rv)
851
+ end
852
+ end
853
+
854
+ # Methode D5a (Variante 1)
855
+ def m1135(kto, blz, um, rv)
856
+ if rv
857
+ rv.methode = "D5a"
858
+ rv.pz_methode = 1135
859
+ end
860
+ # die Stellen 3 und 4 sind 99; das ergibt einen Rest von 3
861
+ pz = 3 +
862
+ kto[4] * 6 +
863
+ kto[5] * 5 +
864
+ kto[6] * 4 +
865
+ kto[7] * 3 +
866
+ kto[8] * 2
867
+ pz %= 11
868
+ if pz <= 1
869
+ pz = 0
870
+ else
871
+ pz = 11 - pz
872
+ end
873
+ # CHECK_PZ10
874
+ if rv
875
+ rv.pz_pos = 10
876
+ rv.pz = pz
877
+ end
878
+ kto[9] == pz ? OK : FALSE
879
+ end
880
+
881
+ # Methode D5b (Variante 2: Modulus 11, Gewichtung 2,3,4,5,6,7)
882
+ def m2135(kto, blz, um, rv)
883
+ if rv
884
+ rv.methode = "D5b"
885
+ rv.pz_methode = 2135
886
+ end
887
+ pz = kto[3] * 7 +
888
+ kto[4] * 6 +
889
+ kto[5] * 5 +
890
+ kto[6] * 4 +
891
+ kto[7] * 3 +
892
+ kto[8] * 2
893
+ pz %= 11
894
+ if pz <= 1
895
+ pz = 0
896
+ else
897
+ pz = 11 - pz
898
+ end
899
+ # CHECK_PZX10
900
+ if rv
901
+ rv.pz_pos = 10
902
+ rv.pz = pz
903
+ end
904
+ return OK if kto[9] == pz
905
+ return FALSE if um != 0
906
+ m3135(kto, blz, um, rv)
907
+ end
908
+
909
+ # Methode D5c (Variante 3: Modulus 7, Gewichtung 2,3,4,5,6,7)
910
+ def m3135(kto, blz, um, rv)
911
+ if rv
912
+ rv.methode = "D5c"
913
+ rv.pz_methode = 3135
914
+ end
915
+ pz = kto[3] * 7 +
916
+ kto[4] * 6 +
917
+ kto[5] * 5 +
918
+ kto[6] * 4 +
919
+ kto[7] * 3 +
920
+ kto[8] * 2
921
+ pz %= 7
922
+ pz = 7 - pz if pz != 0
923
+ # CHECK_PZX10
924
+ if rv
925
+ rv.pz_pos = 10
926
+ rv.pz = pz
927
+ end
928
+ return OK if kto[9] == pz
929
+ return FALSE if um != 0
930
+ m4135(kto, blz, um, rv)
931
+ end
932
+
933
+ # Methode D5d (Variante 4: Modulus 10, Gewichtung 2,3,4,5,6,7)
934
+ def m4135(kto, blz, um, rv)
935
+ if rv
936
+ rv.methode = "D5d"
937
+ rv.pz_methode = 4135
938
+ end
939
+ pz = kto[3] * 7 +
940
+ kto[4] * 6 +
941
+ kto[5] * 5 +
942
+ kto[6] * 4 +
943
+ kto[7] * 3 +
944
+ kto[8] * 2
945
+ pz %= 10
946
+ pz = 10 - pz if pz != 0
947
+ # CHECK_PZ10
948
+ if rv
949
+ rv.pz_pos = 10
950
+ rv.pz = pz
951
+ end
952
+ kto[9] == pz ? OK : FALSE
953
+ end
954
+
955
+ # Methode D6
956
+ # Variante 1: Methode 07, Variante 2: Methode 03, Variante 3: Methode 00.
957
+ def m136(kto, blz, um, rv)
958
+ if rv
959
+ rv.methode = "D6"
960
+ rv.pz_methode = 136
961
+ end
962
+ m1136(kto, blz, um, rv)
963
+ end
964
+
965
+ # Methode D6a (Variante 1: Methode 07)
966
+ def m1136(kto, blz, um, rv)
967
+ if rv
968
+ rv.methode = "D6a"
969
+ rv.pz_methode = 1136
970
+ end
971
+ pz = kto[0] * 10 +
972
+ kto[1] * 9 +
973
+ kto[2] * 8 +
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
+ pz %= 11
981
+ pz = 11 - pz if pz != 0
982
+ # CHECK_PZX10
983
+ if rv
984
+ rv.pz_pos = 10
985
+ rv.pz = pz
986
+ end
987
+ return OK if kto[9] == pz
988
+ return FALSE if um != 0
989
+ m2136(kto, blz, um, rv)
990
+ end
991
+
992
+ # Methode D6b (Variante 2: Methode 03)
993
+ def m2136(kto, blz, um, rv)
994
+ if rv
995
+ rv.methode = "D6b"
996
+ rv.pz_methode = 2136
997
+ end
998
+ pz = kto[0] * 2 +
999
+ kto[1] +
1000
+ kto[2] * 2 +
1001
+ kto[3] +
1002
+ kto[4] * 2 +
1003
+ kto[5] +
1004
+ kto[6] * 2 +
1005
+ kto[7] +
1006
+ kto[8] * 2
1007
+ pz %= 10
1008
+ pz = 10 - pz if pz != 0
1009
+ # CHECK_PZX10
1010
+ if rv
1011
+ rv.pz_pos = 10
1012
+ rv.pz = pz
1013
+ end
1014
+ return OK if kto[9] == pz
1015
+ return FALSE if um != 0
1016
+ m3136(kto, blz, um, rv)
1017
+ end
1018
+
1019
+ # Methode D6c (Variante 3: Methode 00)
1020
+ def m3136(kto, blz, um, rv)
1021
+ if rv
1022
+ rv.methode = "D6c"
1023
+ rv.pz_methode = 3136
1024
+ end
1025
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
1026
+ pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
1027
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
1028
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
1029
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
1030
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
1031
+ pz %= 10
1032
+ pz = 10 - pz if pz != 0
1033
+ # CHECK_PZ10
1034
+ if rv
1035
+ rv.pz_pos = 10
1036
+ rv.pz = pz
1037
+ end
1038
+ kto[9] == pz ? OK : FALSE
1039
+ end
1040
+
1041
+ # Methode D7
1042
+ # Methode 00, allerdings ohne die abschließende Subtraktion von 10
1043
+ # (die Prüfziffer ist direkt der Rest der Division durch 10).
1044
+ def m137(kto, blz, um, rv)
1045
+ if rv
1046
+ rv.methode = "D7"
1047
+ rv.pz_methode = 137
1048
+ end
1049
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
1050
+ pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
1051
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
1052
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
1053
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
1054
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
1055
+ pz %= 10
1056
+ # CHECK_PZ10
1057
+ if rv
1058
+ rv.pz_pos = 10
1059
+ rv.pz = pz
1060
+ end
1061
+ kto[9] == pz ? OK : FALSE
1062
+ end
1063
+
1064
+ # Methode D8
1065
+ # Variante 2: Kontonummern 0010000000 bis 0099999999 werden nicht
1066
+ # geprüft, kleinere sind ungültig; Variante 1: Methode 00.
1067
+ def m138(kto, blz, um, rv)
1068
+ if rv
1069
+ rv.methode = "D8"
1070
+ rv.pz_methode = 138
1071
+ end
1072
+ m2138(kto, blz, um, rv)
1073
+ end
1074
+
1075
+ # Methode D8b (Variante 2)
1076
+ def m2138(kto, blz, um, rv)
1077
+ if rv
1078
+ rv.methode = "D8b"
1079
+ rv.pz_methode = 2138
1080
+ end
1081
+ if kto[0] == 0
1082
+ if kto[1] == 0 && kto[2] > 0
1083
+ return OK_NO_CHK
1084
+ else
1085
+ return INVALID_KTO
1086
+ end
1087
+ end
1088
+ m1138(kto, blz, um, rv)
1089
+ end
1090
+
1091
+ # Methode D8a (Variante 1: Methode 00)
1092
+ def m1138(kto, blz, um, rv)
1093
+ if rv
1094
+ rv.methode = "D8a"
1095
+ rv.pz_methode = 1138
1096
+ end
1097
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
1098
+ pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
1099
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
1100
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
1101
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
1102
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
1103
+ pz %= 10
1104
+ pz = 10 - pz if pz != 0
1105
+ # CHECK_PZ10
1106
+ if rv
1107
+ rv.pz_pos = 10
1108
+ rv.pz = pz
1109
+ end
1110
+ kto[9] == pz ? OK : FALSE
1111
+ end
1112
+
1113
+ # Methode D9
1114
+ # Variante 1: Methode 00, Variante 2: Methode 10, Variante 3: Methode 18.
1115
+ def m139(kto, blz, um, rv)
1116
+ if rv
1117
+ rv.methode = "D9"
1118
+ rv.pz_methode = 139
1119
+ end
1120
+ m1139(kto, blz, um, rv)
1121
+ end
1122
+
1123
+ # Methode D9a (Variante 1: Methode 00)
1124
+ def m1139(kto, blz, um, rv)
1125
+ if rv
1126
+ rv.methode = "D9a"
1127
+ rv.pz_methode = 1139
1128
+ end
1129
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
1130
+ pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
1131
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
1132
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
1133
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
1134
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
1135
+ pz %= 10
1136
+ pz = 10 - pz if pz != 0
1137
+ # CHECK_PZX10
1138
+ if rv
1139
+ rv.pz_pos = 10
1140
+ rv.pz = pz
1141
+ end
1142
+ return OK if kto[9] == pz
1143
+ return FALSE if um != 0
1144
+ m2139(kto, blz, um, rv)
1145
+ end
1146
+
1147
+ # Methode D9b (Variante 2: Methode 10)
1148
+ def m2139(kto, blz, um, rv)
1149
+ if rv
1150
+ rv.methode = "D9b"
1151
+ rv.pz_methode = 2139
1152
+ end
1153
+ pz = kto[0] * 10 +
1154
+ kto[1] * 9 +
1155
+ kto[2] * 8 +
1156
+ kto[3] * 7 +
1157
+ kto[4] * 6 +
1158
+ kto[5] * 5 +
1159
+ kto[6] * 4 +
1160
+ kto[7] * 3 +
1161
+ kto[8] * 2
1162
+ pz %= 11
1163
+ if pz <= 1
1164
+ pz = 0
1165
+ else
1166
+ pz = 11 - pz
1167
+ end
1168
+ # CHECK_PZX10
1169
+ if rv
1170
+ rv.pz_pos = 10
1171
+ rv.pz = pz
1172
+ end
1173
+ return OK if kto[9] == pz
1174
+ return FALSE if um != 0
1175
+ m3139(kto, blz, um, rv)
1176
+ end
1177
+
1178
+ # Methode D9c (Variante 3: Methode 18)
1179
+ def m3139(kto, blz, um, rv)
1180
+ if rv
1181
+ rv.methode = "D9c"
1182
+ rv.pz_methode = 3139
1183
+ end
1184
+ pz = kto[0] * 3 +
1185
+ kto[1] +
1186
+ kto[2] * 7 +
1187
+ kto[3] * 9 +
1188
+ kto[4] * 3 +
1189
+ kto[5] +
1190
+ kto[6] * 7 +
1191
+ kto[7] * 9 +
1192
+ kto[8] * 3
1193
+ pz %= 10
1194
+ pz = 10 - pz if pz != 0
1195
+ # CHECK_PZ10
1196
+ if rv
1197
+ rv.pz_pos = 10
1198
+ rv.pz = pz
1199
+ end
1200
+ kto[9] == pz ? OK : FALSE
1201
+ end
1202
+
1203
+ # Methode E0
1204
+ # Das Verfahren entspricht (bis auf die zusätzliche 7) genau dem
1205
+ # Verfahren 00.
1206
+ def m140(kto, blz, um, rv)
1207
+ if rv
1208
+ rv.methode = "E0"
1209
+ rv.pz_methode = 140
1210
+ end
1211
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
1212
+ pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
1213
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
1214
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
1215
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
1216
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
1217
+ pz += 7
1218
+ pz %= 10
1219
+ pz = 10 - pz if pz != 0
1220
+ # CHECK_PZ10
1221
+ if rv
1222
+ rv.pz_pos = 10
1223
+ rv.pz = pz
1224
+ end
1225
+ kto[9] == pz ? OK : FALSE
1226
+ end
1227
+
1228
+ # Methode E1
1229
+ # Modulus 11, Gewichtung 1,2,3,4,5,6,11,10,9 (von rechts); die Prüfziffer
1230
+ # ist der Rest selbst, Rest 10 ist ungültig.
1231
+ def m141(kto, blz, um, rv)
1232
+ if rv
1233
+ rv.methode = "E1"
1234
+ rv.pz_methode = 141
1235
+ end
1236
+ # die Form (kto[x]+48) entspricht dem C-Code (für nicht-ASCII Plattformen)
1237
+ pz = (kto[0] + 48) * 9 +
1238
+ (kto[1] + 48) * 10 +
1239
+ (kto[2] + 48) * 11 +
1240
+ (kto[3] + 48) * 6 +
1241
+ (kto[4] + 48) * 5 +
1242
+ (kto[5] + 48) * 4 +
1243
+ (kto[6] + 48) * 3 +
1244
+ (kto[7] + 48) * 2 +
1245
+ (kto[8] + 48) -
1246
+ 2442
1247
+ pz %= 11
1248
+ return FALSE if pz == 10
1249
+ # CHECK_PZ10
1250
+ if rv
1251
+ rv.pz_pos = 10
1252
+ rv.pz = pz
1253
+ end
1254
+ kto[9] == pz ? OK : FALSE
1255
+ end
1256
+
1257
+ # Methode E2
1258
+ # Methode 00 mit zusätzlicher Konstante 25; Kontonummern, deren erste
1259
+ # Stelle größer als 5 ist, sind ungültig.
1260
+ def m142(kto, blz, um, rv)
1261
+ if rv
1262
+ rv.methode = "E2"
1263
+ rv.pz_methode = 142
1264
+ end
1265
+ return INVALID_KTO if kto[0] > 5
1266
+ pz = 25
1267
+
1268
+ pz += kto[1] + kto[3] + kto[5] + kto[7]
1269
+ pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
1270
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
1271
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
1272
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
1273
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
1274
+ pz %= 10
1275
+ pz = 10 - pz if pz != 0
1276
+ # CHECK_PZ10
1277
+ if rv
1278
+ rv.pz_pos = 10
1279
+ rv.pz = pz
1280
+ end
1281
+ kto[9] == pz ? OK : FALSE
1282
+ end
1283
+
1284
+ # Methode E3
1285
+ # Variante 1: Methode 00, Variante 2: Methode 21 (Quersummen-Iteration).
1286
+ def m143(kto, blz, um, rv)
1287
+ if rv
1288
+ rv.methode = "E3"
1289
+ rv.pz_methode = 143
1290
+ end
1291
+ m1143(kto, blz, um, rv)
1292
+ end
1293
+
1294
+ # Methode E3a (Variante 1: Methode 00)
1295
+ def m1143(kto, blz, um, rv)
1296
+ if rv
1297
+ rv.methode = "E3a"
1298
+ rv.pz_methode = 1143
1299
+ end
1300
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
1301
+ pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
1302
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
1303
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
1304
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
1305
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
1306
+ pz %= 10
1307
+ pz = 10 - pz if pz != 0
1308
+ # CHECK_PZX10
1309
+ if rv
1310
+ rv.pz_pos = 10
1311
+ rv.pz = pz
1312
+ end
1313
+ return OK if kto[9] == pz
1314
+ return FALSE if um != 0
1315
+ m2143(kto, blz, um, rv)
1316
+ end
1317
+
1318
+ # Methode E3b (Variante 2: Methode 21)
1319
+ def m2143(kto, blz, um, rv)
1320
+ if rv
1321
+ rv.methode = "E3b"
1322
+ rv.pz_methode = 2143
1323
+ end
1324
+ pz = kto[0] * 2 +
1325
+ kto[1] +
1326
+ kto[2] * 2 +
1327
+ kto[3] +
1328
+ kto[4] * 2 +
1329
+ kto[5] +
1330
+ kto[6] * 2 +
1331
+ kto[7] +
1332
+ kto[8] * 2
1333
+ # iterierte Quersumme (wie im C-Code ausgeschrieben)
1334
+ pz = pz - 80 + 8 if pz >= 80
1335
+ pz = pz - 40 + 4 if pz >= 40
1336
+ pz = pz - 20 + 2 if pz >= 20
1337
+ pz = pz - 10 + 1 if pz >= 10
1338
+ pz = pz - 10 + 1 if pz >= 10
1339
+ pz = 10 - pz if pz != 0
1340
+ # CHECK_PZ10
1341
+ if rv
1342
+ rv.pz_pos = 10
1343
+ rv.pz = pz
1344
+ end
1345
+ kto[9] == pz ? OK : FALSE
1346
+ end
1347
+
1348
+ # Methode E4
1349
+ # Variante 1: Methode 02, Variante 2: Methode 00.
1350
+ def m144(kto, blz, um, rv)
1351
+ if rv
1352
+ rv.methode = "E4"
1353
+ rv.pz_methode = 144
1354
+ end
1355
+ m1144(kto, blz, um, rv)
1356
+ end
1357
+
1358
+ # Methode E4a (Variante 1: Methode 02)
1359
+ def m1144(kto, blz, um, rv)
1360
+ if rv
1361
+ rv.methode = "E4a"
1362
+ rv.pz_methode = 1144
1363
+ end
1364
+ pz = kto[0] * 2 +
1365
+ kto[1] * 9 +
1366
+ kto[2] * 8 +
1367
+ kto[3] * 7 +
1368
+ kto[4] * 6 +
1369
+ kto[5] * 5 +
1370
+ kto[6] * 4 +
1371
+ kto[7] * 3 +
1372
+ kto[8] * 2
1373
+ pz %= 11
1374
+ pz = 11 - pz if pz != 0
1375
+ # CHECK_PZX10
1376
+ if rv
1377
+ rv.pz_pos = 10
1378
+ rv.pz = pz
1379
+ end
1380
+ return OK if kto[9] == pz
1381
+ return FALSE if um != 0
1382
+ m2144(kto, blz, um, rv)
1383
+ end
1384
+
1385
+ # Methode E4b (Variante 2: Methode 00)
1386
+ def m2144(kto, blz, um, rv)
1387
+ if rv
1388
+ rv.methode = "E4b"
1389
+ rv.pz_methode = 2144
1390
+ end
1391
+ pz = kto[1] + kto[3] + kto[5] + kto[7]
1392
+ pz += kto[0] < 5 ? kto[0] * 2 : kto[0] * 2 - 9
1393
+ pz += kto[2] < 5 ? kto[2] * 2 : kto[2] * 2 - 9
1394
+ pz += kto[4] < 5 ? kto[4] * 2 : kto[4] * 2 - 9
1395
+ pz += kto[6] < 5 ? kto[6] * 2 : kto[6] * 2 - 9
1396
+ pz += kto[8] < 5 ? kto[8] * 2 : kto[8] * 2 - 9
1397
+ pz %= 10
1398
+ pz = 10 - pz if pz != 0
1399
+ # CHECK_PZ10
1400
+ if rv
1401
+ rv.pz_pos = 10
1402
+ rv.pz = pz
1403
+ end
1404
+ kto[9] == pz ? OK : FALSE
1405
+ end
1406
+ end
1407
+ end