<?php
 
/*
 
 * @author: Iosif Chiriluta
 
 * @description: This class checks if a CNP is valid or not. If the CNP is valid, this class pull out the information about the possessor of given CNP.
 
 * @release date: 10/13/2011
 
 * @last update: 08/27/2012
 
 * @version: 2.0
 
 */
 
class CNP {
 
 
    /**
 
     * @access public 
 
     * @var integer
 
     */
 
    public $error;    
 
 
    /**
 
     * @access protected
 
     * @var string
 
     */
 
    protected $cnp;
 
 
    /**
 
     * @access protected
 
     * @var string[]
 
     */
 
    protected $cities = array(
 
        1 => "Alba",
 
        2 => "Arad",
 
        3 => "Arges",
 
        4 => "Bacau",
 
        5 => "Bihor",
 
        6 => "Bistrita-Nasaud",
 
        7 => "Botosani",
 
        8 => "Brasov",
 
        9 => "Braila",
 
        10 => "Buzau",
 
        11 => "Caras-Severin",
 
        12 => "Cluj",
 
        13 => "Constanta",
 
        14 => "Covasna",
 
        15 => "Dambovita",
 
        16 => "Dolj",
 
        17 => "Galati",
 
        18 => "Gorj",
 
        19 => "Harghita",
 
        20 => "Hunedoara",
 
        21 => "Ialomita",
 
        22 => "Iasi",
 
        23 => "Ilfov",
 
        24 => "Maramures",
 
        25 => "Mehedinti",
 
        26 => "Mures",
 
        27 => "Neamt",
 
        28 => "Olt",
 
        29 => "Prahova",
 
        30 => "Satu Mare",
 
        31 => "Salaj",
 
        32 => "Sibiu",
 
        33 => "Suceava",
 
        34 => "Teleorman",
 
        35 => "Timis",
 
        36 => "Tulcea",
 
        37 => "Vaslui",
 
        38 => "Valcea",
 
        39 => "Vrancea",
 
        41 => "Bucuresti/Sectorul 1",
 
        42 => "Bucuresti/Sectorul 2",
 
        43 => "Bucuresti/Sectorul 3",
 
        44 => "Bucuresti/Sectorul 4",
 
        45 => "Bucuresti/Sectorul 5",
 
        46 => "Bucuresti/Sectorul 6",
 
        51 => "Calarasi",
 
        52 => "Giurgiu"
 
    );
 
 
    /**
 
     * @access protected
 
     * @var string[]
 
     */
 
    protected $months = array(
 
        1 => "Ianuarie",
 
        2 => "Februarie",
 
        3 => "Martie",
 
        4 => "Aprilie",
 
        5 => "Mai",
 
        6 => "Iunie",
 
        7 => "Iulie",
 
        8 => "August",
 
        9 => "Septembrie",
 
        10 => "Octombrie",
 
        11 => "Noiembrie",
 
        12 => "Decembrie"
 
    );
 
 
    /**
 
     * @access public
 
     * @param string $cnp The CNP that will be validated
 
     * @return void|boolean
 
     */
 
    public function __construct($cnp) {
 
        
 
        $this->cnp = $cnp;
 
 
        if (FALSE === $this->_validate())
 
            return FALSE;
 
                
 
        $this->genre     = (int)substr($this->cnp, 0, 1);
 
        $this->month     = (int)substr($this->cnp, 3, 2);
 
        $this->day         = (int)substr($this->cnp, 5, 2);
 
        $this->city     = (int)substr($this->cnp, 7, 2);
 
        
 
        if( (1 > $this->month || 12 < $this->month) || (1 > $this->day || 31 < $this->day) || (!isset($this->cities[$this->city])) ) {
 
            $this->error = 3;
 
            return FALSE;
 
        }
 
    }
 
    
 
    /**
 
     * @access public
 
     * @return string[] Returns all information extracted from CNP
 
     */  
 
    public function fetchAllData() {
 
        return array(
 
            "genre"     => $this->getGenre(),
 
            "year"         => $this->getYear(),
 
            "month"     => $this->getMonth(),
 
            "day"         => $this->getDay(),
 
            "city"         => $this->getCity(),
 
            "resident"     => $this->getResidentInfo(),
 
            "stranger"    => $this->getStrangerInfo()
 
        );
 
    }
 
 
    /**
 
     * @access public
 
     * @return boolean Checks and returns if the owner of CNP lives in Romania
 
     */
 
    public function getResidentInfo() {
 
        return in_array($this->genre, array(7, 8)) ? TRUE : FALSE;
 
    }
 
    /**
 
     * @access public
 
     * @return boolean Checks and returns if the owner of CNP has Romanian orgins
 
     */
 
    public function getStrangerInfo() {
 
        return in_array($this->genre, array(7, 8, 9)) ? TRUE : FALSE;
 
    }
 
 
     /**
 
      * @access public
 
      * @return string[] Returns an array composed of number and initials genre
 
      */
 
    public function getGenre() {
 
        return array(
 
            $this->genre,
 
            in_array($this->genre, array(1, 3, 5, 7)) ? "m" : (
 
                in_array($this->genre, array(2, 4, 6, 8)) ? "f" : "n/a"
 
            )
 
        );
 
    }
 
 
    /**
 
     * @access public
 
     * @return string Returns the year extracted from CNP
 
     */
 
    public function getYear() {
 
        return (
 
                in_array($this->genre, array(1, 2)) ? 19 : (
 
                    in_array($this->genre, array(3, 4)) ? 18 : (
 
                        in_array($this->genre, array(5, 6)) ? 20 : NULL
 
                    ) 
 
                )
 
            ) . 
 
            substr($this->cnp, 1, 2);
 
    }
 
 
    /**
 
     * @access public
 
     * @return integer[] Returns an array composed of number and name of month extracted from CNP
 
     */ 
 
    public function getMonth() {
 
        return array(
 
            $this->month,
 
            $this->months[$this->month]
 
        );
 
    }
 
 
    /**
 
     * @access public
 
     * @return mixed[] Returns an array composed of month day and week name of day extracted from CNP
 
     */
 
    public function getDay() {
 
        return array(
 
            $this->day,
 
            date("l", strtotime("{$this->getYear()}/{$this->month}/{$this->day}"))
 
        );
 
    } 
 
 
    /**
 
     * @access public
 
     * @return mixed[] Returns an array composed of name of county and number extracted from CNP
 
     */
 
    public function getCity() {
 
        return array (
 
            $this->city,
 
            $this->cities[$this->city]
 
        );
 
    }
 
 
    /**
 
     * @access private
 
     * @return boolean Checks if the CNP is valid
 
     */
 
    private function _validate() {
 
        $key = "279146358279";
 
        
 
        if(13 !== strlen($this->cnp)) {
 
            $this->error = 1;
 
            return FALSE;
 
        }
 
 
        $s = 0;
 
 
        for($i = 0; $i <= 11; $i++)
 
            $s += $this->cnp[$i] * $key[$i];
 
        
 
        $s %= 11;
 
 
        if((10 === $s && "1" !== $this->cnp[12]) || (10 > $s && $s != $this->cnp[12])) {
 
            $this->error = 2;
 
            return FALSE;
 
        }
 
 
        return TRUE;
 
    }
 
}
 
?>
 
 |