Friday, December 3, 2010

CNP validation

CNP - Cod Numeric Personal

Codul Numeric Personal constituie numarul de ordine atribuit de Evidenta Populatiei unui individ la nastere.
Conform articolului 5 din Legea nr.105 din 25 septembrie 1996 privind evidenta populatiei si cartea de identitate, fiecarei persoane fizice i se atribuie, incepand de la nastere, un cod numeric personal care se inscrie in actele si certificatele de stare civila si se preia in celelalte acte cu caracter oficial, emise pe numele persoanei respective, precum si in Registrul permanent de evidenta a populatiei.
Codul numeric personal reprezinta un numar semnificativ ce individualizeaza o persoana fizica si constituie singurul identificator pentru toate sistemele informatice care prelucreaza date nominale privind persoana fizica.

Gestionarea si verificarea atribuirii codului numeric personal revine Ministerului de Interne, prin formatiunile de evidenta a populatiei.
Pentru persoanele fizice romane cu domiciliul in Romania codul de identificare fiscala este codul numeric personal atribuit de Ministerul de Interne.Persoanele fizice straine si persoanele fizice romane fara domiciliu in Romania vor beneficia de numar de identificare fiscala (NIF).
Un CNP este alcatuit astfel :

|S| |AA| |LL| |ZZ| |JJ| |ZZZ| |C|
|_| |__| |__| |__| |__| |___| |_|
  :     :      :      :     :       :    :
  :     :      :      :     :       :    :
  :     :      :      :     :       :    --> Cifra de control
  :     :      :      :     :       :
  :     :      :      :     :       --> Numarul de ordine atribuit persoanei
  :     :      :      :     :
  :     :      :      :     --> Codul judetului
  :     :      :      :
  :     :      :      --> Ziua nasterii
  :     :      :
  :     :      --> Luna nasterii
  :     :
  :     --> Anul nasterii
  :
  --> Cifra sexului (M/F) pentru:
        1/2 - cetateni romani nascuti intre 1 ian 1900 si 31 dec 1999
        3/4 - cetateni romani nascuti intre 1 ian 1800 si 31 dec 1899
        5/6 - cetateni romani nascuti intre 1 ian 2000 si 31 dec 2099
        7/8 - rezidenti
       Persoanele de cetatenie straina se identifica cu cifra "9"



Algoritmul de validare al unui cod CNP

Pas preliminar: Se testeaza daca codul respecta formatul unui cod CNP. Adica prima cifra sa fie cuprinsa in intervalul 1 - 6 sau sa fie 9 pentru straini. Urmatoarele sase cifre trebuie sa constituie o data calendaristica valida in formatul AALLZZ.
Pas 1: Se foloseste cheia de testare "279146358279". Primele douasprezece cifre se inmultesc pe rand de la stanga spre dreapta cu cifra corespunzatoare din cheia de testare.
Pas 2: Cele douasprezece produse obtinute se aduna si suma obtinuta se imparte la 11.
  • Daca restul impartirii la 11 este mai mic ca 10, atunci acesta va reprezenta cifra de control.
  • Daca restul impartirii este 10 atunci cifra de control este 1.
Pentru un CNP valid cifra de control va trebui sa coincida cu cifra de pe pozitia treisprezece din CNP-ul initial.



public static bool isValidCNP(string cnp)
    {
        bool result = true;
        try
        {
            #region CNP
            if (cnp.Replace(" ", "").Length != 13)
            {

                result &= false;
            }
            else
            {
                #region AlgoritmVerificareCNP
                string tempNumber = "1234567890";
                if ((tempNumber.IndexOf(cnp[0]) < 0) ||
                    (tempNumber.IndexOf(cnp[1]) < 0) ||
                    (tempNumber.IndexOf(cnp[2]) < 0) ||
                    (tempNumber.IndexOf(cnp[3]) < 0) ||
                    (tempNumber.IndexOf(cnp[4]) < 0) ||
                    (tempNumber.IndexOf(cnp[5]) < 0) ||
                    (tempNumber.IndexOf(cnp[6]) < 0) ||
                    (tempNumber.IndexOf(cnp[7]) < 0) ||
                    (tempNumber.IndexOf(cnp[8]) < 0) ||
                    (tempNumber.IndexOf(cnp[9]) < 0) ||
                    (tempNumber.IndexOf(cnp[10]) < 0) ||
                    (tempNumber.IndexOf(cnp[11]) < 0) ||
                    (tempNumber.IndexOf(cnp[12]) < 0)
                    )
                {
                    result &= false;

                    return result;
                }
                int s = Int32.Parse(cnp[0].ToString()) * 2 +
                        Int32.Parse(cnp[1].ToString()) * 7 +
                        Int32.Parse(cnp[2].ToString()) * 9 +
                        Int32.Parse(cnp[3].ToString()) * 1 +
                        Int32.Parse(cnp[4].ToString()) * 4 +
                        Int32.Parse(cnp[5].ToString()) * 6 +
                        Int32.Parse(cnp[6].ToString()) * 3 +
                        Int32.Parse(cnp[7].ToString()) * 5 +
                        Int32.Parse(cnp[8].ToString()) * 8 +
                        Int32.Parse(cnp[9].ToString()) * 2 +
                        Int32.Parse(cnp[10].ToString()) * 7 +
                        Int32.Parse(cnp[11].ToString()) * 9;
                int r = s % 11;
                if (r == 10)
                    r = 1;
                if (Int32.Parse(cnp[12].ToString()) != r)
                {

                    result &= false;
                }

                #endregion
            }
            #endregion
            return result;
        }
        catch (Exception)
        {

            return false;
        }


    }

No comments:

Post a Comment