<?php

/**
 * This is the model class for table "sidcai_usuario".
 *
 * The followings are the available columns in table 'sidcai_usuario':
 * @property integer $usua_codigo_pk
 * @property string $usua_nombre
 * @property string $usua_apellido
 * @property string $usua_telefono
 * @property string $usua_cargo
 * @property string $usua_tipodocumento
 * @property string $usua_cambiocontrasena
 * @property string $usua_habilitado
 * @property integer $tipo_codigo_fk
 * @property string $usua_documento
 * @property string $usua_correoelectronico
 * @property string $usua_contrasena
 * @property integer $audit_usua
 * @property string $usua_celular
 *
 * The followings are the available model relations:
 * @property SidcaiDeclaracioncti[] $sidcaiDeclaracionctis
 * @property SidcaiAccion[] $sidcaiAccions
 * @property SidcaiCitaaportante[] $sidcaiCitaaportantes
 * @property SidcaiCitabeneficiario[] $sidcaiCitabeneficiarios
 * @property SidcaiConsulta[] $sidcaiConsultas
 * @property SidcaiConsulta[] $sidcaiConsultas1
 * @property SidcaiPerfil[] $sidcaiPerfils
 * @property SidcaiPrestamosExpedientes[] $sidcaiPrestamosExpedientes
 * @property SidcaiPrestamosExpedientes[] $sidcaiPrestamosExpedientes1
 * @property SidcaiPrestamosExpedientes[] $sidcaiPrestamosExpedientes2
 * @property SidcaiTipoacceso $tipoCodigoFk
 * @property SidcaiAportante[] $sidcaiAportantes
 * @property SidcaiBeneficiario[] $sidcaiBeneficiarios
 */
class SidcaiUsuario extends CActiveRecord{
	public $usua_nacionalidad; //Solo se usa para poder guardar "V" o "E" en el documento del usuario.

	/** Cambio de clave **/
	public $contrasena_actual;
	public $contrasena_nueva;
	public $repetir_contrasena;
	/** FIN Cambio de clave **/


	public $id_usuario; // Soloo es usado cuando se va a habilitar un usuario.

	/**
	 * @return string the associated database table name
	 */
	public function tableName(){
		return 'sidcai_usuario';
	}

	/**
	 * @return array validation rules for model attributes.
	 */
	public function rules(){
		// NOTE: you should only define rules for those attributes that
		// will receive user inputs.
		return array(
			array(
				'usua_documento, usua_nombre, usua_apellido, usua_telefono, usua_tipodocumento, usua_correoelectronico, usua_nacionalidad', 
				'required',
				'message' => 'Este campo es requerido.',
				'on' => 'agregar'
			),
			array(
				'usua_documento, usua_nombre, usua_apellido, usua_telefono, usua_tipodocumento, usua_correoelectronico, usua_nacionalidad',
				'filter',
				'filter' => 'trim',
				'on' => 'agregar'
			),
			array(
				'usua_correoelectronico', 
				'match', 
				'pattern' => '/^([a-zA-Z0-9]+)([\.{1}])?([a-zA-Z0-9-_.]+)([a-zA-Z0-9]+)(@GMAIL\.COM)?$/',
				'message' => 'Correo electrónico no válido.'
			),
			array(
				'usua_nombre, usua_apellido, usua_correoelectronico',
				'length', 
				'min' => 4,
				'tooShort' => 'Mínimo 4 caracteres.'
			),
			array(
				'usua_documento',
				'length', 
				'min' => 8,
				'tooShort' => 'El número de documento no es válido.',
			),
			array(
				'usua_nombre, usua_apellido',
				'length',
				'max' => 30,
				'tooLong' => 'Máximo 30 caracteres.'
			),
			array(
				'usua_cargo',
				'length',
				'max' => 45,
				'tooLong' => 'Máximo 45 caracteres.'
			),
			array(
				'usua_telefono, usua_celular', 
				'length', 
				'min' => 11,
				'tooShort' => 'Número de teléfono incorrecto.',
				'max' => 11,
				'tooLong' => 'Número de teléfono incorrecto.'
			),

			// array(
			// 	'usua_correoelectronico',
			// 	'existeCorreo',
			// 	'on' => 'agregar'
			// ),

			// Válida que el tipo de documento sea solo "CP".
			array(
				'usua_tipodocumento', 
				'match', 
				'pattern' => '/^([CP]){1}$/',
				'message' => 'El Tipo de Documento es incorrecto.'
			),
			// Válida que la nacionalida sea solo "VE".
			array(
				'usua_nacionalidad', 
				'match', 
				'pattern' => '/^([VE]){1}$/',
				'message' => 'La Nacionalidad es incorrecta.'
			),
			array(
				'usua_documento', 
				'match', 
				'pattern' => '/^([VE])?[0-9]{8}$/',
				'message' => 'El documento no es válido.'
			),
			array(
				'usua_documento',
				'verificarUsuario',
				'on' => 'agregar'
			),

			/** Cambiar correo del usuario por el Analista **/
			array(
				'usua_correoelectronico',
				'required',
				'message' => 'Este campo es requerido',
				'on' => 'cambiar_correo',
			),
			/** FIN Cambiar correo del usuario por el Analista **/

			array(
				'tipo_codigo_fk, audit_usua, usua_telefono, usua_celular', 
				'numerical', 
				'integerOnly' => true,
				'message' => 'Solo se permiten números.'
			),
			array(
				'usua_cargo, usua_cambiocontrasena, usua_habilitado, usua_celular', 
				'safe'
			),



			/** Validar cambio de clave **/
			array(
				'contrasena_actual, contrasena_nueva, repetir_contrasena',
				'required',
				'message' => 'Este campo es requerido.',
				'on' => 'cambioClave'
			),

			/** Validar resetPassword **/
			array(
				'contrasena_nueva, repetir_contrasena',
				'required',
				'message' => 'Este campo es requerido.',
				'on' => 'resetPassword'
			),

			/*** Se utiliza para el cambio de clave ***/
			array(
				'contrasena_actual, contrasena_nueva, repetir_contrasena',
				'length',
				'min' => 8,
				'tooShort' => 'Mínimo 8 caracteres',
				'max' => 15,
				'tooLong' => 'Máximo 15 caracteres',
				'on' => 'cambioClave'
			),

			/*** Se utiliza para el resetPassword ***/
			array(
				'contrasena_nueva, repetir_contrasena',
				'length',
				'min' => 8,
				'tooShort' => 'Mínimo 8 caracteres',
				'max' => 15,
				'tooLong' => 'Máximo 15 caracteres',
				'on' => 'resetPassword'
			),

			array(
				'contrasena_nueva',
				'match',
				# 'pattern' => '/^(?=.*\d)(?=.*[\u0021-\u002b\u003c-\u0040])(?=.*[A-Z])(?=.*[a-z])\S{8,15}$/',
				'pattern' => '/^(?=.*[a-z])(?=.*[A-Z])(?=.*\d)(?=.*[$@!%*?&#.$($)$-$_])[A-Za-z\d$@!%*?&#.$($)$-$_]{8,15}$/',
				'message' => 'La contraseña debe tener entre 8 y 15 caracteres, al menos un dígito, una minúscula, una mayúscula y uno de los siguientes simbolos $@!%*_#.()?&',
				'on' => 'cambioClave, resetPassword'
			),
			array(
				'repetir_contrasena',
				'compare',
				'compareAttribute' => 'contrasena_nueva',
				'message' => 'Las contraseñas no coinciden',
				'on' => 'cambioClave, resetPassword'
			),
			array(
				'contrasena_actual',
				'claveActual',
				'on' => 'cambioClave'
			),
			/*** FIN: Se utiliza para el cambio de clave ***/

			array(
				'id_usuario',
				'required',
				'message' => 'Este campo es requerido',
				'on' => 'habilitar_usuario'
			)
		);
	}

	/**
	 * @return array relational rules.
	 */
	public function relations(){
		// NOTE: you may need to adjust the relation name and the related
		// class name for the relations automatically generated below.
		return array(
			'sidcaiDeclaracionctis' => array(self::HAS_MANY, 'SidcaiDeclaracioncti', 'usua_codigo_fk'),
			'tipoCodigoFk' 			=> array(self::BELONGS_TO, 'SidcaiTipoacceso', 'tipo_codigo_fk'),
			'sidcaiAportantes' 		=> array(self::MANY_MANY, 'SidcaiAportante', 'sidcai_usuario_aportante(usua_codigo_fk, apor_codigo_fk)'),
			'sidcaiPerfils' 		=> array(self::MANY_MANY, 'SidcaiPerfil', 'sidcai_perfil_usuario(usua_codigo_fk, perf_codigo_fk)'),
		);
	}

	/**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels(){
        return array(
            'usua_codigo_pk' => 'Código de Usuario',
            'usua_nombre' 	=> 'Nombres',
            'usua_apellido' => 'Apellidos',
            'usua_telefono' => 'Teléfono 1',
            'usua_celular' 	=> 'Teléfono 2',
            'usua_cargo' 	=> 'Cargo',
            'usua_contrasena' 	=> 'Contraseña',
            'usua_nacionalidad' => 'Nacionalidad',
            'audit_usua' 		=> 'Usuario Auditor',
            'usua_habilitado' 	=> 'Habilitado',
            'tipo_codigo_fk' 	=> 'Tipo Codigo Fk',
            'usua_documento' 	=> 'Documento',
            'usua_tipodocumento' 		=> 'Tipo',
            'usua_cambiocontrasena' 	=> 'Usua Cambiocontrasena',
            'usua_correoelectronico' 	=> 'Correo electrónico',

            // Labels en Cambio de clave
            'contrasena_actual'  => 'Contraseña Actual',
			'contrasena_nueva' 	 => 'Nueva contraseña',
			'repetir_contrasena' => 'Confirmar contraseña'
        );
    }

	/**
	 * Returns the static model of the specified AR class.
	 * Please note that you should have this exact method in all your CActiveRecord descendants!
	 * @param string $className active record class name.
	 * @return SidcaiUsuario the static model class
	 */
	public static function model($className=__CLASS__){
		return parent::model($className);
	}

	// Funcion para verificar que no exista un usuario con el mismo número de documento
	public function verificarUsuario(){
		$documento = $this->usua_nacionalidad.$this->usua_documento;
		if($documento != ""){
			$usuario = SidcaiUsuario::model()->find('usua_documento = :usua_documento', array(':usua_documento' => $documento));

			if($usuario != null){
				$usuario_aportante = SidcaiUsuarioAportante::model()->findAll('usua_codigo_fk = :usua_codigo_fk', array(':usua_codigo_fk' => $usuario->usua_codigo_pk));

				if($usuario_aportante != null){
					foreach($usuario_aportante as $ua){
						if($ua->usua_habilitado == true){
							$this->addError('usua_documento', 'El documento <b>'.$documento.'</b> ya se encuentra asociado a una empresa.');
							break;
						}
					}
				}
			}
		}
	}

	/**
	 * Verifica que el correo ingresado no se encuentre en la BD.
	 */
	public function existeCorreo(){
		if($this->usua_correoelectronico != ""){
			$correo = mb_strtoupper($this->usua_correoelectronico)."@GMAIL.COM";

			$usuario = SidcaiUsuario::model()->find('usua_correoelectronico = :usua_correoelectronico', array(':usua_correoelectronico' => $correo));

			if($usuario != null){
				$this->addError('usua_correoelectronico', 'El correo electrónico <b>'.$correo.'</b> ya se encuentra registrado en el sistema.');
			}
		}
	}

	// Verifica si la contraseña ingresada es igual a la que está registrada en la base de datos
	// Esta función es usada cuando el ususario cambia la clave por primera vez y para cambiar la clave dentro del sistema
	public function claveActual(){
		if(Yii::app()->user->id)
			$usuario = SidcaiUsuario::model()->findByPk(Yii::app()->user->id);
		else
			$usuario = SidcaiUsuario::model()->findByPk(Yii::app()->request->cookies['id_usuario']->value);

		if($usuario != NULL){
			if(!password_verify($this->contrasena_actual, $usuario->usua_contrasena))
				$this->addError("contrasena_actual", "La contraseña es incorrecta.");
		}	
	}

	// Obtiene todos los Analistas
	// Metodo llamado desde el modulo de Analista
	public static function obtenerAnalistas0805(){
		$perfiles = Yii::app()->user->perfiles;

		if(in_array("6", $perfiles)){
			// Coordinador de Recaudación solo puede ver a los de su gerencia
			$concatenar = " AND p.perf_codigo_pk = 4 OR p.perf_codigo_pk = 6";
		}else if(in_array("5", $perfiles)){
			// Coordinador de Fiscalización solo puede ver a los de su gerencia
			$concatenar = " AND p.perf_codigo_pk = 3 OR p.perf_codigo_pk = 5";
		}else{
			$concatenar = "";
		}


		$sql = "SELECT   CONCAT (u.usua_documento, ' - ', u.usua_nombre, ' ', u.usua_apellido) AS analista, u.usua_codigo_pk, u.usua_documento, u.usua_nombre, u.usua_apellido, u.usua_habilitado,  pu.*, p.perf_codigo_pk, p.tipo_codigo_fk FROM sidcai_usuario u INNER JOIN sidcai_perfil_usuario pu ON u.usua_codigo_pk = pu.usua_codigo_fk JOIN sidcai_perfil p ON pu.perf_codigo_fk = p.perf_codigo_pk WHERE u.usua_habilitado=true and p.tipo_codigo_fk = 2 $concatenar ORDER BY u.usua_nombre";
		$ciiu = Yii::app()->db->createCommand($sql)->queryAll();

		return CHtml::listData($ciiu, 'usua_codigo_pk', 'analista');
	}


public static function obtenerAnalistas(){
    $perfiles = Yii::app()->user->perfiles;

    if (in_array("6", $perfiles)) {
        // Coordinador de Recaudación solo puede ver a los de su gerencia
        $concatenar = " AND (p.perf_codigo_pk = 4 OR p.perf_codigo_pk = 6)  AND u.usua_codigo_pk NOT IN (109, 55, 10)";
    } else if (in_array("5", $perfiles)) {
        // Coordinador de Fiscalización solo puede ver a los de su gerencia
        $concatenar = " AND (p.perf_codigo_pk = 3 OR p.perf_codigo_pk = 5) AND u.usua_codigo_pk NOT IN (109, 55, 10, 33, 9)";
    } else {
        $concatenar = "";
    }

    $sql = "
        SELECT
            CONCAT(u.usua_documento, ' - ', u.usua_nombre, ' ', u.usua_apellido) AS analista,
            u.usua_codigo_pk,
            u.usua_documento,
            u.usua_nombre,
            u.usua_apellido,
            u.usua_habilitado,
            pu.*,
            p.perf_codigo_pk,
            p.tipo_codigo_fk
        FROM sidcai_usuario u
        INNER JOIN sidcai_perfil_usuario pu ON u.usua_codigo_pk = pu.usua_codigo_fk
        JOIN sidcai_perfil p ON pu.perf_codigo_fk = p.perf_codigo_pk
        WHERE u.usua_habilitado = true
          AND p.tipo_codigo_fk = 2
		  AND (u.usua_cargo IS NULL OR u.usua_cargo NOT LIKE '%FUNDACITE%')
          $concatenar
        ORDER BY u.usua_nombre
    ";

    $ciiu = Yii::app()->db->createCommand($sql)->queryAll();
    return CHtml::listData($ciiu, 'usua_codigo_pk', 'analista');
}

public static function obtenerAnalistasFiscalizacion(){
    $perfiles = Yii::app()->user->perfiles;

    if (in_array("5", $perfiles)) {
        // Coordinador de Fiscalización solo puede ver a los de su gerencia
        $concatenar = " AND (p.perf_codigo_pk = 3 OR p.perf_codigo_pk = 5)";
    } else {
        $concatenar = "";
    }

	/*$sql = "
    SELECT
        CONCAT(u.usua_documento, ' - ', u.usua_nombre, ' ', u.usua_apellido) AS analista,
        u.usua_codigo_pk,
        u.usua_documento,
        u.usua_nombre,
        u.usua_apellido,
        u.usua_habilitado,
        pu.*,
        p.perf_codigo_pk,
        p.tipo_codigo_fk
    FROM sidcai_usuario u
    INNER JOIN sidcai_perfil_usuario pu ON u.usua_codigo_pk = pu.usua_codigo_fk
    JOIN sidcai_perfil p ON pu.perf_codigo_fk = p.perf_codigo_pk
    WHERE u.usua_habilitado = true
      AND p.tipo_codigo_fk = 2
      AND u.usua_codigo_pk NOT IN (109, 55, 10, 33, 9)
      AND (u.usua_cargo IS NULL OR u.usua_cargo NOT LIKE '%FUNDACITE%')
      $concatenar
    ORDER BY u.usua_nombre
";
*/
$sql = "
    SELECT
        CONCAT(u.usua_documento, ' - ', u.usua_nombre, ' ', u.usua_apellido) AS analista,
        u.usua_codigo_pk,
        u.usua_documento,
        u.usua_nombre,
        u.usua_apellido,
        u.usua_habilitado,
        pu.*,
        p.perf_codigo_pk,
        p.tipo_codigo_fk
    FROM sidcai_usuario u
    INNER JOIN sidcai_perfil_usuario pu ON u.usua_codigo_pk = pu.usua_codigo_fk
    JOIN sidcai_perfil p ON pu.perf_codigo_fk = p.perf_codigo_pk
    WHERE u.usua_habilitado = true
      AND p.tipo_codigo_fk = 2
      AND u.usua_codigo_pk NOT IN (109, 55, 10, 33, 9)
      $concatenar
    ORDER BY u.usua_nombre
";


    $ciiu = Yii::app()->db->createCommand($sql)->queryAll();
    return CHtml::listData($ciiu, 'usua_codigo_pk', 'analista');
}

}
