Ultramaratonist, Galantom, organizator de evenimente sportive

Validare CUI/CIF folosind php

15.47K 18

CIF – codul de identificare fiscala este un cod numeric constituind codul unic de identificare a unui comerciant.Acesta se mai numeste si cod fiscal sau cod unic de identificare. Pana la 1 ianuarie 2007 s-a numit Cod Unic de Inregistrare (CUI).

Conform legii nr. 359 din 8 septembrie 2004, privind simplificarea formalitatilor la inregistrarea in registrul comertului a persoanelor fizice, asociatiilor familiale si persoanelor juridice, inregistrarea fiscala a acestora, precum si la autorizarea functionarii persoanelor juridice:
Solicitarea inregistrarii fiscale a unui comerciant se face prin depunerea cererii de inregistrare la biroul unic din cadrul oficiului registrului comertului de pe langa tribunal, iar atribuirea codului unic de inregistrare de catre Ministerul Finantelor Publice este conditionata de admiterea cererii de inregistrare in registrul comertului de catre judecatorul-delegat.

* Pentru asociatiile familiale, precum si pentru persoanele juridice prevazute la art. 2 structura codului unic de inregistrare se stabileste de Ministerul Finantelor Publice, Ministerul Muncii, Solidaritatii Sociale si Familiei, Ministerul Sanatatii, Ministerul Administratiei si Internelor si Ministerul Justitiei.

* Pentru persoanele fizice codul unic de inregistrare coincide cu codul numeric personal atribuit de Ministerul Administratiei si Internelor sau, dupa caz, cu numarul de identificare fiscala atribuit de Ministerul Finantelor Publice.

Atributul fiscal atasat codului unic de inregistrare este un cod alfanumeric având semnificatia categoriei de platitor de taxe si impozite la bugetul de stat.Daca atributul fiscal are valoarea “RO”, acesta atesta ca persoana juridica a fost luata in evidenta organului fiscal ca platitor de T.V.A.

Un CIF este alcatuit astfel :
[ |ZZZZZZZZZ| ] |C|
|_________| |_|
: :
: –> Cifra ce control
:
–> Numarul de ordine (maxim 9 caractere)

Algoritmul de validare al unui cod CIF

Pas preliminar: Se testeaza daca codul respecta formatul unui cod CIF. Adica lungimea maxima sa fie de 10 cifre si sa contina doar caractere numerice.

Pas 1: Se foloseste cheia de testare “753217532”. Se inverseaza ordinea cifrelor codului CIF precum si a cheii de testare.

Pas 2: Se ignora prima cifra din codul CIF inversat (aceasta este cifra de control) si se inmulteste fiecare cifra cu cifra corespunzatoare din cheia de testare inversata.

Pas 3: Se aduna toate produsele obtinute. Suma rezultata se inmulteste cu 10 si produsul este impartit la 11. Cifra obtinuta, in urma operatiei MODULO 11 reprezita cifra de verificare. Daca in urma impartirii s-a obtinut restul 10 atunci cifra de verificare va fi 0.

Pas 4: Pentru un CIF valid cifra de verificare va trebui sa corespunda cu cifra de control a codului CIF initial.

(sursa www.validari.ro)

Validarea CIF folosind php

Acum pentru codul php:

[php]

function checkCIF($cif){
if (!is_numeric($cif)) return false;
if ( strlen($cif)>10 ) return false;

$cifra_control=substr($cif, -1);
$cif=substr($cif, 0, -1);
while (strlen($cif)!=9){
$cif=’0′.$cif;
}
$suma=$cif[0] * 7 + $cif[1] * 5 + $cif[2] * 3 + $cif[3] * 2 + $cif[4] * 1 + $cif[5] * 7 + $cif[6] * 5 + $cif[7] * 3 + $cif[8] * 2;
$suma=$suma*10;
$rest=fmod($suma, 11);
if ( $rest==10 ) $rest=0;

if ($rest==$cifra_control) return true;
else return false;
}
[/php]

18 Comments

  • vlad says:

    Codul tau e complicat inutil si foloseste solutii inoportune.

    function valideazacif($cif)
    {
    $key = str_split(strrev(‘753217532’));
    $cifarr = str_split(strrev($cif));
    for($i=1;$i < count($cifarr);$i++)
    $sum += $cifarr[$i]*$key[$i-1];
    $rest = ($sum * 10 % 11 == 10)? 0 : $sum * 10 % 11;
    return(($rest == $cifarr[0]) ? true : false);
    }

  • vlad says:

    Codul tau e complicat inutil si foloseste solutii inoportune.

    function valideazacif($cif)
    {
    $key = str_split(strrev(‘753217532’));
    $cifarr = str_split(strrev($cif));
    for($i=1;$i < count($cifarr);$i++)
    $sum += $cifarr[$i]*$key[$i-1];
    $rest = ($sum * 10 % 11 == 10)? 0 : $sum * 10 % 11;
    return(($rest == $cifarr[0]) ? true : false);
    }

  • gabi solomon says:

    codul ala a fost facut sa fie mai usor citibil, nu ca sa fie cel mai rapid sau cel mai scurt.
    Nu cred ca e cazul aici sa ne batem in cine scrie cel mai oportun cod.

    • Bogdan says:

      Interesant e ca functia ta valideaza CUI-ul 24837280 in timp ce functia isCui() a lui Adi nu. Desi in general functioneaza ok si a lui.

      • Uite-o aici… consider că mai optim de atât nu se putea 🙂

        function VerificaCUI($cui) { $cui = trim($cui); if(ctype_digit($cui) and strlen($cui) <= 10) { $key = '753217532'; $key_rev = strrev($key); $cui_m1 = substr($cui, 0, -1); $cui_rev = strrev($cui_m1); $cui_len = strlen($cui_rev); for ($i = 0; $i <= ($cui_len – 1); $i++) $produse += $cui_rev[$i] * $key_rev[$i]; $cifra_ver = ($produse*10)%11; if($cifra_ver == 10) $cifra_ver = 0; if($cifra_ver == $cui[$cui_len]) return true; else return false; } else return false; }

  • gabi solomon says:

    codul ala a fost facut sa fie mai usor citibil, nu ca sa fie cel mai rapid sau cel mai scurt.
    Nu cred ca e cazul aici sa ne batem in cine scrie cel mai oportun cod.

  • Alex says:

    Uite si varianta javascript a functiei tale:

    function validarecif(forma) {
    var CIF = forma.elements[‘cif’].value;

    function IsNumeric(sText)
    {
    var ValidChars = “0123456789”;
    var IsNumber=true;
    var Char;

    for (i = 0; i 10) { document.getElementById(‘rezultat’).innerHTML = ‘>10’; }
    NrCifre = CIF.length;
    CifraControl = CIF.substring(NrCifre-1,NrCifre);
    CIF = CIF.substring(0,NrCifre-1);
    while (CIF.length < 9) {
    CIF = '0'+CIF;
    }
    SUMA=CIF.charAt(0) * 7 + CIF.charAt(1) * 5 + CIF.charAt(2) * 3 + CIF.charAt(3) * 2 + CIF.charAt(4) * 1 + CIF.charAt(5) * 7 + CIF.charAt(6) * 5 + CIF.charAt(7) * 3 + CIF.charAt(8) * 2;
    SUMA=SUMA*10;
    REST = SUMA%11;
    if ( REST==10 ) $rest=0;
    if (REST == CifraControl) {document.getElementById('rezultat').innerHTML = 'DA'; }
    else {document.getElementById('rezultat').innerHTML = 'NU'; }
    //document.getElementById('rezultat').innerHTML = SUMA;
    //document.getElementById('rezultat').innerHTML = SUMA;

    }

    • Vlad says:

      //O versiune revizuita a functiei JavaScript a lui Alex.
      //Suporta si coduri CIF cu RO in fata
      function validareCIF(s) {

          if (parseInt(s)!=s) // CIF is of form ROxxxxxxxxx
          {
              if (s.substring(0,2).toUpperCase()!=’RO’ || s.length > 12)
                  return false;
              
              s = s.substring(2, s.length); //Extract only the numeric content
          }
          else // CIF is only numeric
          {
              if (s.length > 10)
                  return false;
          }
          
          cifraControl = s.charAt(s.length – 1);
          content = s.substring(0, s.length – 1);
          while (content.length < 9)
          {
              content = '0' + content;
          }
          suma = content.charAt(0) * 7 + content.charAt(1) * 5 + content.charAt(2)
                  * 3 + content.charAt(3) * 2 + content.charAt(4) * 1
                  + content.charAt(5) * 7 + content.charAt(6) * 5 + content.charAt(7)
                  * 3 + content.charAt(8) * 2;
          suma = suma * 10;
          rest = suma % 11;
          if (rest == 10)
              rest = 0;

          if (rest == cifraControl) {
              return true;
          }
          else
              return false;
      }

  • Alex says:

    Uite si varianta javascript a functiei tale:

    function validarecif(forma) {
    var CIF = forma.elements[‘cif’].value;

    function IsNumeric(sText)
    {
    var ValidChars = “0123456789”;
    var IsNumber=true;
    var Char;

    for (i = 0; i 10) { document.getElementById(‘rezultat’).innerHTML = ‘>10’; }
    NrCifre = CIF.length;
    CifraControl = CIF.substring(NrCifre-1,NrCifre);
    CIF = CIF.substring(0,NrCifre-1);
    while (CIF.length < 9) { CIF = '0'+CIF; } SUMA=CIF.charAt(0) * 7 + CIF.charAt(1) * 5 + CIF.charAt(2) * 3 + CIF.charAt(3) * 2 + CIF.charAt(4) * 1 + CIF.charAt(5) * 7 + CIF.charAt(6) * 5 + CIF.charAt(7) * 3 + CIF.charAt(8) * 2; SUMA=SUMA*10; REST = SUMA%11; if ( REST==10 ) $rest=0; if (REST == CifraControl) {document.getElementById('rezultat').innerHTML = 'DA'; } else {document.getElementById('rezultat').innerHTML = 'NU'; } //document.getElementById('rezultat').innerHTML = SUMA; //document.getElementById('rezultat').innerHTML = SUMA; }

  • popescuoltin says:

    Unde naiba vedeti voi validare CUI ?? vad doar CIF, dar in titlu scrie si CUI… asa ca, UNDE ESTE CUI ?????????????????????????????????????????????????????????????????????????????????????????????????

  • Adi says:

    Denumirea era cui pana in 2007 si acum este CIF.
    O varianta simpla:

    function isCui($cui)
    {
    if (!is_numeric($cui)) return false;
    $key = strrev('753217532');
    $control = substr($cui, -1);
    $crev = strrev(substr($cui, 0, -1));
    $length = strlen($crev);
    $suma = 0;

    for ($i = 0; $i < $length; $i++)
    {
    $suma += $crev{$i} * $key{$i};
    }

    return (($suma * 10) % 11 == $control) ? true : false;
    }

  • Calinutz says:

    Nu il mai luati atata la suturi pe Gabriel… Intentia lui a fost buna. Oricine poate sa optimizeze un cod existent.
    Hai sa va dau si eu unul pentru optimizat. E pentru Pascal/Delphi
    function ValidateCUI(s:string):Boolean;
    const
    contr='753217532';
    var
    keia,rcif,cif,p,px:string;
    suma,lenu,x,I:Integer;
    cifracontrol:Integer;
    begin
    if STRLen(PCHAR(s))>10 then
    begin
    ValidateCUI:=false;
    end
    else
    begin
    cifracontrol:=StrToInt(s[StrLen(PCHAR(s))]);
    cif:=copy(s,1,StrLen(PCHAR(s))-1);
    while StrLen(PCHAR(cif))<>9 do
    cif:='0'+cif;
    keia:=StrReverse(contr);
    rcif:=StrReverse(cif);
    lenu:=StrLen(PCHAR(rcif));
    suma:=0;
    for i:=1 to lenu do
    begin
    suma:=suma+StrToInt(rcif[i])*StrToInt(keia[i]);
    end;
    if (suma*10 mod 11 <> cifracontrol) then ValidateCUI:=False else ValidateCUI:=true;
    end;
    end;
    — si pt ca delphi nu are functia StrReverse:
    Function StrReverse(S : String): String;
    Var
    i : Integer;
    Begin
    Result := '';
    For i := Length(S) DownTo 1 Do
    Begin
    Result := Result + Copy(S,i,1) ;
    End;
    End;

    • Mail4xwu says:

      Corectie la functia de validare…

      function validateCUI(cif:string):boolean;
      const
      cheia=’753217532′;
      var
      keia,cifre,controlul:string;
      i,suma:integer;
      rest:double;
      begin
      keia:=StrReverse(cheia);
      cifre:=StrReverse(cif);
      controlul:=copy(cifre,1,1);
      cifre:=copy(cifre,2,strlen(PCHAR(cifre))-1);
      suma:=0;
      for i:=1 to StrLen(PCHAR(cifre)) do suma := suma+ StrToInt(cifre[i])*StrToInt(keia[i]);
      if (suma * 10) mod 11 = 10 then rest:=0 else rest:=(suma*10) mod 11;
      if rest=StrToInt(controlul) then result:=true else result:=false;
      end;

  • mă rog, mi-a stricat blogul toată aranjarea în pagină 🙁

  • Gabriel H says:

    Exista CUI valid si din 2 (doua) cifre (ex 19) (vorbim aici de CUI-uri care au ramas si se folosesc in forma veche).
    Deci prin urmare codurile de mai sus dau ca si invalide CUI-uri valide.

  • Petru Sandru says:

    Este, in orice caz, de salutat “facerea de bine” a lui Gabriel !
    Mie mi-a fost foarte utila pagina asta; aveam mare trebuinta de un cod de verificare CIF si habar nu aveam de algoritmul acesta !

    Tks, Gabriel !

  • Razvan says:

    Salutare,

    Aveti cumva si varianta C# a codului de verificare CIF?

    Multumesc!

Lasa un comentariu

Your email address will not be published.

This site uses Akismet to reduce spam. Learn how your comment data is processed.