<?php 
/** * Clase clave RIB * 
* Clase que permite crear objetos de tipo RIB_ES que guardan 
* números de cuentas bancarias y los métodos necesarios 
* para controlar la correctaz de un codigo. 
**/
class COD_BANC_ES{ 
 /**   
 * Atributos   
 **/ 
 private $_sCodigoBanco;  
 private $_sCodigoOficina;  
 private $_sCodigoClave;  
 private $_sNumeroCuenta;   
 
 /**   
 * Constructor de la clase   
 *   
 * @param string codigo único del banco   
 * @param string code unique del oficina    
 * @param string numéro de la cuenta   
 * @param string código clave   
 * @return void   
 **/  
 public function __construct($sCodigoBanco, $sCodigoOficina, $sNumeroCuenta, $sCodigoClave)  {    
	// Control del COD_BANC    
	if(true === (self::verifierCOD_BANC($sCodigoBanco, $sCodigoOficina, $sNumeroCuenta, $sCodigoClave)))    {     

		$this->_sCodigoBanco = $sCodigoBanco;      
		$this->_sCodigoOficina = $sCodigoOficina;      
		$this->_sCodigoClave = $sCodigoClave;      
		$this->_sNumeroCuenta = $sNumeroCuenta;    
	}    
	else    {      
		throw new Exception("El COD_BANC no es un COD_BANC válido.");    
	}  
 } 
 
 /**   
 * Destructor de la clase  
 *   
 * @param void   
 * @return void   
 **/  
 public function __destruct() { } 
 
 /**  
 * Devuelve el código banco   
 *   
 * @param void   
 * @return string código banco  
 **/ 
 public function getCodigoBanco()  {   
	return $this->_sCodigoBanco;  
 }   
 
 /**   
 * Devuelve el código oficina  
 *   
 * @param void   
 * @return string código oficina   
 **/ 
 public function getCodigoOficina()  {   
	return $this->_sCodigoOficina; 
 } 
 
 /**   
 * Devuelve el código clave   
 *  
 * @param void  
 * @return string código clave   
 **/ 
 public function getCodigoClave()  {    
	return $this->_sCodigoClave;  
 }  
 
 /**  
 * Devuelve el numéro de cuenta  
 *   
 * @param void   
 * @return string numéro de cuenta   
 **/ 
 public function getNumeroCuenta()  
 {   
	return $this->_sNumeroCuenta;  
 }
 
 /**   
 * Muestra el COD_BANC correctoement 
 * @param void   
 * @return string numéro de cuenta COD_BANC completo   
 **/  
 public function __toString()   {    
	return $this->_sCodigoBanco .''. $this->_sCodigoOficina .''. $this->_sNumeroCuenta .''. $this->_sCodigoClave;  
 } 
 
 /**   
 * Verifica que la clave COD_BANC está en el intervalo 01 - 97   
 *   
 * @param string código clave   
 * @return boolean true / false   
 **/ 
 public static function comprobarCodigoClave($sCodigoClave)  {    
	return preg_match('`^(0[1-9]|[1-8]\d|9[0-7])$`', $sCodigoClave); 
 }
 
 
 /**   
 * Calcula une clave COD_BANC a partir de los datos bancarios 
 * La función implementa el algoritmo de la clave COD_BANC   
 * Una clave COD_BANC solo es válida si está en el intervalo 01 - 97  
 *   
 * @param string código único del banco   
 * @param string código único de la oficina 
 * @param string numéro de la cuenta 
 * @return string código clave calculada  
 **/ 
 public static function calcularCodigoClave($sCodigoBanco, $sCodigoOficina, $sNumeroCuenta)  {    
	 $sCodigoClave =''; 
	 $iCodigoClave = 0;	 
	 // Calculo de la clave COD_BANC   
	 $iCodigoClave = 97 - (int) fmod (89 * $sCodigoBanco  + 15 * $sCodigoOficina + 3  * $sNumeroCuenta, 97);     
	 if($iCodigoClave<10)     {     
		$sCodigoClave ='0'. (string)$iCodigoClave;    
	 } 
	 else 
	 {      
		$sCodigoClave = (string) $iCodigoClave;    
	 }    
	 return  $sCodigoClave; 
 } 
 
 /**   
 * Verifica que el COD_BANC es un COD_BANC 
 * de cuenta bancaria correctoo   
 *   
 * @param string código único del banco   
 * @param string código único de la oficina   
 * @param string numéro de la cuenta  
 * @param string código clave  
 * @return boolean true / false  
 **/  
 public static function comprobarCOD_BANC($sCodigoBanco, $sCodigoOficina, $sNumeroCuenta, $sCodigoClave)  {    
	 $bCorrect = false;     
	 // Verifica la clave COD_BANC   
	 if(self::comprobarCodigoClave($sCodigoClave))    {      
		 // Calcula la clave COD_BANC para verificar si correponde con el transmitido como argumento     
		 if($sCodigoClave === self::calcularCodigoClave($sCodigoBanco, $sCodigoOficina, $sNumeroCuenta))      {        
			$bCorrect = true;      
		 }    
	 }    
	 return $bCorrect;  
 }  
  
}
?>