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.
- checksums.yaml +7 -0
- data/CHANGELOG.md +26 -0
- data/COPYRIGHT +22 -0
- data/LICENSE +504 -0
- data/README.md +295 -0
- data/bin/konto_check_ruby +202 -0
- data/data/README.md +17 -0
- data/data/blz.lut2f +0 -0
- data/data/iban_regeln.txt +1260 -0
- data/lib/konto_check_ruby/bank_data.rb +421 -0
- data/lib/konto_check_ruby/blz_file.rb +705 -0
- data/lib/konto_check_ruby/check_methods/part1.rb +1634 -0
- data/lib/konto_check_ruby/check_methods/part2.rb +1604 -0
- data/lib/konto_check_ruby/check_methods/part3.rb +1905 -0
- data/lib/konto_check_ruby/check_methods/part4.rb +1738 -0
- data/lib/konto_check_ruby/check_methods/part5.rb +1407 -0
- data/lib/konto_check_ruby/check_methods.rb +147 -0
- data/lib/konto_check_ruby/collation.rb +52 -0
- data/lib/konto_check_ruby/engine.rb +1006 -0
- data/lib/konto_check_ruby/iban_rules.rb +1060 -0
- data/lib/konto_check_ruby/konto_check.rb +1578 -0
- data/lib/konto_check_ruby/lut_file.rb +457 -0
- data/lib/konto_check_ruby/raw.rb +614 -0
- data/lib/konto_check_ruby/retvals.rb +826 -0
- data/lib/konto_check_ruby/search.rb +440 -0
- data/lib/konto_check_ruby/update.rb +176 -0
- data/lib/konto_check_ruby/version.rb +18 -0
- data/lib/konto_check_ruby.rb +42 -0
- metadata +112 -0
|
@@ -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
|