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,1060 @@
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
+ require_relative "retvals"
14
+
15
+ module KontoCheckRuby
16
+ # Port of iban_regel_cvt() from konto_check.c: applies the IBAN rules of
17
+ # the Deutsche Bundesbank to a BLZ/account combination. The rules may
18
+ # replace the BLZ and/or the account number, forbid the IBAN calculation
19
+ # or prescribe a BIC.
20
+ #
21
+ # This module is included into Engine and uses its lookup helpers.
22
+ module IbanRules
23
+ # ---------------------------------------------------------------- Regel 5
24
+ # Kontenkreis 9 98000000..99499999 ohne IBAN-Berechnung (Commerzbank)
25
+ IBAN_R5_NO_IBAN_BLZ = [
26
+ 10080900, 12080000, 13080000, 14080000, 15080000, 16080000, 17080000, 18080000,
27
+ 20080055, 20080057, 21080050, 21280002, 21480003, 21580000, 22180000, 22181400,
28
+ 22280000, 24080000, 24180001, 25480021, 25780022, 25980027, 26080024, 26281420,
29
+ 26580070, 26880063, 26981062, 28280012, 29280011, 30080055, 30080057, 31080015,
30
+ 32080010, 33080030, 34080031, 34280032, 36280071, 36580072, 40080040, 41280043,
31
+ 42080082, 42680081, 43080083, 44080055, 44080057, 44580070, 45080060, 46080010,
32
+ 47880031, 49080025, 50080055, 50080057, 50080082, 50680002, 50780006, 50880050,
33
+ 51380040, 52080080, 53080030, 54080021, 54280023, 54580020, 54680022, 55080065,
34
+ 57080070, 58580074, 59080090, 60080055, 60080057, 60380002, 60480008, 61080006,
35
+ 61281007, 61480001, 62080012, 62280012, 63080015, 64080014, 64380011, 65080009,
36
+ 65180005, 65380003, 66280053, 66680013, 67280051, 69280035, 70080056, 70080057,
37
+ 70380006, 71180005, 72180002, 73180011, 73380004, 73480013, 74180009, 74380007,
38
+ 75080003, 76080053, 79080052, 79380051, 79580099, 80080000, 81080000, 82080000,
39
+ 83080000, 84080000, 85080200, 86080055, 86080057, 87080000
40
+ ].freeze
41
+
42
+ # ab Version 1 der Regel 5 freigegeben (im Kontenkreis 98000000..99499999)
43
+ IBAN_R5_NO_IBAN_BLZ_V0 = [50080081, 51080000].freeze
44
+
45
+ # BLZs ohne IBAN-Berechnung, ab Version 1 freigegeben
46
+ IBAN_R5_BLZ_V0 = [
47
+ 10045050, 70045050, 10040085, 35040085, 36040085,
48
+ 44040085, 50040085, 67040085, 82040085
49
+ ].freeze
50
+
51
+ # Spendenkonten der Commerzbank: BLZ => { [k1, k2] => neue Kontonummer }
52
+ IBAN_R5_SPENDEN = {
53
+ 10040000 => { [0, 7878] => "0267878700" },
54
+ 10080000 => { [0, 1987] => "0928127700", [0, 8888] => "0928126501", [0, 1234567] => "0920192001" },
55
+ 12080000 => { [0, 212121] => "4050462200", [0, 7654321] => "0144000700", [0, 12121212] => "4101725100" },
56
+ 16080000 => { [0, 123456] => "0012345600", [0, 3030400] => "4205227110" },
57
+ 20080000 => { [0, 2222] => "0903927200", [0, 505050] => "0500100600", [0, 666666] => "0900732500" },
58
+ 25040066 => { [0, 1919] => "0141919100" },
59
+ 26580070 => { [0, 700] => "0710000000" },
60
+ 29080010 => { [0, 124124] => "0107502000", [0, 12412400] => "0107502000" },
61
+ 30040000 => { [0, 36] => "0261103600", [0, 222] => "0348010002", [0, 999] => "0123799900" },
62
+ 30080000 => { [0, 700000] => "0800005000", [0, 70000000] => "0800005000" },
63
+ 32040024 => { [0, 47800] => "0155515000" },
64
+ 34280032 => { [0, 14111935] => "0645753800" },
65
+ 36040039 => { [0, 150] => "0161620000" },
66
+ 37040044 => { [0, 1888] => "0212129101", [0, 102030] => "0222344400", [0, 300000] => "0300000700" },
67
+ 37080040 => { [0, 100] => "0269100000", [0, 111] => "0215022000", [0, 4004] => "0233533500",
68
+ [0, 4444] => "0233000300", [0, 55555] => "0263602501", [0, 182002] => "0216603302",
69
+ [0, 300000] => "0983307900", [0, 333333] => "0270330000", [0, 414141] => "0041414100",
70
+ [0, 555666] => "0055566600", [0, 909090] => "0269100000", [0, 5555500] => "0263602501" },
71
+ 38040007 => { [0, 100] => "0119160000", [0, 240] => "0109024000", [0, 3366] => "0385333000",
72
+ [0, 55555] => "0305555500", [0, 336666] => "0105232300", [0, 414141] => "0108000100",
73
+ [0, 909090] => "0119160000", [0, 1555555] => "0258266600", [0, 43434343] => "0118163500" },
74
+ 39040013 => { [0, 556] => "0106555600" },
75
+ 39080005 => { [0, 556] => "0204655600", [0, 9800] => "0208457000" },
76
+ 43080083 => { [0, 4630] => "0825110100" },
77
+ 44040037 => { [1, 11111111] => "0320565500" },
78
+ 47840065 => { [0, 50] => "0150103000", [0, 55] => "0150103000", [0, 99] => "0150103000" },
79
+ 47880031 => { [0, 50] => "0519899900" },
80
+ 50040000 => { [0, 2000] => "0728400300", [0, 101010] => "0311011100" },
81
+ 50080000 => { [0, 6060] => "0096736100", [0, 9000] => "0026492100", [0, 42195] => "0900333200",
82
+ [0, 101010] => "0090003500" },
83
+ 50640015 => { [0, 777] => "0222222200" },
84
+ 51080060 => { [0, 123] => "0012299300" },
85
+ 55040022 => { [0, 555] => "0211050000", [0, 343434] => "0217900000" },
86
+ 57080070 => { [0, 661] => "0604101200" },
87
+ 60040071 => { [0, 502] => "0525950200", [5, 500500] => "0512700600" },
88
+ 60080000 => { [0, 502] => "0901581400", [5, 500500] => "0901581400" },
89
+ 61080006 => { [0, 9999999] => "0202427500" },
90
+ 64140036 => { [0, 8907339] => "0890733900" },
91
+ 66280053 => { [0, 121212] => "0625242400" },
92
+ 68080030 => { [0, 202] => "0416520200" },
93
+ 69240075 => { [0, 444] => "0445520000" },
94
+ 70040041 => { [4, 500500] => "0400500500", [0, 94] => "0212808000", [0, 1111111] => "0152140000",
95
+ [0, 7777777] => "0213600000" },
96
+ 70080000 => { [0, 94] => "0928553201", [0, 700000] => "0750055500", [0, 900000] => "0319966601",
97
+ [0, 949494] => "0575757500", [0, 1111111] => "0448060000", [0, 7777777] => "0443540000",
98
+ [0, 9000000] => "0319966601", [0, 70000000] => "0750055500" },
99
+ 75040062 => { [0, 6008833] => "0600883300" },
100
+ 76040061 => { [0, 2500000] => "0482146800" },
101
+ 79040047 => { [0, 9696] => "0680210200" },
102
+ 79080052 => { [0, 9696] => "0300021700" },
103
+ 85080000 => { [0, 400000] => "0459488501" },
104
+ 86080000 => { [0, 1212] => "0480375900", [0, 121200] => "0480375900" }
105
+ }.freeze
106
+
107
+ # ------------------------------------------------------------ Regeln 31-35
108
+ # "Tabelle zu Kontokreise exHypo": Kontokreis (erste drei Ziffern der
109
+ # 10-stelligen Kontonummer) => Nachfolge-BLZ
110
+ IBAN_R31_KONTOKREIS = {
111
+ 100 => "76020070", 101 => "10020890", 102 => "78320076", 103 => "79320075", 104 => "76320072",
112
+ 105 => "79020076", 106 => "79320075", 107 => "79320075", 108 => "77320072", 109 => "79320075",
113
+ 110 => "76220073", 111 => "76020070", 112 => "79320075", 113 => "76020070", 114 => "76020070",
114
+ 115 => "76520071", 117 => "77120073", 118 => "76020070", 119 => "75320075", 120 => "72120078",
115
+ 121 => "76220073", 122 => "76320072", 123 => "76420080", 124 => "76320072", 125 => "79520070",
116
+ 126 => "77320072", 127 => "78020070", 128 => "78020070", 129 => "77120073", 130 => "78020070",
117
+ 131 => "78020070", 132 => "60020290", 134 => "78020070", 135 => "77020070", 136 => "79520070",
118
+ 137 => "79320075", 138 => "61120286", 139 => "66020286", 140 => "79020076", 142 => "64020186",
119
+ 143 => "60020290", 144 => "79020076", 145 => "66020286", 146 => "72120078", 147 => "72223182",
120
+ 148 => "76520071", 149 => "79020076", 150 => "76020070", 151 => "76320072", 152 => "78320076",
121
+ 154 => "70020270", 155 => "76520071", 156 => "76020070", 157 => "10020890", 158 => "70020270",
122
+ 159 => "54520194", 160 => "70020270", 161 => "54520194", 162 => "70020270", 163 => "70020270",
123
+ 164 => "70020270", 166 => "71120078", 167 => "74320073", 168 => "70320090", 169 => "79020076",
124
+ 170 => "70020270", 172 => "70020270", 174 => "70020270", 175 => "72120078", 176 => "74020074",
125
+ 177 => "74320073", 178 => "70020270", 181 => "77320072", 182 => "79520070", 183 => "70020270",
126
+ 185 => "70020270", 186 => "79020076", 188 => "70020270", 189 => "70020270", 190 => "76020070",
127
+ 191 => "77020070", 192 => "70025175", 193 => "85020086", 194 => "76020070", 196 => "72020070",
128
+ 198 => "76320072", 199 => "70020270", 201 => "76020070", 202 => "76020070", 203 => "76020070",
129
+ 204 => "76020070", 205 => "79520070", 206 => "79520070", 207 => "71120078", 208 => "73120075",
130
+ 209 => "18020086", 210 => "10020890", 211 => "60020290", 212 => "51020186", 214 => "75020073",
131
+ 215 => "63020086", 216 => "75020073", 217 => "79020076", 218 => "59020090", 219 => "79520070",
132
+ 220 => "73322380", 221 => "73120075", 222 => "73421478", 223 => "74320073", 224 => "73322380",
133
+ 225 => "74020074", 227 => "75020073", 228 => "71120078", 229 => "80020086", 230 => "72120078",
134
+ 231 => "72020070", 232 => "75021174", 233 => "71020072", 234 => "71022182", 235 => "74320073",
135
+ 236 => "71022182", 237 => "76020070", 238 => "63020086", 239 => "70020270", 240 => "75320075",
136
+ 241 => "76220073", 243 => "72020070", 245 => "72120078", 246 => "74320073", 247 => "60020290",
137
+ 248 => "85020086", 249 => "73321177", 250 => "73420071", 251 => "70020270", 252 => "70020270",
138
+ 253 => "70020270", 254 => "10020890", 255 => "50820292", 256 => "71022182", 257 => "83020086",
139
+ 258 => "79320075", 259 => "71120077", 260 => "10020890", 261 => "70025175", 262 => "72020070",
140
+ 264 => "74020074", 267 => "63020086", 268 => "70320090", 269 => "71122183", 270 => "82020086",
141
+ 271 => "75020073", 272 => "73420071", 274 => "63020086", 276 => "70020270", 277 => "74320073",
142
+ 278 => "71120077", 279 => "10020890", 281 => "71120078", 282 => "70020270", 283 => "72020070",
143
+ 284 => "79320075", 286 => "54520194", 287 => "70020270", 288 => "75220070", 291 => "77320072",
144
+ 292 => "76020070", 293 => "72020070", 294 => "54520194", 295 => "70020270", 296 => "70020270",
145
+ 299 => "72020070", 301 => "85020086", 302 => "54520194", 304 => "70020270", 308 => "70020270",
146
+ 309 => "54520194", 310 => "72020070", 312 => "74120071", 313 => "76320072", 314 => "70020270",
147
+ 315 => "70020270", 316 => "70020270", 317 => "70020270", 318 => "70020270", 320 => "71022182",
148
+ 321 => "75220070", 322 => "79520070", 324 => "70020270", 326 => "85020086", 327 => "72020070",
149
+ 328 => "72020070", 329 => "70020270", 330 => "76020070", 331 => "70020270", 333 => "70020270",
150
+ 334 => "75020073", 335 => "70020270", 337 => "80020086", 341 => "10020890", 342 => "10020890",
151
+ 344 => "70020270", 345 => "77020070", 346 => "76020070", 350 => "79320075", 351 => "79320075",
152
+ 352 => "70020270", 353 => "70020270", 354 => "72223182", 355 => "72020070", 356 => "70020270",
153
+ 358 => "54220091", 359 => "76220073", 360 => "80020087", 361 => "70020270", 362 => "70020270",
154
+ 363 => "70020270", 366 => "72220074", 367 => "70020270", 368 => "10020890", 369 => "76520071",
155
+ 370 => "85020086", 371 => "70020270", 373 => "70020270", 374 => "73120075", 375 => "70020270",
156
+ 379 => "70020270", 380 => "70020270", 381 => "70020270", 382 => "79520070", 383 => "72020070",
157
+ 384 => "72020070", 386 => "70020270", 387 => "70020270", 389 => "70020270", 390 => "67020190",
158
+ 391 => "70020270", 392 => "70020270", 393 => "54520194", 394 => "70020270", 396 => "70020270",
159
+ 398 => "66020286", 399 => "87020088", 401 => "30220190", 402 => "36020186", 403 => "38020090",
160
+ 404 => "30220190", 405 => "68020186", 406 => "48020086", 407 => "37020090", 408 => "68020186",
161
+ 409 => "10020890", 410 => "66020286", 411 => "60420186", 412 => "57020086", 422 => "70020270",
162
+ 423 => "70020270", 424 => "76020070", 426 => "70025175", 427 => "50320191", 428 => "70020270",
163
+ 429 => "85020086", 432 => "70020270", 434 => "60020290", 435 => "76020070", 436 => "76020070",
164
+ 437 => "70020270", 438 => "70020270", 439 => "70020270", 440 => "70020270", 441 => "70020270",
165
+ 442 => "85020086", 443 => "55020486", 444 => "50520190", 446 => "80020086", 447 => "70020270",
166
+ 450 => "30220190", 451 => "44020090", 452 => "70020270", 453 => "70020270", 456 => "10020890",
167
+ 457 => "87020086", 458 => "54520194", 459 => "61120286", 460 => "70020270", 461 => "70020270",
168
+ 462 => "70020270", 463 => "70020270", 465 => "70020270", 466 => "10020890", 467 => "10020890",
169
+ 468 => "70020270", 469 => "60320291", 470 => "65020186", 471 => "84020087", 472 => "76020070",
170
+ 473 => "74020074", 476 => "78320076", 477 => "78320076", 478 => "87020088", 480 => "70020270",
171
+ 481 => "70020270", 482 => "84020087", 484 => "70020270", 485 => "50320191", 486 => "70020270",
172
+ 488 => "67220286", 489 => "10020890", 490 => "10020890", 491 => "16020086", 492 => "10020890",
173
+ 494 => "79020076", 495 => "87020088", 497 => "87020087", 499 => "79020076", 502 => "10020890",
174
+ 503 => "10020890", 505 => "70020270", 506 => "10020890", 507 => "87020086", 508 => "86020086",
175
+ 509 => "83020087", 510 => "80020086", 511 => "83020086", 513 => "85020086", 515 => "17020086",
176
+ 518 => "82020086", 519 => "83020086", 522 => "10020890", 523 => "70020270", 524 => "85020086",
177
+ 525 => "70020270", 527 => "82020088", 528 => "10020890", 530 => "10020890", 531 => "10020890",
178
+ 533 => "50320191", 534 => "70020270", 536 => "85020086", 538 => "82020086", 540 => "65020186",
179
+ 541 => "80020087", 545 => "18020086", 546 => "10020890", 547 => "10020890", 548 => "10020890",
180
+ 549 => "82020087", 555 => "79020076", 560 => "79320075", 567 => "86020086", 572 => "10020890",
181
+ 580 => "70020270", 581 => "70020270", 601 => "74320073", 602 => "70020270", 603 => "70020270",
182
+ 604 => "70020270", 605 => "70020270", 606 => "70020270", 607 => "74320073", 608 => "72020070",
183
+ 609 => "72020070", 610 => "72020070", 611 => "72020070", 612 => "71120077", 613 => "70020270",
184
+ 614 => "72020070", 615 => "70025175", 616 => "73420071", 617 => "68020186", 618 => "73120075",
185
+ 619 => "60020290", 620 => "71120077", 621 => "71120077", 622 => "74320073", 623 => "72020070",
186
+ 624 => "71020072", 625 => "71023173", 626 => "71020072", 627 => "71021270", 628 => "71120077",
187
+ 629 => "73120075", 630 => "71121176", 631 => "71022182", 632 => "70020270", 633 => "74320073",
188
+ 634 => "70020270", 635 => "70320090", 636 => "70320090", 637 => "72120078", 638 => "72120078",
189
+ 640 => "70020270", 641 => "70020270", 643 => "74320073", 644 => "70020270", 645 => "70020270",
190
+ 646 => "70020270", 647 => "70020270", 648 => "72120078", 649 => "72122181", 650 => "54520194",
191
+ 652 => "71021270", 653 => "70020270", 654 => "70020270", 655 => "72120078", 656 => "71120078",
192
+ 657 => "71020072", 658 => "68020186", 659 => "54520194", 660 => "54620093", 661 => "74320073",
193
+ 662 => "73120075", 663 => "70322192", 664 => "72120078", 665 => "70321194", 666 => "73322380",
194
+ 667 => "60020290", 668 => "60020290", 669 => "73320073", 670 => "75020073", 671 => "74220075",
195
+ 672 => "74020074", 673 => "74020074", 674 => "74120071", 675 => "74020074", 676 => "74020074",
196
+ 677 => "72020070", 678 => "72020070", 679 => "54520194", 680 => "71120077", 681 => "67020190",
197
+ 682 => "78020070", 683 => "71020072", 684 => "70020270", 685 => "70020270", 686 => "70020270",
198
+ 687 => "70020270", 688 => "70020270", 689 => "70020270", 690 => "76520071", 692 => "70020270",
199
+ 693 => "73420071", 694 => "70021180", 695 => "70320090", 696 => "74320073", 697 => "54020090",
200
+ 698 => "73320073", 710 => "30220190", 711 => "70020270", 712 => "10020890", 714 => "76020070",
201
+ 715 => "75020073", 717 => "74320073", 718 => "87020086", 719 => "37020090", 720 => "30220190",
202
+ 723 => "77320072", 733 => "83020087", 798 => "70020270",
203
+ }.freeze
204
+
205
+ # --------------------------------------------------------------- Regel 53
206
+ # BLZ => { [k1, k2] => echte Kontonummer }; BLZ neu ist stets 60050101,
207
+ # der BIC stets SOLADEST600
208
+ IBAN_R53_SONDERKONTEN = {
209
+ 55050000 => { [0, 901] => "7401507497", [0, 902] => "7401507473", [0, 908] => "7401507480",
210
+ [0, 910] => "7401507466", [0, 3500] => "7401555913", [0, 35000] => "7401555913",
211
+ [0, 35100] => "7401555913", [0, 44000] => "7401555872", [0, 55020100] => "7401555872",
212
+ [1, 10024270] => "7401501266", [1, 10050002] => "7401502234", [1, 10132511] => "7401550530",
213
+ [1, 10149226] => "7401512248", [1, 19345106] => "7401555906" },
214
+ 60020030 => { [10, 617900] => "0002009906", [10, 919900] => "7871531505", [10, 2999900] => "0002588991",
215
+ [10, 3340500] => "0002001155", [10, 4184600] => "7871513509", [10, 40748400] => "0001366705",
216
+ [10, 47444300] => "7871538395", [10, 54290000] => "7871521216" },
217
+ 60050000 => { [0, 1523] => "0001364934", [0, 2502] => "0001366705", [0, 2535] => "0001119897",
218
+ [0, 2811] => "0001367450", [0, 3002] => "0001367924", [0, 3009] => "0001367924",
219
+ [0, 3080] => "0002009906", [0, 4596] => "0001372809", [0, 5500] => "0001375703",
220
+ [0, 123456] => "0001362826", [0, 250412] => "7402051588", [0, 1029204] => "0002782254" },
221
+ 66020020 => { [40, 604100] => "0002810030", [40, 2015800] => "7495530102", [40, 2401000] => "7495500967",
222
+ [40, 3746700] => "7495501485" },
223
+ 66050000 => { [0, 85304] => "7402045439", [0, 85990] => "7402051588", [0, 86345] => "7402046641",
224
+ [0, 86567] => "0001364934" },
225
+ 86050000 => { [0, 1016] => "7461500128", [0, 2020] => "7461500018", [0, 3535] => "7461505611",
226
+ [0, 4394] => "7461505714" }
227
+ }.freeze
228
+
229
+ # Applies IBAN rule `regel_version` (rule * 100 + version, as stored in
230
+ # the Bundesbank file) to blz (mutable String, 8 digits) and kto (mutable
231
+ # String, 10 digits, zero padded). Both may be modified in place.
232
+ # Returns [ret, bic]: ret is a return code (OK, OK_BLZ_REPLACED,
233
+ # OK_KTO_REPLACED, OK_BLZ_KTO_REPLACED, NO_IBAN_CALCULATION,
234
+ # IBAN_RULE_UNKNOWN, ...), bic a prescribed BIC or nil.
235
+ def iban_regel_cvt(blz, kto, regel_version, retvals = nil)
236
+ return [LUT2_NOT_INITIALIZED, nil] unless @data
237
+ return [INVALID_BLZ, nil] unless blz =~ /\A\d{8}\z/
238
+ return [INVALID_KTO, nil] unless kto =~ /\A\d{1,10}\z/
239
+
240
+ ret = iban_init
241
+ return [ret, nil] if ret < OK
242
+
243
+ regel = regel_version / 100
244
+ version = regel_version % 100
245
+ bic = nil
246
+ ret = OK
247
+
248
+ # Konto und BLZ nach Integer umwandeln
249
+ k1 = kto[0, 2].to_i
250
+ k2 = kto[2, 8].to_i
251
+ b_alt = b = blz.to_i
252
+
253
+ # Löschkennzeichen der BLZ überprüfen, u.U. Nachfolge-BLZ einsetzen
254
+ if lut_aenderung_i(b) == "D"
255
+ b = lut_nachfolge_blz_i(b)
256
+ return [BLZ_MARKED_AS_DELETED, bic] if b == 0
257
+ end
258
+
259
+ # Makros RETURN_OK und RETURN_OK_KTO_REPLACED (Löschkennzeichen und
260
+ # Nachfolge-BLZ werden für den Rückgabewert beachtet)
261
+ r_ok = -> { [b != b_alt ? OK_BLZ_REPLACED : OK, bic] }
262
+ r_ok_kto = -> { [b != b_alt ? OK_BLZ_KTO_REPLACED : OK_KTO_REPLACED, bic] }
263
+
264
+ case regel
265
+
266
+ # IBAN-Regel 0000.00 Standardregel zur IBAN-Berechnung
267
+ when 0
268
+ return [ret, bic] if ret == OK_UNTERKONTO_ATTACHED
269
+ return r_ok.call
270
+
271
+ # IBAN-Regel 0001.00 Standardregel: keine Berechnung
272
+ when 1
273
+ return [NO_IBAN_CALCULATION, bic]
274
+
275
+ # IBAN-Regel 0002.00 Augsburger Aktienbank
276
+ when 2
277
+ return [NO_IBAN_CALCULATION, bic] if (kto[7] == "8" && kto[8] == "6") || kto[7] == "6"
278
+ return r_ok.call
279
+
280
+ # IBAN-Regel 0003.00 Aareal Bank AG
281
+ when 3
282
+ return [NO_IBAN_CALCULATION, bic] if kto == "6161604670"
283
+ return r_ok.call
284
+
285
+ # IBAN-Regel 0004.00 Landesbank Berlin / Berliner Sparkasse
286
+ when 4
287
+ if k1 == 0
288
+ neu = case k2
289
+ when 135 then "0990021440"
290
+ when 1111 then "6600012020"
291
+ when 1900 then "0920019005"
292
+ when 7878 then "0780008006"
293
+ when 8888 then "0250030942"
294
+ when 9595 then "1653524703"
295
+ when 97097 then "0013044150"
296
+ when 112233 then "0630025819"
297
+ when 336666 then "6604058903"
298
+ when 484848 then "0920018963"
299
+ end
300
+ if neu
301
+ kto.replace(neu)
302
+ return r_ok_kto.call
303
+ end
304
+ end
305
+ return r_ok.call
306
+
307
+ # IBAN-Regel 0005.03 Commerzbank AG
308
+ when 5
309
+ idx = lut_index(blz)
310
+ return [idx, bic] if idx < 0
311
+ pz_methode = @data.pz[idx]
312
+
313
+ # comdirect bank behält ihren BIC, alle anderen BLZs der Commerzbank
314
+ # bekommen COBADEFFXXX
315
+ bic = "COBADEFFXXX" if blz[3] == "4" && blz[4] != "1"
316
+
317
+ # BLZs ohne Prüfzifferberechnung
318
+ return [OK_NO_CHK, bic] if pz_methode == 9
319
+
320
+ # Kontenkreis ohne IBAN-Berechnung (für etliche BLZs)
321
+ if k1 == 9 && k2 >= 98_000_000 && k2 <= 99_499_999
322
+ return [NO_IBAN_CALCULATION, bic] if IBAN_R5_NO_IBAN_BLZ.include?(b)
323
+ return [NO_IBAN_CALCULATION, bic] if version == 0 && IBAN_R5_NO_IBAN_BLZ_V0.include?(b)
324
+ end
325
+
326
+ # BLZs ohne IBAN-Berechnung (etliche ab Version 1 der Regel freigegeben)
327
+ return [NO_IBAN_CALCULATION, bic] if b == 50040033
328
+ return [NO_IBAN_CALCULATION, bic] if version == 0 && IBAN_R5_BLZ_V0.include?(b)
329
+
330
+ # Spendenkonten
331
+ if (tab = IBAN_R5_SPENDEN[b]) && (neu = tab[[k1, k2]])
332
+ kto.replace(neu)
333
+ return r_ok_kto.call
334
+ end
335
+
336
+ # Prüfziffermethode 13: fehlendes Unterkonto "00" ergänzen, falls die
337
+ # Kontonummer nur 6- oder 7-stellig ist
338
+ if pz_methode == 13 && kto[0] == "0" && kto[1] == "0" && kto[2] == "0" &&
339
+ (kto[3] != "0" || kto[4] != "0")
340
+ kto.replace(kto[0] + kto[3, 7] + "00")
341
+ return [kto_check_pz("13a", kto, nil) > 0 ? OK_UNTERKONTO_ATTACHED : FALSE_UNTERKONTO_ATTACHED, bic]
342
+ end
343
+
344
+ # Ausnahme in Prüfziffermethode 76 (Prüfziffer auf Stelle 10)
345
+ if pz_methode == 76
346
+ ret = kto_check_pz("76a", kto, nil)
347
+ if ret < OK && kto[0] == "0" && kto[1] == "0" && kto_check_pz("76b", kto, nil) > 0
348
+ kto.replace(kto[2, 8] + "00")
349
+ return [OK_UNTERKONTO_ATTACHED, bic]
350
+ end
351
+ return [ret, bic]
352
+ end
353
+
354
+ return r_ok.call
355
+
356
+ # IBAN-Regel 0006.00 Stadtsparkasse München
357
+ when 6
358
+ if k1 == 0
359
+ neu = case k2
360
+ when 1111111 then "0020228888"
361
+ when 7777777 then "0903286003"
362
+ when 34343434 then "1000506517"
363
+ when 70000 then "0018180018"
364
+ end
365
+ if neu
366
+ kto.replace(neu)
367
+ return r_ok_kto.call
368
+ end
369
+ end
370
+ return r_ok.call
371
+
372
+ # IBAN-Regel 0007.00 Sparkasse Köln-Bonn
373
+ when 7
374
+ if k1 == 2
375
+ if k2 == 820082
376
+ kto.replace("1901783868")
377
+ return r_ok_kto.call
378
+ end
379
+ if k2 == 22220022
380
+ kto.replace("0002222222")
381
+ return r_ok_kto.call
382
+ end
383
+ end
384
+ if k1 == 0
385
+ neu = case k2
386
+ when 111 then "0000001115"
387
+ when 221 then "0023002157"
388
+ when 1888 then "0018882068"
389
+ when 2006 then "1900668508"
390
+ when 2626 then "1900730100"
391
+ when 3004 then "1900637016"
392
+ when 3636 then "0023002447"
393
+ when 4000 then "0000004028"
394
+ when 4444 then "0000017368"
395
+ when 5050 then "0000073999"
396
+ when 8888 then "1901335750"
397
+ when 30000 then "0009992959"
398
+ when 43430 then "1901693331"
399
+ when 46664 then "1900399856"
400
+ when 55555 then "0034407379"
401
+ when 102030 then "1900480466"
402
+ when 151515 then "0057762957"
403
+ when 222222 then "0002222222"
404
+ when 300000 then "0009992959"
405
+ when 333333 then "0000033217"
406
+ when 414141 then "0000092817"
407
+ when 606060 then "0000091025"
408
+ when 909090 then "0000090944"
409
+ when 2602024 then "0005602024"
410
+ when 3000000 then "0009992959"
411
+ when 7777777 then "0002222222"
412
+ when 8090100 then "0000038901"
413
+ when 14141414 then "0043597665"
414
+ when 15000023 then "0015002223"
415
+ when 15151515 then "0057762957"
416
+ when 22222222 then "0002222222"
417
+ end
418
+ if neu
419
+ kto.replace(neu)
420
+ return r_ok_kto.call
421
+ end
422
+ end
423
+ return r_ok.call
424
+
425
+ # IBAN-Regel 0008.00 BHF-Bank AG
426
+ when 8
427
+ return [OK, bic] if b == 50020200
428
+ blz.replace("50020200")
429
+ bic = "BHFBDEFF500"
430
+ return [OK_BLZ_REPLACED, bic]
431
+
432
+ # IBAN-Regel 0009.00 Sparkasse Schopfheim-Zell
433
+ when 9
434
+ return [OK, bic] if b == 68351557
435
+ blz.replace("68351557")
436
+ bic = "SOLADES1SFH"
437
+ # Konten der ehemaligen Sparkasse Zell im Wiesental, die mit 1116
438
+ # beginnen: die ersten vier Stellen werden durch 3047 ersetzt
439
+ if b == 68351976 && kto[0, 4] == "1116"
440
+ kto[0, 4] = "3047"
441
+ return [OK_BLZ_KTO_REPLACED, bic]
442
+ end
443
+ return [OK_BLZ_REPLACED, bic]
444
+
445
+ # IBAN-Regel 0010.01 Frankfurter Sparkasse
446
+ when 10
447
+ if b == 50050222
448
+ blz.replace("50050201")
449
+ ret = OK_BLZ_REPLACED
450
+ b = 50050201
451
+ else
452
+ ret = OK
453
+ end
454
+ if b == 50050201 && k1 == 0
455
+ if k2 == 2000
456
+ kto.replace("0000222000")
457
+ return ret == OK_BLZ_REPLACED ? [OK_BLZ_KTO_REPLACED, bic] : r_ok_kto.call
458
+ end
459
+ if k2 == 800000
460
+ kto.replace("0000180802")
461
+ return ret == OK_BLZ_REPLACED ? [OK_BLZ_KTO_REPLACED, bic] : r_ok_kto.call
462
+ end
463
+ end
464
+ return [ret, bic]
465
+
466
+ # IBAN-Regel 0011.00 Sparkasse Krefeld
467
+ when 11
468
+ if k1 == 0
469
+ case k2
470
+ when 1000
471
+ kto.replace("0008010001")
472
+ return r_ok_kto.call
473
+ when 47800
474
+ kto.replace("0000047803")
475
+ return r_ok_kto.call
476
+ end
477
+ end
478
+ return r_ok.call
479
+
480
+ # IBAN-Regel 0012.01 Landesbank Hessen-Thüringen
481
+ when 12
482
+ return [OK, bic] if b == 50050000
483
+ blz.replace("50050000")
484
+ bic = "HELADEFFXXX"
485
+ return [OK_BLZ_REPLACED, bic]
486
+
487
+ # IBAN-Regel 0013.01 Landesbank Hessen-Thüringen
488
+ when 13
489
+ return [OK, bic] if b == 30050000
490
+ blz.replace("30050000")
491
+ bic = "WELADEDDXXX"
492
+ return [OK_BLZ_REPLACED, bic]
493
+
494
+ # IBAN-Regel 0014.00 Deutsche Apotheker- u. Ärztebank
495
+ when 14
496
+ return [OK, bic] if b == 30060601
497
+ blz.replace("30060601")
498
+ bic = "DAAEDEDDXXX"
499
+ return [OK_BLZ_REPLACED, bic]
500
+
501
+ # IBAN-Regel 0015.01 Pax-Bank eG
502
+ when 15
503
+ if k1 == 4 && k2 == 569017
504
+ kto.replace("4000569017")
505
+ return r_ok_kto.call
506
+ end
507
+ if k1 == 0
508
+ neu = case k2
509
+ when 94 then "3008888018"
510
+ when 556 then "0000101010"
511
+ when 888 then "0031870011"
512
+ when 4040 then "4003600101"
513
+ when 5826 then "1015826017"
514
+ when 25000 then "0025000110"
515
+ when 393393 then "0033013019"
516
+ when 444555 then "0032230016"
517
+ when 603060 then "6002919018"
518
+ when 2120041 then "0002130041"
519
+ when 80868086 then "4007375013"
520
+ end
521
+ if neu
522
+ kto.replace(neu)
523
+ return r_ok_kto.call
524
+ end
525
+ end
526
+ return r_ok.call
527
+
528
+ # IBAN-Regel 0016.00 Kölner Bank eG
529
+ when 16
530
+ if k1 == 0 && k2 == 300000
531
+ kto.replace("0018128012")
532
+ return r_ok_kto.call
533
+ end
534
+ return r_ok.call
535
+
536
+ # IBAN-Regel 0017.00 Volksbank Bonn Rhein-Sieg
537
+ when 17
538
+ if k1 == 0
539
+ neu = case k2
540
+ when 100 then "2009090013"
541
+ when 111 then "2111111017"
542
+ when 240 then "2100240010"
543
+ when 4004 then "2204004016"
544
+ when 4444 then "2044444014"
545
+ when 6060 then "2016060014"
546
+ when 102030 then "1102030016"
547
+ when 333333 then "2033333016"
548
+ when 909090 then "2009090013"
549
+ when 50005000 then "5000500013"
550
+ end
551
+ if neu
552
+ kto.replace(neu)
553
+ return r_ok_kto.call
554
+ end
555
+ end
556
+ return r_ok.call
557
+
558
+ # IBAN-Regel 0018.00 Aachener Bank eG
559
+ when 18
560
+ if k1 == 54 && k2 == 35435430
561
+ kto.replace("0543543543")
562
+ return r_ok_kto.call
563
+ end
564
+ if k1 == 0
565
+ neu = case k2
566
+ when 556 then "0120440110"
567
+ when 2157 then "0121787016"
568
+ when 9800 then "0120800019"
569
+ when 202050 then "1221864014"
570
+ end
571
+ if neu
572
+ kto.replace(neu)
573
+ return r_ok_kto.call
574
+ end
575
+ end
576
+ return r_ok.call
577
+
578
+ # IBAN-Regel 0019.00 Bethmann Bank
579
+ when 19
580
+ return [OK, bic] if b == 50120383
581
+ blz.replace("50120383")
582
+ bic = "DELBDE33XXX"
583
+ return [OK_BLZ_REPLACED, bic]
584
+
585
+ # IBAN-Regel 0020.02 Deutsche Bank AG
586
+ when 20
587
+ # BLZ ohne IBAN-Berechnung
588
+ return [NO_IBAN_CALCULATION, bic] if b == 10020000
589
+
590
+ # Spendenkontonummer
591
+ if b == 50070010 && k1 == 0 && k2 == 9999
592
+ kto.replace("0092777202")
593
+ return r_ok_kto.call
594
+ end
595
+
596
+ idx = lut_index(blz)
597
+ return [idx, bic] if idx < 0
598
+ pz_methode = @data.pz[idx]
599
+
600
+ # Prüfzifferverfahren 09 (Deutsche Bank GF intern)
601
+ return [OK_NO_CHK, bic] if pz_methode == 9
602
+
603
+ # Sonderfall Norisbank: Konten, bei denen ausschließlich das
604
+ # Prüfzifferverfahren 06 eine gültige Prüfziffer liefert, sind für die
605
+ # IBAN-Berechnung nicht zugelassen
606
+ if pz_methode == 127 && kto_check_pz("c7a", kto, nil) < OK && kto_check_pz("c7c", kto, nil) < OK
607
+ if retvals
608
+ retvals.methode = "c7b"
609
+ retvals.pz_methode = 2127
610
+ end
611
+ ret = kto_check_pz("c7b", kto, nil)
612
+ return [ret == OK ? NO_IBAN_CALCULATION : ret, bic]
613
+ end
614
+
615
+ # 10-stellige Konten sind ungültig
616
+ return [INVALID_KTO, bic] if kto[0] != "0"
617
+
618
+ # jetzt kommt nur noch das Prüfzifferverfahren 63 (Deutsche Bank)
619
+ if retvals
620
+ retvals.methode = "63"
621
+ retvals.pz_methode = 63
622
+ end
623
+
624
+ if k1 == 0
625
+ # 1-4 stellige Konten sind generell nicht zugelassen
626
+ return [NO_IBAN_CALCULATION, bic] if k2 < 10000
627
+
628
+ # 5- und 6-stellige Konten: rechts zwei Nullen anfügen
629
+ if k2 < 1000000
630
+ tmp = kto_check_pz("63a", kto, nil)
631
+ kto.replace(kto[2, 8] + "00")
632
+ ret = kto_check_pz("63a", kto, nil)
633
+ return [OK_UNTERKONTO_ATTACHED, bic] if ret == OK
634
+ if retvals
635
+ retvals.methode = "63b"
636
+ retvals.pz_methode = 2063
637
+ end
638
+ return [tmp == OK ? NO_IBAN_CALCULATION : ret, bic]
639
+ end
640
+
641
+ # 7-stellige Konten: zuerst Unterkonto 00 anhängen, sonst mit 63a
642
+ if k2 >= 1000000 && k2 < 10000000
643
+ if kto_check_pz("63b", kto, nil) == OK
644
+ kto.replace(kto[2, 8] + "00")
645
+ return [OK_UNTERKONTO_ATTACHED, bic]
646
+ end
647
+ return [kto_check_pz("63a", kto, nil), bic]
648
+ end
649
+ end
650
+
651
+ # alle restlichen Konten (8- bis 9-stellig) nur mit Methode 63a prüfen
652
+ return [kto_check_pz("63a", kto, nil), bic]
653
+
654
+ # IBAN-Regel 0021.01 National-Bank AG
655
+ when 21
656
+ # 1-5 stellige oder 8 stellige Konten sind ungültig
657
+ return [INVALID_KTO, bic] if k1 == 0 && (k2 < 100000 || k2 > 9999999)
658
+ return [OK, bic] if b == 36020030
659
+ blz.replace("36020030")
660
+ bic = "NBAGDE3EXXX"
661
+ return [OK_BLZ_REPLACED, bic]
662
+
663
+ # IBAN-Regel 0022.00 GLS Gemeinschaftsbank eG
664
+ when 22
665
+ if k1 == 0 && k2 == 1111111
666
+ kto.replace("2222200000")
667
+ return r_ok_kto.call
668
+ end
669
+ return r_ok.call
670
+
671
+ # IBAN-Regel 0023.00 Volksbank Osnabrück eG
672
+ when 23
673
+ if k1 == 0 && k2 == 700
674
+ kto.replace("1000700800")
675
+ return r_ok_kto.call
676
+ end
677
+ return r_ok.call
678
+
679
+ # IBAN-Regel 0024.00 Bank im Bistum Essen eG
680
+ # (die Ersatzkontonummern sind hier nur achtstellig, wie im C-Code)
681
+ when 24
682
+ if k1 == 0
683
+ neu = case k2
684
+ when 94 then "00001694"
685
+ when 248 then "00017248"
686
+ when 345 then "00017345"
687
+ when 400 then "00014400"
688
+ end
689
+ if neu
690
+ kto.replace(neu)
691
+ return r_ok_kto.call
692
+ end
693
+ end
694
+ return r_ok.call
695
+
696
+ # IBAN-Regel 0025.00 Landesbank Baden-Württemberg / BW-Bank
697
+ when 25
698
+ return [OK, bic] if b == 60050101
699
+ blz.replace("60050101")
700
+ bic = "SOLADEST600"
701
+ return [OK_BLZ_REPLACED, bic]
702
+
703
+ # IBAN-Regel 0026.00 Bank für Kirche und Diakonie eG
704
+ when 26
705
+ return [OK_IBAN_WITHOUT_KC_TEST, bic] if k1 == 0 && (k2 == 55111 || k2 == 8090100)
706
+ return r_ok.call
707
+
708
+ # IBAN-Regel 0027.00 Volksbank Krefeld eG
709
+ when 27
710
+ return [OK_IBAN_WITHOUT_KC_TEST, bic] if k1 == 0 && (k2 == 3333 || k2 == 4444)
711
+ return r_ok.call
712
+
713
+ # IBAN-Regel 0028.00 Sparkasse Hannover
714
+ when 28
715
+ return [OK, bic] if b == 25050180
716
+ blz.replace("25050180")
717
+ bic = "SPKHDE2HXXX"
718
+ return [OK_BLZ_REPLACED, bic]
719
+
720
+ # IBAN-Regel 0029.00 Société Générale
721
+ when 29
722
+ # 10-stellige Kontonummern mit einer "0" an Position 4: die 4. Ziffer
723
+ # wird entfernt
724
+ if kto[0] != "0" && kto[3] == "0"
725
+ kto.replace("0" + kto[0, 3] + kto[4, 6])
726
+ return r_ok_kto.call
727
+ end
728
+ return r_ok.call
729
+
730
+ # IBAN-Regel 0030.00 Pommersche Volksbank eG (ab September 2018 entfallen)
731
+ when 30
732
+ return [OK, bic]
733
+
734
+ # IBAN-Regeln 0031.01 .. 0035.01 UniCredit Bank AG (ex HypoVereinsbank)
735
+ when 31, 32, 33, 34, 35
736
+ loesch, ret = lut_loeschung(blz, 0)
737
+ loesch = loesch == 1 ? 1 : 0
738
+ return [ret, bic] if ret < OK
739
+
740
+ # Spendenkonten nicht testen
741
+ spende = (regel == 33 && k1 == 0 &&
742
+ (k2 == 22222 || k2 == 1111111 || k2 == 94 || k2 == 7777777 || k2 == 55555)) ||
743
+ (regel == 34 && ((k1 == 0 && k2 == 502) || (k1 == 5 && k2 == 500500))) ||
744
+ (regel == 35 && k1 == 0 && k2 == 9696)
745
+ unless spende
746
+ ret = kto_check_blz(blz, kto)
747
+ return [ret, bic] if ret < OK
748
+ end
749
+
750
+ case regel
751
+ when 31
752
+ if loesch == 0
753
+ # Testfall D bei IBAN-Regel 31: weiter wie Regel 32
754
+ return [NO_IBAN_CALCULATION, bic] if k1 == 8
755
+ else
756
+ # 31: nur 10-stellige Konten
757
+ return [NO_IBAN_CALCULATION, bic] if kto[0] == "0"
758
+ end
759
+
760
+ when 32
761
+ return [IBAN_INVALID_RULE, bic] if loesch != 0
762
+ return [NO_IBAN_CALCULATION, bic] if k1 == 8
763
+
764
+ when 33
765
+ return [IBAN_INVALID_RULE, bic] if b != 70020270
766
+ if k1 == 0
767
+ neu = case k2
768
+ when 22222 then "5803435253"
769
+ when 1111111 then "0039908140"
770
+ when 94 then "0002711931"
771
+ when 7777777 then "5800522694"
772
+ when 55555 then "5801800000"
773
+ end
774
+ if neu
775
+ kto.replace(neu)
776
+ return r_ok_kto.call
777
+ end
778
+ end
779
+
780
+ when 34
781
+ return [IBAN_INVALID_RULE, bic] if b != 60020290
782
+ return [NO_IBAN_CALCULATION, bic] if k1 == 8
783
+ if k1 == 5 && k2 == 500500
784
+ kto.replace("4340111112")
785
+ return r_ok_kto.call
786
+ end
787
+ if k1 == 0 && k2 == 502
788
+ kto.replace("4340118001")
789
+ return r_ok_kto.call
790
+ end
791
+
792
+ when 35
793
+ return [IBAN_INVALID_RULE, bic] if b != 79020076
794
+ return [NO_IBAN_CALCULATION, bic] if k1 == 8
795
+ if k1 == 0 && k2 == 9696
796
+ kto.replace("1490196966")
797
+ return r_ok_kto.call
798
+ end
799
+ end
800
+
801
+ # Für 10-stellige Kontonummern die Nachfolge-BLZ aus dem Kontokreis
802
+ # bestimmen ("Tabelle zu Kontokreise exHypo"); gilt für die Regeln 31-35
803
+ if kto[0] != "0"
804
+ k3 = kto[0, 3].to_i
805
+ blz_neu = IBAN_R31_KONTOKREIS[k3]
806
+ # kein Kontenkreis definiert, dürfte ein ungültiges Konto sein
807
+ return [INVALID_KTO, bic] unless blz_neu
808
+ blz.replace(blz_neu)
809
+ b_neu = blz.to_i
810
+ ret = b == b_neu ? OK : OK_BLZ_REPLACED
811
+ else
812
+ ret = OK
813
+ end
814
+
815
+ # BIC aus der Nachfolge-BLZ bestimmen (die ist hier eingesetzt)
816
+ bic = lut_bic_int(blz, 0)[0]
817
+ return [ret, bic]
818
+
819
+ # IBAN-Regel 0036.00 HSH Nordbank AG
820
+ when 36
821
+ # Variante 3: Kontonummernkreise ohne IBAN-Ermittlung
822
+ if (k1 == 0 && (k2 <= 99999 || (k2 >= 900000 && k2 <= 29999999) || k2 >= 60000000)) ||
823
+ k1 == 9 || (k1 >= 20 && k1 <= 29) || (k1 >= 71 && k1 <= 84) || (k1 >= 86 && k1 <= 89)
824
+ return [NO_IBAN_CALCULATION, bic]
825
+ end
826
+
827
+ blz.replace("21050000")
828
+
829
+ # Variante 1: 6-stellige Kontonummern, 5. Stelle 1-8: rechtsbündig mit
830
+ # 3 Nullen aufgefüllt
831
+ if kto[0] == "0" && kto[1] == "0" && kto[2] == "0" && kto[3] == "0" && kto[4] != "0"
832
+ kto.replace("0" + kto[4, 6] + "000")
833
+ ret = kto_check_blz(blz, kto)
834
+ return [ret, bic] if ret < OK
835
+ return b == 21050000 ? r_ok_kto.call : [OK_BLZ_KTO_REPLACED, bic]
836
+ end
837
+
838
+ # Variante 2: alle übrigen Kontonummern (Standard, linksbündig)
839
+ ret = kto_check_blz(blz, kto)
840
+ return [ret, bic] if ret < OK
841
+ return [b == 21050000 ? OK : OK_BLZ_REPLACED, bic]
842
+
843
+ # IBAN-Regel 0037.00 The Bank of Tokyo-Mitsubishi UFJ, Ltd.
844
+ when 37
845
+ return [OK, bic] if b == 30010700
846
+ blz.replace("30010700")
847
+ bic = "BOTKDEDXXXX"
848
+ return [OK_BLZ_REPLACED, bic]
849
+
850
+ # IBAN-Regel 0038.00 Ostfriesische Volksbank eG
851
+ when 38
852
+ return [OK, bic] if b == 28590075
853
+ case b
854
+ when 26691213, 28591579, 25090300
855
+ blz.replace("28590075")
856
+ bic = "GENODEF1LER"
857
+ return [OK_BLZ_REPLACED, bic]
858
+ end
859
+ return r_ok.call
860
+
861
+ # IBAN-Regel 0039.00 Oldenburgische Landesbank AG
862
+ when 39
863
+ return [OK, bic] if b == 28020050
864
+ blz.replace("28020050")
865
+ bic = "OLBODEH2XXX"
866
+ return [OK_BLZ_REPLACED, bic]
867
+
868
+ # IBAN-Regel 0040.01 Sparkasse Staufen-Breisach
869
+ when 40
870
+ return [OK, bic] if b == 68052328
871
+ blz.replace("68052328")
872
+ bic = "SOLADES1STF"
873
+ return [OK_BLZ_REPLACED, bic]
874
+
875
+ # IBAN-Regel 0041.00 Bausparkasse Schwäbisch Hall AG
876
+ when 41
877
+ if b == 62220000
878
+ blz.replace("50060400")
879
+ kto.replace("0000011404")
880
+ bic = "GENODEFFXXX"
881
+ return [OK_BLZ_KTO_REPLACED, bic]
882
+ end
883
+ return r_ok.call
884
+
885
+ # IBAN-Regel 0042.01 Deutsche Bundesbank
886
+ when 42
887
+ # ab Dezember 2016 sind auch 10-stellige Konten nnn4400001..nnn4499999 zulässig
888
+ if k1 >= 10
889
+ if kto[3] == "4" && kto[4] == "4" &&
890
+ (kto[5] != "0" || kto[6] != "0" || kto[7] != "0" || kto[8] != "0" || kto[9] != "0")
891
+ return [OK, bic]
892
+ end
893
+ return [NO_IBAN_CALCULATION, bic]
894
+ end
895
+
896
+ # ansonsten sind nur noch 8-stellige Konten freigegeben
897
+ return [NO_IBAN_CALCULATION, bic] if k1 != 0 || k2 < 10000000
898
+
899
+ # Konten ohne IBAN-Berechnung: nnn 0 0000 bis nnn 0 0999
900
+ return [NO_IBAN_CALCULATION, bic] if kto[5] == "0" && kto[6] == "0"
901
+
902
+ # die Kontonummer muss an der 4. Stelle (der 8-stelligen Nummer) '0' sein
903
+ return [OK, bic] if kto[5] == "0"
904
+
905
+ # außerdem freigegeben: 50462000..50463999 sowie 50469000..50469999
906
+ if k1 == 0 && ((k2 >= 50462000 && k2 <= 50463999) || (k2 >= 50469000 && k2 <= 50469999))
907
+ return [OK, bic]
908
+ end
909
+ return [NO_IBAN_CALCULATION, bic]
910
+
911
+ # IBAN-Regel 0043.01 Sparkasse Pforzheim Calw
912
+ when 43
913
+ if b == 60651070
914
+ blz.replace("66650085")
915
+ bic = "PZHSDE66XXX"
916
+ return [OK_BLZ_REPLACED, bic]
917
+ end
918
+ return r_ok.call
919
+
920
+ # IBAN-Regel 0044.00 Sparkasse Freiburg
921
+ when 44
922
+ if k1 == 0 && k2 == 202
923
+ kto.replace("0002282022")
924
+ return r_ok_kto.call
925
+ end
926
+ return r_ok.call
927
+
928
+ # IBAN-Regel 0045.01 SEB AG (ab September 2017 entfallen)
929
+ when 45
930
+ return [OK, bic]
931
+
932
+ # IBAN-Regel 0046.00 Santander Consumer Bank
933
+ when 46
934
+ return [OK, bic] if b == 31010833
935
+ blz.replace("31010833")
936
+ bic = "CCBADE31XXX"
937
+ return [OK_BLZ_REPLACED, bic]
938
+
939
+ # IBAN-Regel 0047.00 Santander Consumer Bank
940
+ when 47
941
+ # achtstellige Kontonummern sind rechtsbündig mit Nullen aufzufüllen
942
+ if kto[0] == "0" && kto[1] == "0" && kto[2] != "0"
943
+ kto.replace(kto[2, 8] + "00")
944
+ return r_ok_kto.call
945
+ end
946
+ return r_ok.call
947
+
948
+ # IBAN-Regel 0048.00 VON ESSEN GmbH & Co. KG Bankgesellschaft
949
+ when 48
950
+ return [OK, bic] if b == 36010200
951
+ blz.replace("36010200")
952
+ bic = "VONEDE33XXX"
953
+ return [OK_BLZ_REPLACED, bic]
954
+
955
+ # IBAN-Regel 0049.01 DZ Bank
956
+ when 49
957
+ # Kontonummern mit einer '9' an der 5. Stelle: die ersten 4 Stellen
958
+ # werden ans Ende gestellt; diese Kontonummer hat keine Prüfziffer
959
+ return r_ok.call if kto[4] != "9"
960
+ tmp_buffer = kto.dup
961
+ kto.replace(tmp_buffer[4, 6] + tmp_buffer[0, 4])
962
+ return [OK_KTO_REPLACED_NO_PZ, bic]
963
+
964
+ # IBAN-Regel 0050.00 Sparkasse LeerWittmund
965
+ when 50
966
+ if b == 28252760
967
+ blz.replace("28550000")
968
+ bic = "BRLADE21LER"
969
+ return [OK_BLZ_REPLACED, bic]
970
+ end
971
+ return r_ok.call
972
+
973
+ # IBAN-Regel 0051.00 Landesbank Baden-Württemberg / BW-Bank
974
+ when 51
975
+ if k1 == 0
976
+ case k2
977
+ when 333
978
+ kto.replace("7832500881")
979
+ return r_ok_kto.call
980
+ when 502
981
+ kto.replace("0001108884")
982
+ return r_ok_kto.call
983
+ end
984
+ end
985
+ if k1 == 5
986
+ case k2
987
+ when 500500
988
+ kto.replace("0005005000")
989
+ return r_ok_kto.call
990
+ when 2502502
991
+ kto.replace("0001108884")
992
+ return r_ok_kto.call
993
+ end
994
+ end
995
+ return r_ok.call
996
+
997
+ # IBAN-Regel 0052.00 Landesbank Baden-Württemberg / BW-Bank
998
+ when 52
999
+ neu = if b == 67220020 && k1 == 53 && k2 == 8810004 then "0002662604"
1000
+ elsif b == 67220020 && k1 == 53 && k2 == 8810000 then "0002659600"
1001
+ elsif b == 67020020 && k1 == 52 && k2 == 3145700 then "7496510994"
1002
+ elsif b == 69421020 && k1 == 62 && k2 == 8908100 then "7481501341"
1003
+ elsif b == 66620020 && k1 == 48 && k2 == 40404000 then "7498502663"
1004
+ elsif b == 64120030 && k1 == 12 && k2 == 1200100 then "7477501214"
1005
+ elsif b == 64020030 && k1 == 14 && k2 == 8050100 then "7469534505"
1006
+ elsif b == 63020130 && k1 == 11 && k2 == 12156300 then "0004475655"
1007
+ elsif b == 62030050 && k1 == 70 && k2 == 2703200 then "7406501175"
1008
+ elsif b == 69220020 && k1 == 64 && k2 == 2145400 then "7485500252"
1009
+ end
1010
+ if neu
1011
+ blz.replace("60050101")
1012
+ kto.replace(neu)
1013
+ bic = "SOLADEST600"
1014
+ return [OK_BLZ_KTO_REPLACED, bic]
1015
+ end
1016
+ return [NO_IBAN_CALCULATION, bic]
1017
+
1018
+ # IBAN-Regel 0053.00 Landesbank Baden-Württemberg / BW-Bank
1019
+ when 53
1020
+ if (tab = IBAN_R53_SONDERKONTEN[b]) && (neu = tab[[k1, k2]])
1021
+ blz.replace("60050101")
1022
+ kto.replace(neu)
1023
+ bic = "SOLADEST600"
1024
+ return [OK_BLZ_KTO_REPLACED, bic]
1025
+ end
1026
+ return r_ok.call
1027
+
1028
+ # IBAN-Regel 0054.01 Evangelische Darlehnsgenossenschaft eG (ab Juni 2017 entfallen)
1029
+ when 54
1030
+ return [OK, bic]
1031
+
1032
+ # IBAN-Regel 0055.00 BHW Kreditservice GmbH
1033
+ when 55
1034
+ if b != 25410200
1035
+ blz.replace("25410200")
1036
+ bic = "BHWBDE2HXXX"
1037
+ return [OK_BLZ_REPLACED, bic]
1038
+ end
1039
+ return r_ok.call
1040
+
1041
+ # IBAN-Regel 0056.03 SEB AG (ab Dezember 2018 entfallen)
1042
+ when 56
1043
+ return r_ok.call
1044
+
1045
+ # IBAN-Regel 0057.00 Badenia Bausparkasse
1046
+ when 57
1047
+ if b != 66010200
1048
+ blz.replace("66010200")
1049
+ bic = "BBSPDE6KXXX"
1050
+ return [OK_BLZ_REPLACED, bic]
1051
+ end
1052
+ return r_ok.call
1053
+
1054
+ # Lumpensammler für unbekannte Regeln
1055
+ else
1056
+ return [IBAN_RULE_UNKNOWN, bic]
1057
+ end
1058
+ end
1059
+ end
1060
+ end