Estoy haciendo una base de datos que genere una facturas, en mi aplicacion trato de validar un rfc, lo logre hacer por medio de funciones separadas, nunca habia hecho una clase, pero trate de unir todas mis funciones en una sola clase, para hacerlo mas "organico" y organizado, ademas esto me da la facilidada de volver a utilizar el codigo, uno seria para el propio usuario darse de alta y otro para que el usuario genere una libreta de contactos y a la hora que el ingrese un rfc de algun contacto sepa que lo puso mal, la expresion regular la encontre en un pdf (no recuerdo donde) del propio sat mi pregunta es a los expertos ¿Como se podria mejorar la extructura de dicha clase? como dije es la primera vez que hago una y trate de hacerlo pues como pienso que es la manera optima, poniendo algunas funciones privadas y otras publicas, con una clase constructora.
Código PHP:
class rfc {
private $rfc_prosesa = array(
'tipo' =>"",
'insertado' =>"",
'valida' => array('mensaje' => "" , 'status' => FALSE)
);
public $get_rfc = array();
//Funcion que se autoejecuta cuando defines un objeto,
//le puedes poner argumentos de inicialización, por defecto todo es vacio.
public function __construct($rfc_insertado,$tipo_insertado="DEDUCE") {
//Eliminamos espacios en blanco.
$rfc_insertado = str_replace(' ', '', $rfc_insertado);
//Eliminamos guiones.
$rfc_insertado = str_replace('-', '', $rfc_insertado);
//Pasamos a mayusculas.
$rfc_insertado = strtoupper($rfc_insertado);
//Asignamos valores a los atributos con los argumentos
$this->rfc_prosesa['tipo'] = $tipo_insertado;
$this->rfc_prosesa['insertado'] = $rfc_insertado;
}
private function comprueba_rfc() {
//Convertimos en varibles locales algunas propiedades del objeto RFC
$longitud =strlen($this->rfc_prosesa['insertado']);
$insertado=$this->rfc_prosesa['insertado'];
$patron ="/[A-Z,Ñ,&]{3,4}[0-9]{2}[0-1][0-9][0-3][0-9][A-Z,0-9]?[A-Z,0-9]?[0-9,A-Z]?/";
$tipo = $this->rfc_prosesa['tipo'];
//Checamos en el switch el numero de caracteres para ver si
//cumple con la canridad de dijitos para cada caso
switch ($tipo) {
case 'DEDUCE':
if ($longitud==12 || $longitud==13) {
$this->rfc_prosesa['valida'] ['status'] = TRUE;
//Reaccignamos el tipo dependiendo la cantidad de caracteres
if ($longitud==13) {
$this->rfc_prosesa['tipo'] = "FISICO";
}else{
$this->rfc_prosesa['tipo'] = "MORAL";
}
}else{
$this->rfc_prosesa['valida'] ['status'] = FALSE;
$this->rfc_prosesa['valida'] ['mensaje'] = "El RFC que escribio le sobran o le faltan caracteres para que sea fisico o moral";
}
break;
case 'FISICO':
if ($longitud==13) {
$this->rfc_prosesa['valida'] ['status'] = TRUE;
}else{
$this->rfc_prosesa['valida'] ['status'] = FALSE;
$this->rfc_prosesa['valida'] ['mensaje'] = "El RFC que escribio le sobran o le faltan caracteres para que sea fisico";
}
break;
case 'MORAL':
if ($longitud==12) {
$this->rfc_prosesa['valida'] ['status'] = TRUE;
}else{
$this->rfc_prosesa['valida'] ['status'] = FALSE;
$this->rfc_prosesa['valida'] ['mensaje'] = "El RFC que escribio le sobran o le faltan caracteres para que sea un moral";
}
break;
}
//Con una expresion comprobamos que cumple con el formato de un RFC;
if ($this->rfc_prosesa['valida'] ['status']) {
if (preg_match($patron, $insertado)) {
$this->rfc_prosesa['valida'] ['status'] = TRUE;
} else {
$this->rfc_prosesa['valida'] ['status'] = FALSE;
$this->rfc_prosesa['valida'] ['mensaje'] = "El RFC que escribio no corresponde con el formato";
}
}
}
public function get_rfc() {
$this->comprueba_rfc();
if ($this->rfc_prosesa['valida'] ['status']) {
$this->get_rfc['status'] = TRUE;
$this->get_rfc['tipo'] = $this->rfc_prosesa['tipo'];
switch ($this->rfc_prosesa['tipo'] ) {
case 'MORAL':
$grupo_1 = substr($this->rfc_prosesa['insertado'], 0,3);
$grupo_2 = substr($this->rfc_prosesa['insertado'], 3,6);
$grupo_3 = substr($this->rfc_prosesa['insertado'], 9,3);
$this->get_rfc['rfc'] = $grupo_1."-".$grupo_2."-".$grupo_3;
break;
default:
$grupo_1 = substr($this->rfc_prosesa['insertado'], 0,4);
$grupo_2 = substr($this->rfc_prosesa['insertado'], 4,6);
$grupo_3 = substr($this->rfc_prosesa['insertado'], 10,3);
$this->get_rfc['rfc'] = $grupo_1."-".$grupo_2."-".$grupo_3;
break;
}
}else{
$this->get_rfc['status'] = FALSE;
$this->get_rfc['mensaje'] = $this->rfc_prosesa['valida'] ['mensaje'];
}
return $this->get_rfc;
}
}
$rfc = new rfc("BAFJ070401AZ2");
$rfc2 = new rfc("HCM581122AZ","MORAL");
La funcion viene con la opcion de "tratar" de deducir si el rfc es fisico o moral