Skip to content

Commit cc01e72

Browse files
author
Joni Saarinen
committed
Add module for validating general sepa numbers and another specific validator for IBAN numbers.
1 parent 2e2262c commit cc01e72

File tree

1 file changed

+191
-0
lines changed

1 file changed

+191
-0
lines changed

src/modules/sepa.js

Lines changed: 191 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,191 @@
1+
// jQuery Form Validator Module: SEPA
2+
// Author: PispalanIT, Joni Saarinen
3+
//
4+
// Code based on https://github.com/arhs/iban.js/blob/master/iban.js
5+
6+
(function($) {
7+
8+
'use strict';
9+
10+
11+
var ibanCountryList = [
12+
["AD", 24, "F04F04A12"],
13+
["AE", 23, "F03F16"],
14+
["AL", 28, "F08A16"],
15+
["AT", 20, "F05F11"],
16+
["AZ", 28, "U04A20"],
17+
["BA", 20, "F03F03F08F02"],
18+
["BE", 16, "F03F07F02"],
19+
["BG", 22, "U04F04F02A08"],
20+
["BH", 22, "U04A14"],
21+
["BR", 29, "F08F05F10U01A01"],
22+
["CH", 21, "F05A12"],
23+
["CR", 21, "F03F14"],
24+
["CY", 28, "F03F05A16"],
25+
["CZ", 24, "F04F06F10"],
26+
["DE", 22, "F08F10"],
27+
["DK", 18, "F04F09F01"],
28+
["DO", 28, "U04F20"],
29+
["EE", 20, "F02F02F11F01"],
30+
["ES", 24, "F04F04F01F01F10"],
31+
["FI", 18, "F06F07F01"],
32+
["FO", 18, "F04F09F01"],
33+
["FR", 27, "F05F05A11F02"],
34+
["GB", 22, "U04F06F08"],
35+
["GE", 22, "U02F16"],
36+
["GI", 23, "U04A15"],
37+
["GL", 18, "F04F09F01"],
38+
["GR", 27, "F03F04A16"],
39+
["GT", 28, "A04A20"],
40+
["HR", 21, "F07F10"],
41+
["HU", 28, "F03F04F01F15F01"],
42+
["IE", 22, "U04F06F08"],
43+
["IL", 23, "F03F03F13"],
44+
["IS", 26, "F04F02F06F10"],
45+
["IT", 27, "U01F05F05A12"],
46+
["KW", 30, "U04A22"],
47+
["KZ", 20, "F03A13"],
48+
["LB", 28, "F04A20"],
49+
["LC", 32, "U04F24"],
50+
["LI", 21, "F05A12"],
51+
["LT", 20, "F05F11"],
52+
["LU", 20, "F03A13"],
53+
["LV", 21, "U04A13"],
54+
["MC", 27, "F05F05A11F02"],
55+
["MD", 24, "U02A18"],
56+
["ME", 22, "F03F13F02"],
57+
["MK", 19, "F03A10F02"],
58+
["MR", 27, "F05F05F11F02"],
59+
["MT", 31, "U04F05A18"],
60+
["MU", 30, "U04F02F02F12F03U03"],
61+
["NL", 18, "U04F10"],
62+
["NO", 15, "F04F06F01"],
63+
["PK", 24, "U04A16"],
64+
["PL", 28, "F08F16"],
65+
["PS", 29, "U04A21"],
66+
["PT", 25, "F04F04F11F02"],
67+
["RO", 24, "U04A16"],
68+
["RS", 22, "F03F13F02"],
69+
["SA", 24, "F02A18"],
70+
["SE", 24, "F03F16F01"],
71+
["SI", 19, "F05F08F02"],
72+
["SK", 24, "F04F06F10"],
73+
["SM", 27, "U01F05F05A12"],
74+
["ST", 25, "F08F11F02"],
75+
["TL", 23, "F03F14F02"],
76+
["TN", 24, "F02F03F13F02"],
77+
["TR", 26, "F05F01A16"],
78+
["VG", 24, "U04F16"],
79+
["XK", 20, "F04F10F02"],
80+
["AO", 25, "F21"],
81+
["BF", 27, "F23"],
82+
["BI", 16, "F12"],
83+
["BJ", 28, "F24"],
84+
["CI", 28, "U01F23"],
85+
["CM", 27, "F23"],
86+
["CV", 25, "F21"],
87+
["DZ", 24, "F20"],
88+
["IR", 26, "F22"],
89+
["JO", 30, "A04F22"],
90+
["MG", 27, "F23"],
91+
["ML", 28, "U01F23"],
92+
["MZ", 25, "F21"],
93+
["QA", 29, "U04A21"],
94+
["SN", 28, "U01F23"],
95+
["UA", 29, "F25"]
96+
];
97+
98+
var generalValidatorFunction = function (sepa) {
99+
sepa = sepa.toUpperCase();
100+
sepa = sepa.replace(/\s+/g, '');
101+
sepa = sepa.substr(4) + sepa.substr(0,4);
102+
103+
sepa = sepa.split('').map(function(n){
104+
var code = n.charCodeAt(0);
105+
if (code >= 'A'.charCodeAt(0) && code <= 'Z'.charCodeAt(0)){
106+
//A = 10, B = 11, ... Z = 35
107+
return code - 'A'.charCodeAt(0) + 10;
108+
} else {
109+
return n;
110+
}
111+
}).join('');
112+
113+
var remainder = sepa;
114+
var block;
115+
116+
while (remainder.length > 2) {
117+
block = remainder.slice(0, 9);
118+
remainder = (parseInt(block, 10) % 97).toString()
119+
+ remainder.slice(block.length);
120+
}
121+
122+
console.log(parseInt(remainder, 10) % 97);
123+
124+
if (parseInt(remainder, 10) % 97 === 1){
125+
return true;
126+
} else {
127+
return false;
128+
}
129+
};
130+
var countryIBAN = function(sepa) {
131+
sepa = sepa.toUpperCase();
132+
sepa = sepa.replace(/\s+/g, '');
133+
134+
var country_code = sepa.slice(0,2);
135+
var i = 0;
136+
var structure = "";
137+
138+
for (i = 0; i < ibanCountryList.length; ++i){
139+
if (ibanCountryList[i][0] == country_code){
140+
structure = ibanCountryList[i][2];
141+
break;
142+
}
143+
}
144+
145+
if (structure == ""){
146+
return false;
147+
}
148+
149+
var regex = structure.match(/(.{3})/g).map(function(block){
150+
151+
// parse each structure block (1-char + 2-digits)
152+
var format;
153+
var pattern = block.slice(0, 1);
154+
var repeats = parseInt(block.slice(1), 10);
155+
156+
switch (pattern){
157+
case "A": format = "0-9A-Za-z"; break;
158+
case "B": format = "0-9A-Z"; break;
159+
case "C": format = "A-Za-z"; break;
160+
case "F": format = "0-9"; break;
161+
case "L": format = "a-z"; break;
162+
case "U": format = "A-Z"; break;
163+
case "W": format = "0-9a-z"; break;
164+
}
165+
166+
return '([' + format + ']{' + repeats + '})';
167+
});
168+
169+
var regextest = new RegExp('^' + regex.join('') + '$');
170+
171+
return sepa.length == ibanCountryList[i][1]
172+
&& regextest.test(sepa.slice(4));
173+
};
174+
175+
176+
$.formUtils.addValidator({
177+
name: 'sepageneral',
178+
validatorFunction: generalValidatorFunction,
179+
errorMessage: '',
180+
errorMessageKey:'badSepa'
181+
});
182+
$.formUtils.addValidator({
183+
name: 'sepaiban',
184+
185+
validatorFunction: function(sepa) {
186+
return countryIBAN(sepa) && generalValidatorFunction(sepa);
187+
},
188+
errorMessage: '',
189+
errorMessageKey:'badIpan'
190+
});
191+
})(jQuery);

0 commit comments

Comments
 (0)