2018-07-26

Kontrola rodného čísla (RČ) a identifikačního čísla (IČ)

Výcuc z http://latrine.dgx.cz/…-rodne-cislo .

Ověření rodného čísla

  1. spočti zbytek po dělení prvních devíti číslic a čísla 11
  2. je-li zbytek 10, musí být poslední číslice 0
  3. jinak poslední číslice musí být rovna zbytku

Tedy 780123/3540 je korektní rodné číslo, ačkoliv není dělitelné jedenácti.

Implementace v PHP:

function verifyRC($rc)
{
    // "be liberal in what you receive"
    if (!preg_match('#^\s*(\d\d)(\d\d)(\d\d)[ /]*(\d\d\d)(\d?)\s*$#', $rc, $matches)) {
        return FALSE;
    }

    list(, $year, $month, $day, $ext, $c) = $matches;

    // do roku 1954 přidělovaná devítimístná RČ nelze ověřit
    if ($c === '') {
        return $year < 54;
    }

    // kontrolní číslice
    $mod = ($year . $month . $day . $ext) % 11;
    if ($mod === 10) $mod = 0;
    if ($mod !== (int) $c) {
        return FALSE;
    }

    // kontrola data
    $year += $year < 54 ? 2000 : 1900;

    // k měsíci může být připočteno 20, 50 nebo 70
    if ($month > 70 && $year > 2003) $month -= 70;
    elseif ($month > 50) $month -= 50;
    elseif ($month > 20 && $year > 2003) $month -= 20;

    if (!checkdate($month, $day, $year)) {
        return FALSE;
    }

    // cislo je OK
    return TRUE;
}

Rodné číslo – JavaScript:

function testRC(x, age)
{
  if(!age) age = 0;
  try
  {
    if(x.length == 0) return true;
    if(x.length < 9) throw 1;
    var year = parseInt(x.substr(0, 2), 10);
    var month = parseInt(x.substr(2, 2), 10);
    var day = parseInt( x.substr(4, 2), 10);
    var ext = parseInt(x.substr(6, 3), 10);
    if((x.length == 9) && (year < 54)) return true;
    var c = 0;
    if(x.length == 10) c = parseInt(x.substr(9, 1));
    var m = parseInt( x.substr(0, 9)) % 11;
    if(m == 10) m = 0;
    if(m != c) throw 1;
    year += (year < 54) ? 2000 : 1900;
    if((month > 70) && (year > 2003)) month -= 70;
    else if (month > 50) month -= 50;
    else if ((month > 20) && (year > 2003)) month -= 20;
    var d = new Date();
    if((year + age) > d.getFullYear()) throw 1;
    if(month == 0) throw 1;
    if(month > 12) throw 1;
    if(day == 0) throw 1;
    if(day > 31) throw 1;
  }
  catch(e)
  {
    alert('Zadaný údaj není korektní!');
    return false;
  }
  return true;
}

Ověření IČ

Takže, jak se ověřuje IČ? Například 69663963

  1. první až sedmou číslici vynásobíme čísly 8, 7, 6, 5, 4, 3, 2 a součiny sečteme:

    soucet = 6*8 + 9*7 + 6*6 + 6*5 + 3*4 + 9*3 + 6*2 = 228

  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

Implementace v PHP:

function verifyIC($ic)
{
    // "be liberal in what you receive"
    $ic = preg_replace('#\s+#', '', $ic);

    // má požadovaný tvar?
    if (!preg_match('#^\d{8}$#', $ic)) {
        return FALSE;
    }

    // kontrolní součet
    $a = 0;
    for ($i = 0; $i < 7; $i++) {
        $a += $ic[$i] * (8 - $i);
    }

    $a = $a % 11;

    if ($a === 0) $c = 1;
    elseif ($a === 10) $c = 1;
    elseif ($a === 1) $c = 0;
    else $c = 11 - $a;

    return (int) $ic[7] === $c;
}

IČ – JavaScript:

function testICO(x)
{
  try
  {
    var a = 0;
    if(x.length == 0) return true;
    if(x.length != 8) throw 1;
    var b = x.split('');
    var c = 0;
    for(var i = 0; i < 7; i++) a += (parseInt(b[i]) * (8 - i));
    a = a % 11;
    c = 11 - a;
    if(a == 1) c = 0;
    if(a == 0) c = 1;
    if(a == 10) c = 1;
    if(parseInt(b[ 7]) != c) throw(1);
  }
  catch(e)
  {
    alert('Zadaný údaj není korektní!');
    return false;
  }
  return true;
}

DIČ – JavaScript:

function testDIC(x)
{
  try
  {
    if(x.length == 0) return true;
    var id = x.substr(0, 2).toUpperCase();
    x = x.substr(2);
    if((id == 'CZ') || (id == 'SK'))
    {
      if(x.length < 8) throw 1;
      if(x.length > 11) throw 1;
      if(x.length == 8)
      {
        return testICO(x);
      }
      else
      {
        return testRC(x, 18);
      }
      throw 1;
    }
    alert('Není možné zkontrolovat DIČ mimo Českou a Slovenskou republiku!');
    return true;
  }
  catch(e)
  {
    alert('Zadaný údaj není korektní!');
    return false;
  }
}

0