<?php /**
 * This is the model class for table "sidcai_aportante".
 *
 * The followings are the available columns in table 'sidcai_aportante':
 * @property integer $apor_codigo_pk
 * @property string $apor_razonsocial
 * @property string $apor_denominacion
 * @property string $apor_direccion
 * @property integer $esta_codigo_fk
 * @property integer $muni_codigo_fk
 * @property integer $parr_codigo_fk
 * @property string $apor_zonapostal
 * @property string $apor_telefono1
 * @property string $apor_telefono2
 * @property string $apor_fax
 * @property string $apor_celular
 * @property string $apor_actividadeconomica
 * @property string $apor_mescierre
 * @property string $apor_fechahoraregistro
 * @property string $apor_fechahoraestatus
 * @property string $apor_fechahoramodif
 * @property integer $repr_codigo_fk
 * @property integer $ciiu_codigo_fk
 * @property integer $esta_codigoestatus_fk
 * @property string $apor_ciudad
 * @property string $apor_diacierre
 * @property string $apor_rif
 * @property string $apor_correoelectronico
 * @property string $apor_paginaweb
 * @property integer $audit_usua
 * @property integer $apor_tipoempresa
 * @property integer $apor_origenempresa
 * @property integer $tipo_codigo_fk
 * @property string $apor_otrastecnologias
 * @property string $apor_twitter
 * @property string $apor_pin
 * @property string $apor_instagram
 * @property string $apor_facebook
 * @property string $apor_fechacreacionempresa
 * @property string $apor_contrasena
 * @property string $apor_habilitado
 * @property string $apor_cambiocontrasena
 *
 * The followings are the available model relations:
 * @property SidcaiCiiu $ciiuCodigoFk
 * @property SidcaiEstado $estaCodigoFk
 * @property SidcaiMunicipio $muniCodigoFk
 * @property SidcaiParroquia $parrCodigoFk
 * @property SidcaiRepresentantelegal $reprCodigoFk
 * @property SidcaiEstatus $estaCodigoestatusFk
 * @property SidcaiTipotecnologia $tipoCodigoFk
 * @property SidcaiDeclaracioncti[] $sidcaiDeclaracionctis
 * @property SidcaiCitaaportante[] $sidcaiCitaaportantes
 * @property SidcaiConsulta[] $sidcaiConsultas
 * @property SidcaiPrestamosExpedientes[] $sidcaiPrestamosExpedientes
 * @property SidcaiProyectoaportante[] $sidcaiProyectoaportantes
 * @property SidcaiUsuario[] $sidcaiUsuarios
 */
class SidcaiAportante extends CActiveRecord{

	public $tipo_documento; // Para guardar J|G|V|E, es utilizado en modificar por el Admin.
	public $repetir_correo;

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

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

	/**
	 * @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(
				'apor_razonsocial, apor_direccion, esta_codigo_fk, muni_codigo_fk, parr_codigo_fk, apor_telefono1, apor_mescierre, apor_fechahoraregistro, ciiu_codigo_fk, apor_ciudad, apor_diacierre, apor_rif, apor_correoelectronico, apor_tipoempresa, apor_fechacreacionempresa, apor_zonapostal, apor_denominacion', 
				'required',
				'message' => 'Este campo es requerido.',
			),
			array(
				'apor_razonsocial, apor_direccion, esta_codigo_fk, muni_codigo_fk, parr_codigo_fk, apor_telefono1, apor_mescierre, apor_fechahoraregistro, ciiu_codigo_fk, apor_ciudad, apor_diacierre, apor_rif, apor_correoelectronico, apor_tipoempresa, apor_fechacreacionempresa, apor_zonapostal, apor_denominacion', 
				'filter',
				'filter' => 'trim',
			),		
			array(
				'tipo_documento',
				'required',
				'message' => 'Este campo es requerido.',
				'on' => 'modificar',
			),
			array(
				'tipo_documento',
				'filter',
				'filter' => 'trim'
			),

			array(
				'apor_correoelectronico',
				'length',
				'min' => 4,
				'tooShort' => 'Mínimo 4 caracteres.'
			),
			array(
				'apor_razonsocial, apor_denominacion, apor_direccion',
				'length',
				'min' => 3,
				'tooShort' => 'Mínimo 3 caracteres',
				'max' => 255,
				'tooLong' => 'Máximo 255 caracteres'
			),
			array(
				'apor_ciudad',
				'length',
				'min' => 3,
				'tooShort' => 'Mínimo 3 caracteres.',
				'max' => 30,
				'tooLong' => 'Máximo 30 caracteres.'
			),
			array(
				'apor_telefono1, apor_telefono2', 
				'length', 
				'min' => 11,
				'tooShort' => 'Número de teléfono incorrecto.',
				'max' => 11,
				'tooLong' => 'Número de teléfono incorrecto.'
			),
			array(
				'apor_zonapostal',
				'length', 
				'min' => 4,
				'tooShort' => 'Mínimo 4 digitos.',
				'max' => 4,
				'tooLong' => 'Máximo 4 digitos.'
			),
			array(
				'apor_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(
				'esta_codigo_fk, muni_codigo_fk, parr_codigo_fk, apor_telefono1, apor_telefono2, apor_diacierre, apor_mescierre, ciiu_codigo_fk, repr_codigo_fk, esta_codigoestatus_fk, audit_usua, apor_tipoempresa, tipo_codigo_fk, apor_zonapostal', 
				'numerical', 
				'integerOnly' => true,
				'message' => 'Solo se permiten números.'
			),
			// Válida que el tipo de documento sea solo "JGVE".
			array(
				'tipo_documento', 
				'match', 
				'pattern' => '/^([JGVE]){1}$/',
				'message' => 'El Tipo de Documento es incorrecto.'
			),
			/***	Inicio Validaciones al RIF	***/
			array(
				'apor_rif', 
				'match', 
				'pattern' => '/^([JGVE])?[0-9]{9}$/',
				'message' => 'El RIF no es válido.'
			),
			array(
				'apor_rif',
				'length',
				'min' => 9,
				'tooShort' => 'El RIF no es válido.',
			),
			array(
				'apor_rif', 
				'existeRIF',
				'on' => 'agregar'
			),
			array(
				'apor_correoelectronico',
				'existeCorreo',
				'on' => 'agregar',
			),

			array(
				'apor_rif', 
				'existeRIFmodificar',
				'on' => 'modificar'
			),
			/***	FIN Validaciones al RIF	***/


			// Validar repetir correo en registro
			array(
				'repetir_correo',
				'required',
				'message' => 'Este campo es requerido.',
				'on' => 'agregar'
			),
			array(
				'repetir_correo',
				'validarRepetirCorreo',
				'on' => 'agregar'
			),
			
			array(
				'repr_codigo_fk', 
				'existeIdRepresentante'
			),
			array(
				'apor_tipoempresa, ciiu_codigo_fk',
				'required',
				'message' => 'Este campo es requerido',
				'on' => 'empresa-ciiu'
			),
			array(
				'apor_diacierre, apor_mescierre',
				'required',
				'message' => 'Este campo es requerido.',
				'on' => 'modificar_fiscal'
			),
			array(
				'apor_diacierre, apor_mescierre',
				'verificarCierreFiscal',
				'on' => 'modificar_fiscal'
			),
			array(
				'apor_otrastecnologias', 
				'length', 
				'max'=>150
			),
			array(
				'apor_denominacion, apor_telefono2, apor_fax, apor_celular, apor_paginaweb, apor_twitter, apor_instagram, apor_facebook', 
				'safe'
			),	


			/** Validar cambio de clave **/
			array(
				'contrasena_actual, contrasena_nueva, repetir_contrasena',
				'required',
				'message' => 'Este campo es requerido.',
				'on' => 'cambioClave'
			),	
			/*** 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'
			),
			array(
				'contrasena_nueva',
				'match',
				'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'
			),	
		);
	}

	/**
	 * @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(
			'ciiuCodigoFk' => array(self::BELONGS_TO, 'SidcaiCiiu', 'ciiu_codigo_fk'),
			'estaCodigoFk' => array(self::BELONGS_TO, 'SidcaiEstado', 'esta_codigo_fk'),
			'muniCodigoFk' => array(self::BELONGS_TO, 'SidcaiMunicipio', 'muni_codigo_fk'),
			'parrCodigoFk' => array(self::BELONGS_TO, 'SidcaiParroquia', 'parr_codigo_fk'),
			'reprCodigoFk' => array(self::BELONGS_TO, 'SidcaiRepresentantelegal', 'repr_codigo_fk'),
			'estaCodigoestatusFk' => array(self::BELONGS_TO, 'SidcaiEstatus', 'esta_codigoestatus_fk'),
			'sidcaiDeclaracionctis' => array(self::HAS_MANY, 'SidcaiDeclaracioncti', 'apor_codigo_fk'),
		);
	}

	/**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels(){
        return array(
            'apor_codigo_pk' 	=> 'Código SIDCAI',
            'apor_razonsocial' 	=> 'Razón social',
            'apor_denominacion' => 'Denominación comercial',
            'apor_direccion' 	=> 'Dirección',
            'esta_codigo_fk' 	=> 'Estado',
            'muni_codigo_fk' 	=> 'Municipio',
            'parr_codigo_fk' 	=> 'Parroquia',
            'apor_zonapostal'	=> 'Zona postal',
            'apor_telefono1' 	=> 'Teléfono 1',
            'apor_telefono2' 	=> 'Teléfono 2',
            'apor_fax' 			=> 'Apor Fax',
            'apor_celular' 		=> 'Celular',
            'apor_mescierre' 	=> 'MES',
            'apor_rif' 			=> 'RIF',
            'audit_usua' 		=> 'Usuario Auditor',
            'apor_facebook' 	=> 'Apor Facebook',
            'ciiu_codigo_fk' 	=> 'Código CIIU',
            'repr_codigo_fk' 	=> 'Código Representante',
            'apor_ciudad' 		=> 'Ciudad',
            'apor_diacierre' 	=> 'Día',
            'apor_paginaweb' 	=> 'Apor Paginaweb',
            'apor_tipoempresa' 	=> 'Tipo de empresa',
            'tipo_codigo_fk' 	=> 'Tipo Codigo Fk',
            'apor_twitter' 		=> 'Apor Twitter',
            'apor_pin' 			=> 'Apor Pin',
            'apor_instagram' 	=> 'Apor Instagram',
            'tipo_documento' 	=> 'Tipo Documento',
            'apor_actividadeconomica' 	=> 'Actividad económica',
            'apor_fechahoraregistro' 	=> 'Fecha de registro',
            'apor_fechahoraestatus' 	=> 'Apor Fechahoraestatus',
            'apor_fechahoramodif'		=> 'Fecha de modificación',
            'esta_codigoestatus_fk' 	=> 'Estatus',
            'apor_correoelectronico' 	=> 'Correo electrónico',
            'apor_origenempresa' 		=> 'Apor Origenempresa',
            'apor_otrastecnologias' 	=> 'Apor Otrastecnologias',
            'apor_fechacreacionempresa' => 'Fecha de incripción del RIF',
            'apor_contrasena'			=> 'Contraseña',
            'apor_habilitado'			=> 'Habilitado',
            'apor_cambiocontasena'		=> 'Cambio de contraseña',
            'repetir_correo'			=> 'Repetir correo electrónico',
        );
    }

	/**
	 * 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 SidcaiAportante the static model class
	 */
	public static function model($className=__CLASS__){
		return parent::model($className);
	}

	// Funcion para verificar que no exista un Aportante con el mismo número de documento al registrar.
	public function existeRIF(){
		$rif = $this->tipo_documento.$this->apor_rif;

		if($rif != ""){
			$aportante = SidcaiAportante::model()->find('apor_rif = :apor_rif', array(':apor_rif' => $rif));

			if($aportante != null){
				$this->addError('apor_rif', 'El RIF ' .$rif. ' ya se encuentra registrado en el sistema.');
			}
		}
	}

	/* Si el documento que está guardado en la Base de Datos es distinto al que se quiere editar que compruebe que no exista otro registro con el mismo documento. */
	public function existeRIFmodificar(){
		$rif = $this->tipo_documento.$this->apor_rif;

		$original = SidcaiAportante::model()->findByPk($this->apor_codigo_pk);
		$nuevo = SidcaiAportante::model()->find('apor_rif = :apor_rif', array(':apor_rif' => $rif ));

		if($nuevo != null){
			if($nuevo->apor_rif != $original->apor_rif)
				$this->addError('apor_rif', $rif. ' ya se encuentra registrado.');
		}
	}

	/**
	 * Valida que el id ingresado en el campo del Representante Legal exista en la BD.
	 */
	public function existeIdRepresentante(){
		if($this->repr_codigo_fk != ""){
			$representante = SidcaiRepresentantelegal::model()->findByPk($this->repr_codigo_fk);

			if($representante == null)
				$this->addError('repr_codigo_fk', "No existe ningún Representante Legal con el código $this->repr_codigo_fk.");
		}
	}

	/**
	 * Verifica que solo existe un correo por empresa
	 */
	public function existeCorreo(){
		if($this->apor_correoelectronico != ""){
			$correo = mb_strtoupper($this->apor_correoelectronico)."@GMAIL.COM";
			$empresa = SidcaiAportante::model()->find('apor_correoelectronico = :apor_correoelectronico', [':apor_correoelectronico' => $correo]);

			if($empresa != null){
				$this->addError('apor_correoelectronico', 'El correo electrónico ya se encuentra registrado.');
			}
		}
	}

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

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

	// Verifica que el día de cierre cumple con el mes, es decir, noviembre solo tiene 30 días entonces no puede aceptar 31
	public function verificarCierreFiscal(){
		$array_mes = [
			1 => 31,
			2 => 28,
			3 => 31,
			4 => 30,
			5 => 31,
			6 => 30,
			7 => 31,
			8 => 31,
			9 => 30,
			10 => 31,
			11 => 30,
			12 => 31,
		];

		foreach($array_mes as $key => $value){
			if($key == $this->apor_mescierre){
				if($this->apor_diacierre > $value){
					$this->addError('apor_mescierre', 'El mes no posee '.$this->apor_diacierre.' días.');
					break;
				}
			}
		}
	}


	// Valida que en el registro el correo electrónico sea el correcto en los dos campos.
	public function validarRepetirCorreo(){
		if($this->apor_correoelectronico != ""){
			if($this->apor_correoelectronico != $this->repetir_correo)
				$this->addError('repetir_correo', 'El correo electrónico no coincide.');
		}else{
			$this->addError('repetir_correo', 'El correo electrónico no coincide.');
		}
	}
}