Funciones para calcular cif, dni y nie en España

No Comments

Existen funciones que aunque no son gran cosa, conviene tener siempre a mano, pues es casi seguro que las vamos a usar en casi todas las gestiones empresariales que desarrollemos. Me refiero, entre otras, al cálculo del DNI, que es muy común, al NIE, que casi siempre me lo encuentro mal programado; y el más raro de encontrar el cálculo del CIF (código de identificación fiscal para sociedades en España).

Herencia y ecosistema

CodeIgniter permite situar en la carpeta application/core un archivo llamado MY_Controller como modificación del objeto controller predeterminado por el framework. De MY_Controller podrán heredar todos los controladores que deseemos. En otras palabras, situando en este archivo las funciones comunes que podamos usar desde nuestros controladores siempre las tendremos activas por herencia. Para más información lee el manual de CodeIgniter.

Mi MY_Controller

  1. <?php
  2. defined('BASEPATH') OR exit('No direct script access allowed');
  3. /**
  4. * Name:  Initio Model
  5. *
  6. * Author:  Pedro Ruiz Hidalgo
  7. *          ruizhidalgopedro@gmail.com
  8. *          @pedroruizhidalg
  9. *
  10. *
  11. * Created:  2017.05.01
  12. *
  13. *
  14. *
  15. * Requirements: PHP5 or above
  16. *
  17. */
  18. class MY_Controller extends CI_Controller
  19. {
  20.  
  21.     function __construct()
  22.     {
  23.         parent::__construct();     
  24.         $this->config->load('gestion');
  25.        
  26.         if ( $this->config->item('migrations') === TRUE )
  27.         {
  28.             $this->load->library('migration');
  29.  
  30.             if(!$this->migration->latest())
  31.             {
  32.                   show_error($this->migration->error_string());
  33.                   exit;
  34.             }
  35.         }
  36.  
  37.         if (! $this->ion_auth->logged_in())
  38.         {
  39.             redirect('auth/login','refresh');
  40.         } else {
  41.             $this->User         =   $this->ion_auth->user()->row();
  42.             $this->is_logged    =   $this->ion_auth->logged_in();
  43.             $this->is_admin     =   $this->ion_auth->is_admin();
  44.         }
  45.        
  46.         $this->output->enable_profiler(FALSE);
  47.  
  48.  
  49.     }
  50.  
  51.    
  52.  
  53.  
  54.     function check_dni($str)
  55.     {
  56.         $_dni   =   '/^(\d{8})([A-Z])$/';
  57.         if ( preg_match($_dni, $str) )
  58.         {
  59.             $letter = strtoupper( substr($str, -1) );
  60.             $numbers = substr($str, 0, -1);
  61.             if ( substr("TRWAGMYFPDXBNJZSQVHLCKE", $numbers%23, 1) == $letter && strlen($letter) == 1 && strlen ($numbers) == 8 ){
  62.                 return TRUE;
  63.             }else{
  64.                 return FALSE;
  65.             }
  66.         }
  67.         return FALSE;
  68.     }
  69.  
  70.     function check_cif($str)
  71.     {
  72.         $_cif   =   '/^([ABCDEFGHJKLMNPQRSUVW])(\d{7})([0-9A-J])$/';
  73.         if ( preg_match($_cif, $str) )
  74.         {
  75.             if ( preg_match($_cif, $str) )
  76.             {
  77.                 $type_code      =   substr($str, 0,1); //código de tipo de sociedad
  78.                 $number         =   substr($str, 1, 7); // NÚMERO PARA CALCULAR
  79.                 $A              =   substr($str, 2,1)+substr($str, 4,1)+substr($str, 6,1);
  80.                 $B1             =   substr($str, 1,1)*2;
  81.                 $B2             =   substr($str, 3,1)*2;
  82.                 $B3             =   substr($str, 5,1)*2;
  83.                 $B4             =   substr($str, 7,1)*2;
  84.  
  85.                 $B1             =   substr($B1, 0,1)+substr($B1, 1,1);
  86.                 $B2             =   substr($B2, 0,1)+substr($B2, 1,1);
  87.                 $B3             =   substr($B3, 0,1)+substr($B3, 1,1);
  88.                 $B4             =   substr($B4, 0,1)+substr($B4, 1,1);
  89.  
  90.                 $B=$B1+$B2+$B3+$B4;
  91.  
  92.                 $C              =   $A+$B;
  93.                 $C              =   substr($C,-1);
  94.                 $C              =   10-$C;
  95.  
  96.                 if($C==substr($str, -1))
  97.                 {
  98.                     return TRUE;
  99.                 } else {
  100.                     return FALSE;
  101.                 }
  102.             } else {
  103.                 return FALSE;
  104.             }
  105.             return FALSE;
  106.         }
  107.         return FALSE;
  108.     }
  109.  
  110.     function check_nie($str)
  111.     {
  112.         $_nie   =   '/^[XYZ]\d{7,8}[A-Z]$/';
  113.         if ( preg_match($_nie, $str) )
  114.         {
  115.             $letter = strtoupper( substr($str, -1) );
  116.             $numbers = substr($str, 1, -1);
  117.             $init_letter =  strtoupper( substr($str, 0, 1) );
  118.  
  119.             switch ($init_letter)
  120.             {
  121.                 case 'X':
  122.                     $numbers= "0$numbers";
  123.                     break;
  124.                
  125.                 case 'Y':
  126.                     $numbers= "1$numbers";
  127.                     break;
  128.  
  129.                 case 'Z':
  130.                     $numbers= "2$numbers";
  131.             }
  132.             if ( substr("TRWAGMYFPDXBNJZSQVHLCKE", $numbers%23, 1) == $letter && strlen($letter) == 1 && strlen ($numbers) == 8 ){
  133.                 return TRUE;
  134.             } else {
  135.                 return FALSE;
  136.                
  137.             }
  138.         } else {
  139.             return FALSE;
  140.         }
  141.         return FALSE;
  142.     }
  143. }

Función check_dni

Quizás el más simple de los tres. Nos viene determinado por la Administración Española un string de 23 caracteres, hallamos el módulo 23 (esto es el resto de la división tras haber dividido entre 23), y ese resto tiene que ser igual a la posición de la letra del DNI en el string predeterminado.

Función check_nie

Básicamente como la función check_dni, pero el NIE en España viene precedido por las letras “X”,”Y” y “Z”, más información en orden ministerial que lo regula.

Función check_cif

Algo más complejo, pero tampoco es gran cosa. Las sociedades en España tienen un código asociado a una letra como primera posición del CIF. Prescindiendo de esta letra, tipo de sociedad, nos quedan ocho caracteres. Sumamos los dígitos pares, las posiciones impares se suman multiplicadas por dos, luego se suman ambos resultados y nos quedamos solo con las unidades despreciando las decenas, este dígito debe ser igual al último de la código de identificación fiscal.

Categories: codeigniter Tags: Etiquetas: , ,

Deja un comentario