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 ( nebo IČO) lze rozdělit do několika kroků . Můžeme si vše ukázat na příkladu IČ: 45535981

  1. 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

  2. spočítáme zbytek po dělení jedenácti: zbytek = soucet % 11
  3. 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:

  1. ico:=ic;
  2. @If(@Length(ico)=0;@Return(@Success);@Success);
  3. @If((@Length(ico)>0&@Length(ico)!=8);@Return(@Failure("IČ je 8-místné číslo"));@Success);
  4. @For(i:=0;
  5. i<=7;
  6. i:=i+1;
  7. a:=a+ @Middle(ico;i;1) + ",");
  8.  
  9. a:=@LeftBack(a;1);
  10. ico := @TextToNumber(@Explode(a;","));
  11.  
  12. a := 0;
  13. @For(i:=1;
  14. i<=7;
  15. i:=i+1;
  16. a := a + (ico[i]*(9-i)));
  17.  
  18. a := @Modulo(a;11);
  19. result:=@If(a=0|a=10;ico[8]=1;a=1;ico[8]=0;ico[8]=11-a);
  20.  
  21. @If(result;@Success;@Failure("Nesprávné číslo"))
  22.  

Ověřovat IČ můžeme ovšem také pomocí jazyka LotusScript či dalších:

  1. Function IsIcValid ( IC As String) As Boolean
  2.  IsIcValid = False
  3.  If (Len(IC) <> 8 Or Isnumeric(IC) = False ) Then
  4.   IsIcValid = False
  5.   Exit Function
  6.  End If
  7.  soucet = 0
  8.  For i = 1 To 7
  9.   soucet = soucet + (Cint(Mid(IC,i,1))*(9-i))
  10.  Next
  11.  zbytek = soucet Mod 11
  12.  If (zbytek = 0 Or zbytek = 10) And Cint(Right(IC,1)) = 1 Then
  13.   IsIcValid = True
  14.   Exit Function
  15.  Elseif ((zbytek = 1) And Cint(Right(IC,1))=0) Then
  16.   IsIcValid = True
  17.   Exit Function
  18.  Elseif (Cint(Right(IC,1)) = 11-zbytek ) Then
  19.   IsIcValid = True
  20.   Exit Function
  21.  End If
  22. End Function

 


systém spravován pomocí webmaker.ooo.cz
©2006-2024 Tomáš Hanus | ixulot | ixodesign.cz | RSS