Ověřování identifikačního čísla
užitečná funkcionalita, někde ovšem katastrofa
Wednesday, 9. June 2010
Je vhodné, pokud aplikace umí ověřit platnost různých identifikátorů, jako je například IČ (dříve IČO). Problém je, pokud ověřovací algoritmus funguje nesprávně.
Ověřování identifikačního čísla ekonomického subjektu (IČ nebo IČO) lze rozdělit do několika kroků . Můžeme si vše ukázat na příkladu IČ: 45535981
- první až sedmou číslici vynásobíme čísly 8, 7, 6, 5, 4, 3, 2 a součiny sečteme:
soucet = 4*8 + 5*7 + 5*6 + 3*5 + 5*4 + 9*3 + 8*2 = 175
- spočítáme zbytek po dělení jedenácti:
zbytek
= soucet % 11 - pro poslední osmou číslici c musí platit:
- je-li zbytek 0 nebo 10, pak c = 1
- je-li zbytek 1, pak
c
= 0 - v ostatních případech je c = 11 - zbytek
Výsledný algoritmus v jazyku @Formula může vypadat například takto:
-
ico:=ic;
-
@If(@Length(ico)=0;@Return(@Success);@Success);
-
@If((@Length(ico)>0&@Length(ico)!=8);@Return(@Failure("IČ je 8-místné číslo"));@Success);
-
@For(i:=0;
-
i<=7;
-
i:=i+1;
-
a:=a+ @Middle(ico;i;1) + ",");
-
-
a:=@LeftBack(a;1);
-
ico := @TextToNumber(@Explode(a;","));
-
-
a := 0;
-
@For(i:=1;
-
i<=7;
-
i:=i+1;
-
a := a + (ico[i]*(9-i)));
-
-
a := @Modulo(a;11);
-
result:=@If(a=0|a=10;ico[8]=1;a=1;ico[8]=0;ico[8]=11-a);
-
-
@If(result;@Success;@Failure("Nesprávné číslo"))
-
Ověřovat IČ můžeme ovšem také pomocí jazyka LotusScript či dalších:
-
Function IsIcValid ( IC As String) As Boolean
-
IsIcValid = False
-
If (Len(IC) <> 8 Or Isnumeric(IC) = False ) Then
-
IsIcValid = False
-
Exit Function
-
End If
-
soucet = 0
-
For i = 1 To 7
-
soucet = soucet + (Cint(Mid(IC,i,1))*(9-i))
-
Next
-
zbytek = soucet Mod 11
-
If (zbytek = 0 Or zbytek = 10) And Cint(Right(IC,1)) = 1 Then
-
IsIcValid = True
-
Exit Function
-
Elseif ((zbytek = 1) And Cint(Right(IC,1))=0) Then
-
IsIcValid = True
-
Exit Function
-
Elseif (Cint(Right(IC,1)) = 11-zbytek ) Then
-
IsIcValid = True
-
Exit Function
-
End If
-
End Function