[Solucionado] Rut (Chile)

Hola!

Quería ver si alguien de Chile que programa con Yii me podría ayudar con la validación del Rut. Tengo una tabla que se llama "trabajador" donde guardo los datos personales y por supuesto el rut. Pero no sé cómo o dónde agregar el código para que me valide el rut agregarlo en el formulario de los datos personales del trabajador.

¿Debo crear una public function con el código para validar el rut en el modelo "trabajador" o en el controlador "trabajador"?

Gracias!

Hola,

Para añadir reglas de validación personalizadas puedes agregarlas a tu modelo. Por ejemplo, para validar rut puedes hacer lo siguiente:




// modelo Trabajador


public function rules() {

	    [...reglas de validación incluidas por defecto]

            array('rut', 'validateRut'),

    }




public function validateRut($attribute, $params) {

        $data = explode('-', $this->rut);

        $evaluate = strrev($data[0]);

        $multiply = 2;

        $store = 0;

        for ($i = 0; $i < strlen($evaluate); $i++) {

            $store += $evaluate[$i] * $multiply;

            $multiply++;

            if ($multiply > 7)

                $multiply = 2;

        }

        isset($data[1]) ? $verifyCode = strtolower($data[1]) : $verifyCode = '';

        $result = 11 - ($store % 11);

        if ($result == 10)

            $result = 'k';

        if ($result == 11)

            $result = 0;

        if ($verifyCode != $result)

            $this->addError('rut', 'Rut inválido.');

    }




Ojo: la regla de validación la hice hace mucho tiempo y probablemente se puede optimizar, pero basicamente lo que hace es utilizar el código verificador para ver si un RUT es válido o no. Debe recibir el RUT en formato estilo "12345678-5", puedes modificarlo si quieres recibir puntos también.

Además, con esta función puedes darle formato "12.345.678-5":





public function getFormattedRut() {

        $unformattedRut = $this->rut;

        if (strpos($unformattedRut, '-') !== false ) {

            $splittedRut = explode('-', $unformattedRut);

            $number = number_format($splittedRut[0], 0, ',', '.');

            $verifier = strtoupper($splittedRut[1]);

            return $number . '-' . $verifier;

        }

        return number_format($unformattedRut, 0, ',', '.');

    }



Saludos,

Mauricio.

Gracias Mauricio!!

Te pasaste. Me funcionó perfecto.

Me daba error al principio, pero por error mío. Tenía "rut" como integer y no string.

GRACIAS DE NUEVO!

Que bueno, un placer ayudar :)

Buenas Tardes:

Una duda y si necesito ademas de validar el Rut , comparar que no exista en la Base de datos, ¿como lo puedo hacer ?

este es mi código pero no me funciona, si le saco la función que valida Rut ahí si me compara con la base de datos pero no puedo hacer las dos cosas.

ojalá alguien me pueda ayudar aca les dejo mi codigo del model




	public function rules()

	{

		// NOTE: you should only define rules for those attributes that

		// will receive user inputs.

		return array(

			array('codigo, cliente_rut, cliente_nombre, cliente_direccion, cliente_telefono, email, Cc_customer_cc_cust_id', 'required'),

			array('codigo, cliente_telefono, Cc_customer_cc_cust_id', 'numerical', 'integerOnly'=>true),

			array('cliente_rut', 'validateRut', 'attributeName'=>'cliente_rut', 'className'=>'cliente', 'allowEmpty'=>'false'),

			array('cliente_nombre', 'length', 'max'=>100),

			array('cliente_direccion', 'length', 'max'=>1000),

			array('email', 'email','message'=>"Formato de Email Incorrecto"),

			// The following rule is used by search().

			// @todo Please remove those attributes that should not be searched.

			array('cliente_id, codigo, cliente_rut, cliente_nombre, cliente_direccion, cliente_telefono, email, Cc_customer_cc_cust_id', 'safe', 'on'=>'search'),

		);

	}

	/**

	 * @return array relational rules.

	 */




	public function validateRut($attribute, $params) {

        $data = explode('-', $this->cliente_rut);

        $evaluate = strrev($data[0]);

        $multiply = 2;

        $store = 0;

        for ($i = 0; $i < strlen($evaluate); $i++) {

            $store += $evaluate[$i] * $multiply;

            $multiply++;

            if ($multiply > 7)

                $multiply = 2;

        }

        isset($data[1]) ? $verifyCode = strtolower($data[1]) : $verifyCode = '';

        $result = 11 - ($store % 11);

        if ($result == 10)

            $result = 'k';

        if ($result == 11)

            $result = 0;

        if ($verifyCode != $result)

            $this->addError('cliente_rut', 'El Rut ingresado no es válido.');

    }




Hola… La validacion esta excelente!!, muchas gracias… solo tengo una pregunta, para ocupar la funcion que le da formato, tendria que ponerla en el controlador o en el modelo??.. y desde donde la invoco??

muchas gracias!!

Buenas, muchas gracias Mauricio por la validación anda perfecto.

Por completitud, dejo aqui 4 funciones que son utiles para trabajar con Ruts (una es la de Mauricio).


<?php

/**

	 * Convert a rut to complete format. It adds '.' and '-' appropriately.

	 * Example: 22452225-8 get converted to 22.452.225-8 

	 * @param  String $rut The rut to be formated

	 * @return String      The formated rut

	 */

	protected function formatearRut($unformattedRut) {

            if (strpos($unformattedRut, '-') !== false ) {

                $splittedRut = explode('-', $unformattedRut);

                $number = number_format($splittedRut[0], 0, ',', '.');

                $verifier = strtoupper($splittedRut[1]);

                return $number . '-' . $verifier;

            }

          return number_format($unformattedRut, 0, ',', '.');

        }


	/**

	 * Convert a rut to only alphanumeric values. It removes '.' and '-' it may contain.

	 * Example: 22.452.225-8 gets converted to 224522258

	 * @param  String $rut The rut to be formated

	 * @return String      The formated rut

	 */

        protected function formatearRutSinGuionNiPuntos($rut){

           $quitar = array("-", ".");

           return str_replace($quitar, "", $rut);

        }


        /**

	 * Convert a rut to only alphanumeric values. It removes '.' it may contain.

	 * Example: 22.452.225-8 gets converted to 22452225-8

	 * Example: 22.452.2258  gets converted to 22452225-8

	 * @param  String $rut The rut to be formated

	 * @return String      The formated rut

	 */

        protected function formatearRutSinPuntosSoloGuion($rut){

            $quitar = array(".");

            $rut_sin_puntos = str_replace($quitar, "", $rut);


            if (strpos($rut_sin_puntos,'-') === false){

        	//Si no tiene se lo agrego

        	$rut_sin_puntos = substr_replace($rut_sin_puntos, '-', strlen($rut_sin_puntos)-1, 0);

            }


            return $rut_sin_puntos;

        }


        /**

         * Check if rut is a valid one.

	 * Example: 22.452.225-8 22452225-8 both returns true

         * @param  String $rut The rut to validate it can be in any format 

         * @return boolean      True when rut is valid and false otherwise

         */

         protected function validarRut($rut)

	 {

		$rut=strtoupper(ereg_replace('\.|,|-','',$rut));

		$sub_rut=substr($rut,0,strlen($rut)-1);

		$sub_dv=substr($rut,-1);

		$x=2;

		$s=0;

		for ( $i=strlen($sub_rut)-1;$i>=0;$i-- )

		{

			if ( $x >7 )

			{

				$x=2;

			}

			$s += $sub_rut[$i]*$x;

			$x++;

		}

		$dv=11-($s%11);

		if ( $dv==10 )

		{

			$dv='K';

		}

		if ( $dv==11 )

		{

			$dv='0';

		}

		if ( $dv==$sub_dv )

		{

			return true;

		}

		else

		{

			return false;

		}

	}

?>