Packages

IBAN Account Generation

Current section

Files

Jump to
iban src iban.erl
Raw

src/iban.erl

-module(iban).
-compile(export_all).
-export([is_valid/1]).
-export([start/2, stop/1, init/1]).
stop(_) -> ok.
init([]) -> {ok, { {one_for_one, 5, 10}, []} }.
start(_, _) -> supervisor:start_link({local, ?MODULE}, ?MODULE, []).
main([]) ->
inets:start(),
inets:start(httpd, [{proplist_file, "priv/server_config.erl"}]),
io:format("Credit card validation server started.~n"),
user_drv:start(),
timer:sleep(infinity).
is_valid(Iban) -> I = spaceParser(Iban), ibanParser(I).
spaceParser(Iban) -> string:join(string:tokens(Iban," "),"").
ibanParser(Iban) ->
if Iban == [] -> false;
true ->
X = {string:substr(Iban, 1, 2)},
Y = {string:substr(Iban, 3, 2)},
Z = {string:substr(Iban, 5)},
checkIban(X, Y, Z)
end.
newIban(Country,BankNumber) ->
CountryCode = letterToNumber(Country, []),
BankNumberCode = letterToNumber(BankNumber, []),
string:join([Country,checksum(BankNumber,CountryCode),BankNumber]," ").
twosection(Sum) when Sum < 100 andalso Sum >= 0 -> lists:flatten(io_lib:format("~2..0B",[Sum])).
checksum(BankNumber,Country) ->
Check = string:join([BankNumber,Country],""),
Code = lists:foldl(fun(X,Acc) ->
Padding = twosection(X),
{IntNum, _} = string:to_integer(Check++Padding),
case IntNum rem 97 of 1 -> Padding; _ -> Acc end
end,"__",lists:seq(0,99)).
checkIban({X}, {Y}, {Z}) ->
NumX = letterToNumber(X, []),
NumZ = letterToNumber(Z, []),
LastNum = NumZ ++ NumX ++ Y,
{{IntNum, _}} = {string:to_integer(LastNum)},
D = IntNum rem 97,
if
D == 1 -> true;
true -> false
end.
letterToNumber(Letter, Res) ->
if Letter == []
-> Res;
true ->
H = hd(Letter),
if H > 58 ->
Num = integer_to_list( H - 55);
true -> Num = integer_to_list(H - 48)
end,
R = Res ++ Num,
letterToNumber(tl(Letter), R)
end.
-include_lib("eunit/include/eunit.hrl").
validate_test_() -> [
?_assertEqual(true,is_valid("BA39 1290 0794 0102 8494")),
?_assertEqual(true,is_valid("BA39 1290 0794 0102 8494")),
?_assertEqual(true,is_valid("BA391290079401028494")),
?_assertEqual(true,is_valid("GB29 NWBK 6016 1331 9268 19")),
?_assertEqual(true,is_valid("GE29 NB00 0000 0101 9049 17")),
?_assertEqual(true,is_valid("GI75 NWBK 0000 0000 7099 453")),
?_assertEqual(true,is_valid("GL89 6471 0001 0002 06")),
?_assertEqual(true,is_valid("GR16 0110 1250 0000 0001 2300 695")),
?_assertEqual(true,is_valid("HR12 1001 0051 8630 0016 0")),
?_assertEqual(true,is_valid("HU42 1177 3016 1111 1018 0000 0000")),
?_assertEqual(true,is_valid("IE29 AIBK 9311 5212 3456 78")),
?_assertEqual(true,is_valid("IL62 0108 0000 0009 9999 999")),
?_assertEqual(true,is_valid(" IS14 0159 2600 7654 5510 7303 39")),
?_assertEqual(true,is_valid("IT60 X054 2811 1010 0000 0123 456")),
?_assertEqual(true,is_valid("KW81 CBKU 0000 0000 0000 1234 5601 01")),
?_assertEqual(true,is_valid("KZ86 125K ZT50 0410 0100")),
?_assertEqual(true,is_valid("LB62 0999 0000 0001 0019 0122 9114")),
?_assertEqual(true,is_valid("LI21 0881 0000 2324 013A A")),
?_assertEqual(true,is_valid("LT12 1000 0111 0100 1000")),
?_assertEqual(true,is_valid("LV80 BANK 0000 4351 9500 1")),
?_assertEqual(true,is_valid("MC11 1273 9000 7000 1111 1000 H79")),
?_assertEqual(true,is_valid("ME25 5050 0001 2345 6789 51")),
?_assertEqual(true,is_valid("MT84 MALT 0110 0001 2345 MTLC AST0 01S")),
?_assertEqual(true,is_valid("MU17 BOMM 0101 1010 3030 0200 000M UR")),
?_assertEqual(true,is_valid("NL91 ABNA 0417 1643 00")),
?_assertEqual(true,is_valid("NO93 8601 1117 947")),
?_assertEqual(true,is_valid("PT50 0002 0123 1234 5678 9015 4")),
?_assertEqual(true,is_valid("RO49 AAAA 1B31 0075 9384 0000")),
?_assertEqual(true,is_valid("RS35 2600 0560 1001 6113 79")),
?_assertEqual(true,is_valid("SA03 8000 0000 6080 1016 7519")),
?_assertEqual(true,is_valid("SM86 U032 2509 8000 0000 0270 100")),
?_assertEqual(true,is_valid("TR33 0006 1005 1978 6457 8413 26")),
?_assertEqual(true,is_valid("BG80 BNBG 9661 1020 3456 78")),
?_assertEqual(true,is_valid(" FO62 6460 0001 6316 34")),
?_assertEqual(true,is_valid("DK50 0040 0440 1162 43")),
?_assertEqual(true,is_valid("CH93 0076 2011 6238 5295 7")),
?_assertEqual(true,is_valid("DE89 3704 0044 0532 0130 00")),
?_assertEqual(true,is_valid("AD12 0001 2030 2003 5910 0100")),
?_assertEqual(true,is_valid(" AL47 2121 1009 0000 0002 3569 8741")),
?_assertEqual(true,is_valid("AT61 1904 3002 3457 3201")),
?_assertEqual(false,is_valid("")),
?_assertEqual(false,is_valid("AT61 1904 4002 3457 3201")),
?_assertEqual(false,is_valid("CH93 0076 2012 6238 5295 7")),
?_assertEqual(false,is_valid("NL91 ABAB 0417 1634 00")),
?_assertEqual(false,is_valid("ME25 5050 0021 2345 6789 51")),
?_assertEqual(false,is_valid("LV80 BANK KK00 4351 9500 1")),
?_assertEqual(false,is_valid("KW81 CBKU A000 0000 0000 1234 5601 01")),
?_assertEqual(false,is_valid("KZ86 125K ZT13 0410 0100")),
?_assertEqual(false,is_valid("IS14 0159 2600 7654 6120 7303 49")),
?_assertEqual(false,is_valid("GR16 0110 12AA 0000 0001 2300 695")),
?_assertEqual(false,is_valid("NL91 ABNA BC17 1643 00")),
?_assertEqual(false,is_valid("BA39 1290 0794 0102 8493")),
?_assertEqual(false,is_valid("BA39 1290 0794 0102 849"))
].