<?php

/**
 * This is the model class for table "prestamos.tipo_credito".
 *
 * The followings are the available columns in table 'prestamos.tipo_credito':
 * @property integer $id
 * @property string $descripcion
 * @property integer $duracion_credito
 * @property integer $tiempo_asociado
 * @property string $taza_interes
 * @property boolean $afecta_disponibilidad_haberes
 * @property string $monto_minimo_credito
 * @property string $monto_maximo_credito
 * @property string $fecharegistro
 * @property string $id_usuario
 * @property boolean $blnborrado
 * @property integer $publicar
 * @property boolean $refinanciamiento
 * @property string $porcentaje_refinanciamiento
 * @property integer $cuotas_canceladas_refinanciamiento
 *
 * The followings are the available model relations:
 * @property TipoCreditoGastosAdministrativo[] $tipoCreditoGastosAdministrativos
 */
class TipoCredito extends CActiveRecord
{
    public $gastos_administrativo,$periodicidad,$cuotasEspeciales;
    public $descuento_gastos_administrativo = 1;
    public $id_refinanciamiento_seleccionados, $id_reestructuracion_seleccionados;

    public $monto_bloqueo_haberes_administrador, $porcentaje_bloqueo_haberes_administrador, $opcion_haberes_administrador =1;
    public $monto_bloqueo_haberes_asociado, $porcentaje_bloqueo_haberes_asociado, $opcion_haberes_asociado =1;
    public $mostrar_bloqueo_anticipado;

	/**
	 * @return string the associated database table name
	 */
	public function tableName()
	{
		return 'prestamos.tipo_credito';
	}

	/**
	 * @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('descripcion,id_titulo_tipo_credito, tiempo_asociado, taza_interes, gastos_administrativo,duracion_credito,
                id_clasificacion_tipo_credito, metodo_liberacion_capital,id_tipo_cobro', 'required','on'=>'Registro,RegistroCuotasEspeciales'),
            array('porcentaje_cuotas_especiales', 'required','on'=>'RegistroCuotasEspeciales'),
            array('capacidad_pago_porcentaje, taza_interes,monto_minimo_credito,porcentaje_cancelado, monto_maximo_credito,porcentaje_refinanciamiento ', 'match',  //PARA VALIDAR CAMPOS CON FORMATO MONEDA
					'pattern' => '/^[0-9]\d{0,2}(\.[0-9]\d{2,2})*(\,\d{1,2})?$/',
 					'message' => 'El valor del campo debe tener un formato 100,00',),
            array('gastos_administrativo,porcentaje_cuotas_especiales, porcentaje_disponibilidad', 'match',  //PARA VALIDAR CAMPOS CON FORMATO MONEDA
					'pattern' => '/^[0-9]\d{0,2}(\.[0-9]\d{2,2})*(\,\d{1,3})?$/',
 					'message' => 'El valor del campo debe tener un formato 100.000,000',),
			array('porcentaje_cuotas_especiales,capacidad_pago_porcentaje', 'length', 'max'=>5),
			array('gastos_administrativo', 'validarGastoAdministrativo'),
			array('duracion_credito, tiempo_asociado, publicar, cuotas_canceladas_refinanciamiento, tiempo_retiro_parcial, tiempo_retiro_parcial_administrador', 'numerical', 'integerOnly'=>true),
			//array('taza_interes, porcentaje_refinanciamiento', 'length', 'max'=>5),
			array('monto_minimo_credito, monto_maximo_credito', 'validarMonto'),
			array('opcion_haberes_administrador, opcion_haberes_asociado', 'validarPorcentaje'),
			//array('monto_minimo_credito, monto_maximo_credito', 'length', 'max'=>10),
			array('id, monto_bloqueo_haberes_administrador, porcentaje_bloqueo_haberes_administrador, opcion_haberes_administrador,'.
					'monto_bloqueo_haberes_asociado, porcentaje_bloqueo_haberes_asociado,  opcion_haberes_asociado,'.
					'metodo_calculo_garantia_afianzadora,bloquea_pago,reestructuracion, porcentaje_reestructuracion,'.
					' metodo_calculo_garantia_monto_gasto,publicar_tienda_virtual, prela_tienda_virtual, porcentaje_cuotas_especiales,'.
					'capacidad_pago_porcentaje,metodo_calculo_garantia_afianzadora,generar_tabla_cuotas_especiales, descontar_grantia_afianzadora, '.
					'descripcion,id_titulo_tipo_credito, afecta_disponibilidad_haberes,porcentaje_cancelado, porcentaje_refinanciamiento, '.
					'capacidad_pago_sueldo_aporte, id_clasificacion_tipo_credito,numero_haberes_disponible, porcentaje_disponibilidad, '.
					'tiempo_retiro_parcial,tiempo_retiro_parcial_administrador, credito_ordinario,  id_usuario, blnborrado, refinanciamiento,'.
					'gastos_administrativo,periodicidad,cuotasEspeciales, descuento_gastos_administrativo, metodo_liberacion_capital, id_tipo_cobro, '.
					'publicar_credito_administrador,id_refinanciamiento_seleccionados, id_reestructuracion_seleccionados, bloqueo_anticipado_prestamos', 'safe'),
			// The following rule is used by search().
			// @todo Please remove those attributes that should not be searched.
			array('id, descripcion,bloquea_pago, duracion_credito,id_titulo_tipo_credito, porcentaje_cancelado, tiempo_asociado,capacidad_pago_sueldo_aporte,
                id_clasificacion_tipo_credito, numero_haberes_disponible, taza_interes,credito_ordinario, afecta_disponibilidad_haberes, monto_minimo_credito,
                monto_maximo_credito, fecharegistro, id_usuario, blnborrado, publicar, refinanciamiento, porcentaje_refinanciamiento, cuotas_canceladas_refinanciamiento', 'safe', 'on'=>'search'),
		);
	}

	/**
	 * @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(
			'tipoCreditoGastosAdministrativos' => array(self::HAS_MANY, 'TipoCreditoGastosAdministrativo', 'id_tipo_credito'),
			'solicitudes' => array(self::HAS_MANY, 'PeriodicidadTipoCredito', 'id_tipo_credito'),
			'idCuotasEspeciales' => array(self::HAS_MANY, 'TipoCreditoCuotasEspeciales', 'id_tipo_credito'),
            'idClasificacionTipoCredito' => array(self::BELONGS_TO, 'ClasificacionTipoCredito', 'id_clasificacion_tipo_credito'),
            'idTituloTipoCredito' => array(self::BELONGS_TO, 'TituloTipoCredito', 'id_titulo_tipo_credito'),
            'tipoCreditoCapacidadPagos' => array(self::HAS_MANY, 'TipoCreditoCapacidadPago', 'id_tipo_credito','condition'=>'solicitar_concepto = true','order'=>'asignacion desc'),
            'idTipoCobro' => array(self::BELONGS_TO, 'TipoCobro', 'id_tipo_cobro'),
		);
	}

	/**
	 * @return array customized attribute labels (name=>label)
	 */
	public function attributeLabels()
	{
		return array(
			'id' => 'ID',
			'descripcion' => 'Descripción',
			'duracion_credito' => 'Duración del préstamo',
			'tiempo_asociado' => 'Tiempo como asociado',
			'taza_interes' => 'Tasa de interes',
			'afecta_disponibilidad_haberes' => 'Afecta la disponibilidad de haberes',
			'monto_minimo_credito' => 'Monto minimo a solicitar',
			'monto_maximo_credito' => 'Monto máximo a solicitar',
			'fecharegistro' => 'Fecha de registro',
			'id_usuario' => 'Id Usuario',
			'blnborrado' => 'Blnborrado',
			'publicar' => 'Publico',
			'refinanciamiento' => 'Refinanciamiento',
			'porcentaje_refinanciamiento' => 'Porcentaje de refinanciamiento',
			'cuotas_canceladas_refinanciamiento' => 'Cuotas canceladas refinanciamiento',
			'porcentaje_disponibilidad' => '% sobre disponible de <solicitudes></solicitudes>',
			'descontar_grantia_afianzadora' => 'Descuento de la garantia (Afianzadora)',
			'credito_ordinario' => 'Préstamo ordinario',
			'tiempo_retiro_parcial' => 'Tiempo de solicitud de retiro parcial (Sol. asociado)',
			'tiempo_retiro_parcial_administrador' => 'Tiempo de solicitud de retiro parcial (Sol. administrador)',
			'porcentaje_cancelado' => 'Porcentaje cancelado',
			'id_titulo_tipo_credito' => 'Categoría general del prestamo',
			'porcentaje_cuotas_especiales' => 'Porcentaje total para cuotas especiales',
			'capacidad_pago_porcentaje' => 'Porcentaje de la capacidad de pago',
			'metodo_calculo_garantia_afianzadora' => 'Método para la evaluación de la garantia a la afianzadora',
			'id_tipo_cobro' => 'Tipo de cobro',
			'publicar_credito_administrador' => 'Publicar en solicitudes por administrador',
            'monto_bloqueo_haberes_administrador' => 'Monto bloqueo administrador',
            'porcentaje_bloqueo_haberes_administrador' => 'Porcentaje bloqueo administrador',
            'monto_bloqueo_haberes_asociado' => 'Monto bloqueo asociado',
            'porcentaje_bloqueo_haberes_asociado' => 'Porcentaje bloqueo asociado',
            'mostrar_bloqueo_anticipado_administrador' => 'Mostrar bloqueo anticipado administrador',
            'mostrar_bloqueo_anticipado_asociado' => 'Mostrar bloqueo anticipado asociado',
		);
	}
        public function validarMonto($attributes){

            if(!$this->hasErrors($attributes)){
                $monto = strstr($this->$attributes, ',',true);
                if($monto){
                    if(strlen($monto)>12)
                    $this->addError($attributes,'El monto no es permitido');
                }
                else{
                    if(strlen($this->$attributes)>12)
                        $this->addError($attributes,'El monto no es permitido');
                }

            }
        }
        public function validarGastoAdministrativo(){
            if(!$this->hasErrors('gastos_administrativo')){
                //valida que delante de la "," solo posea 1 solo 0
                $validarPorcentaje = strstr($this->gastos_administrativo, ',',true);
                if(strlen($validarPorcentaje)>1){
                    if($validarPorcentaje <10)
                        $this->addError('gastos_administrativo','el monto ingresado es incorrecto. <br>formato para representar:<br><ul><li> "miles":1.000,000</li><li>"decimales":0,000</li></ul>');
                }
                //valida que delante del "." sea mayor que 0
                $validarMiles = strstr($this->gastos_administrativo, '.',true);
                if(strlen($validarMiles)>0){
                    if($validarMiles <1)
                        $this->addError('gastos_administrativo','el monto ingresado es incorrecto. <br>formato para representar:<br><ul><li> "miles":1.000,000</li><li>"decimales":0,000</li></ul>');
                }
            }
        }

	/**
	 * Retrieves a list of models based on the current search/filter conditions.
	 *
	 * Typical usecase:
	 * - Initialize the model fields with values from filter form.
	 * - Execute this method to get CActiveDataProvider instance which will filter
	 * models according to data in model fields.
	 * - Pass data provider to CGridView, CListView or any similar widget.
	 *
	 * @return CActiveDataProvider the data provider that can return the models
	 * based on the search/filter conditions.
	 */
	public function search()
	{
		// @todo Please modify the following code to remove attributes that should not be searched.

		$criteria=new CDbCriteria;

                if(!is_numeric($this->duracion_credito)){
                    $this->duracion_credito = null;
                }
                if(!is_numeric($this->tiempo_asociado)){
                    $this->tiempo_asociado = null;
                }
                if(!is_numeric($this->taza_interes)){
                    $this->taza_interes = null;
                }
		$criteria->compare('id',$this->id);
		$criteria->compare('UPPER(descripcion)',  strtoupper($this->descripcion),true);
		$criteria->compare('duracion_credito',$this->duracion_credito);
		$criteria->compare('tiempo_asociado',$this->tiempo_asociado);
		$criteria->compare('taza_interes',$this->taza_interes);
		$criteria->compare('afecta_disponibilidad_haberes',$this->afecta_disponibilidad_haberes);
		$criteria->compare('monto_minimo_credito',$this->monto_minimo_credito);
		$criteria->compare('monto_maximo_credito',$this->monto_maximo_credito);
		$criteria->compare('fecharegistro',$this->fecharegistro,true);
		$criteria->compare('id_usuario',$this->id_usuario,true);
		$criteria->compare('blnborrado',$this->blnborrado);
		$criteria->compare('publicar',$this->publicar);
		$criteria->compare('refinanciamiento',$this->refinanciamiento);
		$criteria->compare('porcentaje_refinanciamiento',$this->porcentaje_refinanciamiento,true);
		$criteria->compare('cuotas_canceladas_refinanciamiento',$this->cuotas_canceladas_refinanciamiento);
		$criteria->compare('credito_ordinario',$this->credito_ordinario);
		$criteria->compare('id_titulo_tipo_credito',$this->id_titulo_tipo_credito);

		return new CActiveDataProvider($this, array(
			'criteria'=>$criteria,
		));
	}
	public function searchPrestamoRetiro()
	{
		// @todo Please modify the following code to remove attributes that should not be searched.

		$criteria=new CDbCriteria;

                if(!is_numeric($this->duracion_credito)){
                    $this->duracion_credito = null;
                }
                if(!is_numeric($this->tiempo_asociado)){
                    $this->tiempo_asociado = null;
                }
                if(!is_numeric($this->taza_interes)){
                    $this->taza_interes = null;
                }
		$criteria->compare('id',$this->id);
		$criteria->compare('UPPER(descripcion)',  strtoupper($this->descripcion),true);
		$criteria->compare('duracion_credito',$this->duracion_credito);
		$criteria->compare('tiempo_asociado',$this->tiempo_asociado);
		$criteria->compare('taza_interes',$this->taza_interes);
		$criteria->compare('afecta_disponibilidad_haberes',$this->afecta_disponibilidad_haberes);
		$criteria->compare('monto_minimo_credito',$this->monto_minimo_credito);
		$criteria->compare('monto_maximo_credito',$this->monto_maximo_credito);
		$criteria->compare('fecharegistro',$this->fecharegistro,true);
		$criteria->compare('id_usuario',$this->id_usuario,true);
		$criteria->compare('blnborrado',$this->blnborrado);
		$criteria->compare('publicar',$this->publicar);
		$criteria->compare('refinanciamiento',$this->refinanciamiento);
		$criteria->compare('porcentaje_refinanciamiento',$this->porcentaje_refinanciamiento,true);
		$criteria->compare('cuotas_canceladas_refinanciamiento',$this->cuotas_canceladas_refinanciamiento);
		$criteria->compare('credito_ordinario',$this->credito_ordinario);
		$criteria->compare('id_titulo_tipo_credito',$this->id_titulo_tipo_credito);

		return new CActiveDataProvider($this, array(
			'criteria'=>$criteria,
		));
	}
	public function searchTitulo($id = null)
	{
		// @todo Please modify the following code to remove attributes that should not be searched.

		$criteria=new CDbCriteria;

                if(!is_numeric($this->duracion_credito)){
                    $this->duracion_credito = null;
                }
                if(!is_numeric($this->tiempo_asociado)){
                    $this->tiempo_asociado = null;
                }
                if(!is_numeric($this->taza_interes)){
                    $this->taza_interes = null;
                }
		$criteria->compare('id',$this->id);
		$criteria->compare('UPPER(descripcion)',  strtoupper($this->descripcion),true);
		$criteria->compare('duracion_credito',$this->duracion_credito);
		$criteria->compare('tiempo_asociado',$this->tiempo_asociado);
		$criteria->compare('taza_interes',$this->taza_interes);
		$criteria->compare('afecta_disponibilidad_haberes',$this->afecta_disponibilidad_haberes);
		$criteria->compare('monto_minimo_credito',$this->monto_minimo_credito);
		$criteria->compare('monto_maximo_credito',$this->monto_maximo_credito);
		$criteria->compare('fecharegistro',$this->fecharegistro,true);
		$criteria->compare('id_usuario',$this->id_usuario,true);
		$criteria->compare('blnborrado',$this->blnborrado);
		$criteria->compare('publicar',$this->publicar);
		$criteria->compare('refinanciamiento',$this->refinanciamiento);
		$criteria->compare('porcentaje_refinanciamiento',$this->porcentaje_refinanciamiento,true);
		$criteria->compare('cuotas_canceladas_refinanciamiento',$this->cuotas_canceladas_refinanciamiento);
		$criteria->compare('credito_ordinario',$this->credito_ordinario);
		if(!is_null($id))
				$criteria->compare('id_titulo_tipo_credito',$id);

		return new CActiveDataProvider($this, array(
			'criteria'=>$criteria,
		));
	}



        public static function validarSolcitudPrestamoUsuario($idAsociado, $visualizarOrdinario=false){
            $validacion=$tipoCredito = array();
            $mensaje='';
            $valido = true;
            $tipoCredito = array();
            $modelAsociado = Asociado::model()->findByPk($idAsociado);
            $model =  self::model()->findAll(' publicar = TRUE AND blnborrado = false ');

            if($model){
                foreach ($model AS $key =>$value){
                   // if($value->credito_ordinario ==$visualizarOrdinario)
                        $tipoCredito = self::model()->validarTipoCreditoOrdinarias($value, $tipoCredito,$modelAsociado);
                }
            }
            else{
                 $tipoCredito['mensaje']='<b>Lo sentimos en la actualidad no se encuentran préstamo habilitados...</b><br/> ';
            }
            if(!array_key_exists('mensaje',$tipoCredito)){
                $tipoCredito['mensaje'] = '';
            }

            $validacion ['valido']=$valido;
            $validacion ['mensaje']=$tipoCredito['mensaje'];
            $validacion ['tipo_credito']=(array_key_exists('tipo_credito',$tipoCredito))?$tipoCredito['tipo_credito']:NULL;

            return $validacion;
        }

    public function validarTipoCreditoOrdinarias($model, $tipo = [], $modelAsociado, $creditoOrdinario = false)
    {
        $valido = true;
        $mensaje = '';
        //validamos el tiempo de antiguedad que tenga un asociado en la caja de ahorro
        if ($model->tiempo_asociado > 0) {
            if ($model->tiempo_asociado > $modelAsociado->validacionTiempoAsociado()) {
                $valido = false;
                $mensaje .=
                    '<b>No tiene el tiempo de '.
                    $model->tiempo_asociado.
                    ' meses, necesario para optar a un préstamo...</b><br/> ';
            }
        }
        //validamos que no tenga retiro parcial aprobado
        //si posee un retiro parcial, debe de tener como minimo 6 meses de haberlos pedido
        $modelEstatusRetiroParcial = EstatusRetiroParcial::model()
            ->with('idRetiroParcial')
            ->find([
                'condition' => 'idasociado=:id AND actual =  TRUE AND id_estatus_retiro = 1',
                'params' => [':id' => $modelAsociado->idasociado],
                'order' => 'id_retiro_parcial desc',
            ]);

        if ($modelEstatusRetiroParcial) {
            $valido = false;
            $mensaje .=
                '<b>Usted posee una solicitud de retiro parcial,en espera de aprobación, realizado el día '.
                date('d-m-Y', strtotime($modelEstatusRetiroParcial->fecha_registro)).
                '</b></br> ';
        }
        unset($modelEstatusRetiroParcial);
        $modelEstatusRetiroParcial = EstatusRetiroParcial::model()
            ->with('idRetiroParcial')
            ->find([
                'condition' => 'idasociado=:id AND actual =  TRUE AND id_estatus_retiro in(2,4)',
                'params' => [':id' => $modelAsociado->idasociado],
                'order' => 'id_retiro_parcial desc',
            ]);

        if ($modelEstatusRetiroParcial) {
            if ($model->tiempo_retiro_parcial != '') {
                if (
                    self::model()->diferenciaTiempoMeses([
                        'fecha_inicio' => $modelEstatusRetiroParcial->fecha_registro,
                    ]) < $model->tiempo_retiro_parcial
                ) {
                    $valido = false;
                    $mensaje .=
                        '<b>Posee un retiro parcial aprobado ó pagado el '.
                        date('d-m-Y', strtotime($modelEstatusRetiroParcial->fecha_registro)).
                        ', debe de esperar '.
                        $model->tiempo_retiro_parcial.
                        ' meses para solicitud de préstamo</b></br> ';
                }
            }
        }
        //validamos que no tenga un liquidacion aprobada
        $modelLiquidacion = EstatusLiquidacion::model()
            ->with('idLiquidacion')
            ->find('idasociado=:idasociado AND actual = true AND id_estatus_liquidacion !=3', [
                ':idasociado' => $modelAsociado->idasociado,
            ]);
        if ($modelLiquidacion) {
            $valido = false;
            $mensaje .=
                '<b>Usted posee una SOLICITUD de  liquidación'.
                ($modelLiquidacion->id_estatus_liquidacion != 1
                    ? ' "'.$modelLiquidacion->idEstatusLiquidacion->nombre_estatus.'"'
                    : '').
                ', realizada el día '.
                date('d-m-Y', strtotime($modelLiquidacion->fecha_registro)).
                '</b></br>';
        }
        $modelPrestamos = ReporteCreditos::model()->find(
            'idasociado=:idasociado AND id_estatus_credito in (1,4,6,8) and id_tipo_credito=:id_tipo_credito',
            [':idasociado' => $modelAsociado->idasociado, ':id_tipo_credito' => $model->id]
        );
        if ($modelPrestamos) {
            //AND id_estatus_credito NOT IN (3,5)
            if (
                $modelPrestamos->id_estatus_credito == 1 ||
                $modelPrestamos->id_estatus_credito == 6 ||
                $modelPrestamos->id_estatus_credito == 8
            ) {
                $valido = false;
                $mensaje .=
                    '<b>Ud posee un préstamo SOLICITADO el dia '.
                    date('d-m-Y', strtotime($modelPrestamos->fecha_registro)).
                    ', deberá esperar a que sea aprobado ó denegado</b></br>';
            } elseif (
                ($modelPrestamos->id_estatus_credito == 2 || $modelPrestamos->id_estatus_credito == 4) &&
                $creditoOrdinario
            ) {
                $porcentajeCancelado = round(
                    (100 * ($modelPrestamos->prestamo - $modelPrestamos->deuda_actual)) / $modelPrestamos->prestamo,
                    2
                );
                if ($porcentajeCancelado < $model->porcentaje_cancelado) {
                    $valido = false;
                    $mensaje .=
                        '<b>Ud posee un préstamo activo, ha cancelado el '.
                        $porcentajeCancelado.
                        '% del préstamo deberá esperar cancelar el '.
                        $model->porcentaje_cancelado.
                        '% o su totalidad </b></br>';
                }
            }
        }
        if ($model->creditos_permitidos != '') {
            $prestamosPermitidos = json_decode($model->creditos_permitidos, true);
            $idPrestamo = implode(',', array_keys($prestamosPermitidos));
            if ($idPrestamo != '') {
                $modelPrestamos = ReporteCreditos::model()->findAll(
                    'idasociado=:idasociado AND id_estatus_credito =4 AND id_tipo_credito IN('.$idPrestamo.')',
                    [':idasociado' => $modelAsociado->idasociado]
                );
                if ($modelPrestamos) {
                    foreach ($modelPrestamos as $key => $value) {
                        if (array_key_exists($value->id_tipo_credito, $prestamosPermitidos)) {
                            //verificar que este selecciona
                            $permitido = $prestamosPermitidos[$value->id_tipo_credito];
                            if ($permitido['opcionAs'] == 1) {
                                // calculando el porcentale cancelado
                                $porcentajeCancelado = round(
                                    (($value->prestamo - $value->deuda_actual) * 100) / $value->prestamo,
                                    2
                                );
                                if ($porcentajeCancelado < str_replace(',', '.', $permitido['porcentajeAs'])) {
                                    $valido = false;
                                    $mensaje .=
                                        '<b>Ud  debe haber cancelado el '.
                                        $permitido['porcentajeAs'].
                                        '% del préstamo "'.
                                        $value->nombre_titulo.
                                        ' '.
                                        $value->tipoCredito->descripcion.
                                        '" para poder optar para este plazo</b><br/>';
                                }
                            }
                        }
                    }
                }
            }
        }

        if ($valido) {
            $valido = self::model()->validarDisponibilidadDiaria($model) && $valido;
            if ($valido) {
                $tipo['tipo_credito'][$model->id] = $model->descripcion;
            } else {
                $mensaje .= '<b>No hay disponiblidad para solicitar préstamo</b><br/>';
            }
        }

        $tipo['mensaje'] = $mensaje;

        return $tipo;
    }

        public function validarTipoCreditoAdministrador($model, $tipo = array(), $modelAsociado, $creditoOrdinario = false) {
            $valido = true;
            $mensaje='';
            //validamos el tiempo de antiguedad que tenga un asociado en la caja de ahorro
            if ($model->tiempo_asociado > 0) {
                if ($model->tiempo_asociado > $modelAsociado->validacionTiempoAsociado()) {
                    $valido = false;
                    $mensaje.='<b>No tiene el tiempo de '.$model->tiempo_asociado.' meses, necesario para optar a un préstamo...</b><br/> ';
                }
            }
            //validamos que no tenga retiro parcial aprobado
            //si posee un retiro parcial, debe de tener como minimo 6 meses de haberlos pedido
            $modelEstatusRetiroParcial = EstatusRetiroParcial::model()->with('idRetiroParcial')->find(array('condition'=>'idasociado=:id AND actual =  TRUE AND id_estatus_retiro = 1',
                                                                                                            'params'=>array(':id'=>  $modelAsociado->idasociado),
                                                                                                            'order'=>'id_retiro_parcial desc'));

            if ($modelEstatusRetiroParcial) {
                 $valido = false;
                $mensaje.='<b>Usted posee una solicitud de retiro parcial,en espera de aprobación, realizado el día '.date('d-m-Y',strtotime($modelEstatusRetiroParcial->fecha_registro)).'</b></br> ';
            }
            unset($modelEstatusRetiroParcial);
            $modelEstatusRetiroParcial = EstatusRetiroParcial::model()->with('idRetiroParcial')->find(array('condition'=>'idasociado=:id AND actual =  TRUE AND id_estatus_retiro in(2,4)',
                                                                                                            'params'=>array(':id'=>  $modelAsociado->idasociado),
                                                                                                            'order'=>'id_retiro_parcial desc'));

            if ($modelEstatusRetiroParcial) {
                if($model->tiempo_retiro_parcial_administrador !=''){
                    if (self::model()->diferenciaTiempoMeses(array('fecha_inicio'=>$modelEstatusRetiroParcial->fecha_registro)) < $model->tiempo_retiro_parcial_administrador) {
                        $valido = false;
                        $mensaje.='<b>Posee un retiro parcial aprobado ó pagado el '.date('d-m-Y',strtotime($modelEstatusRetiroParcial->fecha_registro)).', debe de esperar '.$model->tiempo_retiro_parcial_administrador.' meses para solicitud de préstamo</b></br> ';
                    }
                }
            }
            //validamos que no tenga un liquidacion aprobada
            $modelLiquidacion=  EstatusLiquidacion::model()->with('idLiquidacion')->find('idasociado=:idasociado AND actual = true AND id_estatus_liquidacion !=3',array(':idasociado'=>$modelAsociado->idasociado));
            if ($modelLiquidacion) {
                $valido = false;
                $mensaje.='<b>Usted posee una SOLICITUD de  liquidación'.(($modelLiquidacion->id_estatus_liquidacion!=1)?' "'.$modelLiquidacion->idEstatusLiquidacion->nombre_estatus.'"':"").', realizada el día '. date('d-m-Y',  strtotime($modelLiquidacion->fecha_registro)).'</b></br>';
            }

            $modelPrestamos= ReporteCreditos::model()->find('idasociado=:idasociado AND id_estatus_credito in (1,4,6,8) and id_tipo_credito=:id_tipo_credito',array(':idasociado'=>$modelAsociado->idasociado,':id_tipo_credito'=>$model->id));
            if ($modelPrestamos) {
                //AND id_estatus_credito NOT IN (3,5)
                if($modelPrestamos->id_estatus_credito ==1 || $modelPrestamos->id_estatus_credito ==6 || $modelPrestamos->id_estatus_credito ==8){
                    $valido = false;
                    $mensaje.="<b>Ud posee un préstamo SOLICITADO el dia ".date('d-m-Y',  strtotime ($modelPrestamos->fecha_registro)).", deberá esperar a que sea aprobado ó denegado</b></br>";
                }
                elseif(($modelPrestamos->id_estatus_credito ==2 || $modelPrestamos->id_estatus_credito ==4) && $creditoOrdinario){

					$porcentajeCancelado = round((100* ($modelPrestamos->prestamo -$modelPrestamos->deuda_actual))/ ($modelPrestamos->prestamo),2);

                    if($porcentajeCancelado < $model->porcentaje_cancelado){
                        $valido = false;
                        $mensaje.="<b>Ud posee un préstamo activo, ha cancelado el ".$porcentajeCancelado ."% del préstamo deberá esperar cancelar el ".$model->porcentaje_cancelado."% o su totalidad </b></br>";

                    }

                }

            }

            if($model->creditos_permitidos !=''){
	            $prestamosPermitidos = json_decode($model->creditos_permitidos,true);
	            $idPrestamo= implode(',', array_keys($prestamosPermitidos));
	            if($idPrestamo !=''){
		            $modelPrestamos = ReporteCreditos::model()->findAll('idasociado=:idasociado AND id_estatus_credito =4 AND id_tipo_credito IN('.$idPrestamo.')',
		            											[':idasociado' => $modelAsociado->idasociado]);
			        if($modelPrestamos){
		                foreach ($modelPrestamos as $key => $value) {
		                    if(array_key_exists($value->id_tipo_credito, $prestamosPermitidos)){
		                        //verificar que este selecciona
		                        $permitido = $prestamosPermitidos[$value->id_tipo_credito];
		                        if($permitido['opcionAdm']== 1){
		                            // calculando el porcentale cancelado
		                            $porcentajeCancelado = round((($value->prestamo-$value->deuda_actual)*100)/$value->prestamo,2);
		                            if($porcentajeCancelado < str_replace(',', '.', $permitido['porcentajeAdm'])){
		                                $valido = false;
		                                $mensaje.='<b>El asociado debe haber cancelado el '.$permitido['porcentajeAdm'].'% del préstamo "'.$value->nombre_titulo.' '.$value->tipoCredito->descripcion.'" para poder optar para este plazo</b><br/>';
		                            }
		                        }
		                    }
		                }
			        }
	            }
            }

            $tipo['mensaje']=$mensaje;
        return $tipo;
    }
    public function validarDisponibilidadDiaria($model){
        $valido = TRUE;
        if($model->solicitudes){
            $solicitudes = $model->solicitudes;
             //1 -. Diarias, 2 -. Semanal, 3 -. Monto
            if($solicitudes[0]->id_periodicidad ==1){
                    $diaSemana=date('w', strtotime(date('d-m-Y')));
                    $valido = false;
                    foreach ($solicitudes as $key => $value) {
                        if($value->dia == $diaSemana){
                            if($value->cantidad_peticiones!=''){
                                $cantidadRetiroParcial = EstatusRetiroParcial::model()->with('idRetiroParcial')->count('id_estatus_retiro = 1 AND t.fecha_registro::DATE=:fecha_registro',array(':fecha_registro'=>date('d-m-Y')));
                                if($cantidadRetiroParcial >= $value->cantidad_peticiones) {
                                    //echo "Se ha llegado al tope maximo de solicitud del dia";
                                    $valido = $valido&& false;
                                }
                                else
                                    $valido = true;
                            }
                        }
                    }
            }
            elseif ($solicitudes[0]->id_periodicidad==2) {
                $numeroSemana = date('W');
                $anioActal = date('Y');
                $fechaLunes  = date('d-m-Y', strtotime($anioActal . 'W' . str_pad($numeroSemana , 2, '0', STR_PAD_LEFT)));
                $fechaDomingo = date('d-m-Y', strtotime($fechaLunes.' 6 day'));; //Domingo
                $cantidadRetiroParcial = EstatusRetiroParcial::model()->count('id_estatus_retiro = 1 AND (fecha_registro::DATE>=:fechasolicitudInicio AND fecha_registro::DATE<=:fechasolicitudFin)',
                                                        array(':fechasolicitudInicio'=>$fechaLunes,':fechasolicitudFin'=>$fechaDomingo));
                if($cantidadRetiroParcial >= $solicitudes[0]['cantidad_peticiones']) {
                    //echo "No hay disponibilidad de esta semana, intente la proxima semana";
                   $valido = $valido&& false;
                }
            }
            else{
                $sql = 'select  sum(monto_solicitado) as monto_solicitado FROM retiro.retiro_parcial AS a
                        JOIN retiro. estatus_retiro_parcial as b on a.id=b.id_retiro_parcial
                        WHERE b.fecha_registro=:fecha_registro AND id_estatus_retiro = 1';
                    $monto= RetiroParcial::model()->findBySql($sql,array(':fecha_registro'=>'2016-04-25'));

                    if($monto){
                        if($monto->monto_solicitado<= $solicitudes->monto_ofertado);
                          $valido = $valido&& false;
                    }

            }
        }
        else{
            $valido = FALSE;
        }
        return $valido;


    }

    public function validarTipoCreditoOrdinarioUsuarioTipo($idAsociado, $idTipoCredito, $montoCredito){
		$valido = FALSE;
                $tipo = array();
		if($idTipoCredito!='' && $idAsociado!=''){
                    $model = self::model()->findByPk($idTipoCredito);
                    $modelAsociado = Asociado::model()->findByPk($idAsociado);
                    $tipo = $this->validarTipoCreditoOrdinarias($model, $tipo, $modelAsociado) ;

                    if($tipo['mensaje']=='')
                        $valido= true;

		}
		return $valido;
	}

    public function calculoGastoAdministrativo($montoSolicitado, $generandoTablaAmortizacion= FALSE){
        $gastoAdministrativo = array();
        $gastoAdministrativo['descontar'] = true;
        $gastoAdministrativo['monto']=0;

        $modelGastosAdministrativo = TipoCreditoGastosAdministrativo::model()->find("id_tipo_credito=:id_tipo_credito AND porcentaje is not null ",array(':id_tipo_credito'=>$this->id));
        if($modelGastosAdministrativo){
            $gastoAdministrativo['descontar'] =$modelGastosAdministrativo-> descontar;
            $gastoAdministrativo['monto'] = round($montoSolicitado*$modelGastosAdministrativo-> porcentaje,2);

        }
        $modelGastosAdministrativo = TipoCreditoGastosAdministrativo::model()->find('id_tipo_credito=:id_tipo_credito AND :monto between rango_uno and rango_dos ',
                                                                                    array(':id_tipo_credito'=>$this->id,
                                                                                            ':monto'=>$montoSolicitado));
        if($modelGastosAdministrativo){
            $gastoAdministrativo['descontar'] =$modelGastosAdministrativo-> descontar;
            $gastoAdministrativo['monto'] = round($modelGastosAdministrativo-> garantia,2);

        }

        return $gastoAdministrativo;
    }
    public function calculoGastoAdministrativoAfianzadora($montoSolicitado, $generandoTablaAmortizacion= FALSE, $monto_haberes_socio, $id_afianzadora){
        $gastoAdministrativo = array();
        $gastoAdministrativo['descontar'] = true;
        $gastoAdministrativo['monto']=0;
        $gastoAdministrativo['monto_caja']=0;
        $gastoAdministrativo['idAfianzadora']=NULL;
        //la clasificacion del credito mayores que 1 son los que tienen fianza externa
        $nuevoMontoSolicitado= $montoSolicitado;
        $idAfianzadora=0;
        if($this->id_clasificacion_tipo_credito==2){
                if($this->metodo_calculo_garantia_afianzadora==2)
                    $nuevoMontoSolicitado-= $monto_haberes_socio;
                	if($id_afianzadora ==0){
		                $diaSemana=date('w', strtotime(date('d-m-Y')));
		                $modelPeriodicidad = PeriodicidadAfianzadora::model()->find('dia=:dia',array(':dia'=>$diaSemana));
		                if($modelPeriodicidad){
		                    if($modelPeriodicidad->id_periodicidad ==1){
		                        $idAfianzadora = $modelPeriodicidad->id_afianzadora;
		                    }

		                    else {
		                        //buscar el ultimo credito del dia pasa saber la afianzadora que otorgo el credito
		                         $modelUltimoCredito = Credito::model()->find('id_tipo_credito =:id_tipo_credito and fecha_registro = now()',
		                                                                    array(':id_tipo_credito'=>  $this->id));
		                         if($modelUltimoCredito){
		                             //solo esta configurado para 2 afianzadoras
		                            $idAfianzadora  =  $modelUltimoCredito->id_afianzadora+1;
		                            if($idAfianzadora>2)
		                                $idAfianzadora = 1;
		                         }
		                         else{
		                            $idAfianzadora = $modelPeriodicidad->id_afianzadora;
		                         }
		                    }
		                }
		                else{
		                    $afianzadora = Afianzadora::model()->findAll();
		                    if(count($afianzadora) == 1)
		                        $idAfianzadora = $afianzadora[0]->id;

		                }

                	}
                	else
                		$idAfianzadora = $id_afianzadora;



                if($idAfianzadora!=0){

                    $gastoAdministrativo['idAfianzadora'] = $idAfianzadora;
                    $gastosAdministrativoAfianzadora = GastosAdministrativosAfianzadora::model()->find(':duracion  between duracion::int and duracion_hasta AND idafianzadora=:idafianzadora AND :monto between rango_uno and rango_dos',
                                                                                                array(':duracion'=>$this->duracion_credito,':idafianzadora'=> $idAfianzadora,':monto'=>$nuevoMontoSolicitado));
                    if($gastosAdministrativoAfianzadora){
                        $gastoAdministrativo['descontar'] =$this->descontar_grantia_afianzadora;
                        $gastoAdministrativo['monto'] = round($gastosAdministrativoAfianzadora->garantia,2);
                    }
                    else{
                        $gastosAdministrativoAfianzadora = GastosAdministrativosAfianzadora::model()->find(':duracion  between duracion::int and duracion_hasta AND idafianzadora=:idafianzadora AND porcentaje is not null',
                                                                                                array(':duracion'=>$this->duracion_credito,':idafianzadora'=> $idAfianzadora));
                        if($gastosAdministrativoAfianzadora){
                            $gastoAdministrativo['descontar'] =$this->descontar_grantia_afianzadora;
                            $gastoAdministrativo['monto'] = round(($nuevoMontoSolicitado*$gastosAdministrativoAfianzadora-> porcentaje)/100,2);
                        }
                    }

                    if($gastoAdministrativo['monto'] >0){
                        if($this->metodo_calculo_garantia_afianzadora==3){
                            $nuevoMontoSolicitado-= $monto_haberes_socio;

                            $gastosAdministrativoAfianzadora = GastosAdministrativosAfianzadora::model()->find(':duracion  between duracion::int and duracion_hasta AND idafianzadora=:idafianzadora AND :monto between rango_uno and rango_dos',
                                                                                                array(':duracion'=>$this->duracion_credito,':idafianzadora'=> $idAfianzadora,':monto'=>$nuevoMontoSolicitado));
                            if($gastosAdministrativoAfianzadora){
                                $gastoAdministrativoNv = round($gastosAdministrativoAfianzadora->garantia,2);
                            }
                            else{
                                $gastosAdministrativoAfianzadora = GastosAdministrativosAfianzadora::model()->find(':duracion  between duracion::int and duracion_hasta AND idafianzadora=:idafianzadora AND porcentaje is not null',
                                                                                                        array(':duracion'=>$this->duracion_credito,':idafianzadora'=> $idAfianzadora));
                                if($gastosAdministrativoAfianzadora){
                                    $gastoAdministrativoNv = round(($nuevoMontoSolicitado*$gastosAdministrativoAfianzadora-> porcentaje)/100,2);
                                }
                            }

                            $gastoAdministrativo['monto_caja'] = $gastoAdministrativo['monto'] - $gastoAdministrativoNv;
                            $gastoAdministrativo['monto'] = $gastoAdministrativoNv;


                        }
                    }

                }

            }

            return$gastoAdministrativo;


    }

    public function validarPorcentaje(){
    	if(!$this->hasErrors('porcentaje_bloqueo_haberes_administrador')){
    		$porcentaje_bloqueo_haberes_administrador =  str_replace('.', '', $this->porcentaje_bloqueo_haberes_administrador);
            $porcentaje_bloqueo_haberes_administrador=str_replace(',', '.', $porcentaje_bloqueo_haberes_administrador);
            if($porcentaje_bloqueo_haberes_administrador>100){
                $this->addError('porcentaje_bloqueo_haberes_administrador','El bloqueo de haberes por administrador no puede ser mayor 100%');
            }
        }
    	if(!$this->hasErrors('porcentaje_bloqueo_haberes_asociado')){
    		$porcentaje_bloqueo_haberes_asociado =  str_replace('.', '', $this->porcentaje_bloqueo_haberes_asociado);
            $porcentaje_bloqueo_haberes_asociado=str_replace(',', '.', $porcentaje_bloqueo_haberes_asociado);
            if($porcentaje_bloqueo_haberes_asociado>100){
                $this->addError('porcentaje_bloqueo_haberes_asociado','El bloqueo de haberes por asociado no puede ser mayor 100%');
            }
        }
    	if($this->opcion_haberes_administrador == 1){
    		$this->porcentaje_bloqueo_haberes_administrador = NULL;
    	}
    	else{
    		$this->monto_bloqueo_haberes_administrador = NULL;

    	}
    	if($this->opcion_haberes_asociado == 1){
    		$this->porcentaje_bloqueo_haberes_asociado = NULL;
    	}
    	else{
    		$this->monto_bloqueo_haberes_asociado = NULL;

    	}
    }
    public function diferenciaTiempoMeses($opcion = array()){
        $desde = (array_key_exists('fecha_inicio',$opcion))?$opcion['fecha_inicio']:date ("Y-m-d");
        $hasta = (array_key_exists('fecha_fin',$opcion))?$opcion['fecha_fin']:date ("Y-m-d");

        $tiempo = 0;
        $fechainicial = new DateTime($desde);
        $fechafinal = new DateTime($hasta);

        $diferencia = $fechainicial->diff($fechafinal);
        $tiempo = ( $diferencia->y * 12 ) + $diferencia->m;
        return $tiempo;
    }
    public function afterFind(){
      if($this->monto_disponibilidad_solicitudes!=''){
        $montos = json_decode($this->monto_disponibilidad_solicitudes, true);
        if(isset($montos['monto_bloqueo_haberes_administrador'])){
        	$this->monto_bloqueo_haberes_administrador = $montos['monto_bloqueo_haberes_administrador'];
        	$this->opcion_haberes_administrador  = 1;
        	$this->porcentaje_bloqueo_haberes_administrador = NULL;
        }
        if(isset($montos['porcentaje_bloqueo_haberes_administrador'])){
        	$this->porcentaje_bloqueo_haberes_administrador = $montos['porcentaje_bloqueo_haberes_administrador'];
        	$this->opcion_haberes_administrador  = 0;
        	$this->monto_bloqueo_haberes_administrador = NULL;
        }
        if(isset($montos['monto_bloqueo_haberes_asociado'])){
        	$this->monto_bloqueo_haberes_asociado = $montos['monto_bloqueo_haberes_asociado'];
        	$this->opcion_haberes_asociado  = 1;
        	$this->porcentaje_bloqueo_haberes_asociado = NULL;
        }
        if(isset($montos['porcentaje_bloqueo_haberes_asociado'])){
        	$this->porcentaje_bloqueo_haberes_asociado = $montos['porcentaje_bloqueo_haberes_asociado'];
        	$this->opcion_haberes_asociado  = 0;
        	$this->monto_bloqueo_haberes_asociado = NULL;
        }
      }

      return parent::afterFind();
  	}
        public function beforeSave(){
            $this->taza_interes =  str_replace('.', '', $this->taza_interes);
            $this->taza_interes=str_replace(',', '.', $this->taza_interes);

            $this->monto_minimo_credito =  str_replace('.', '', $this->monto_minimo_credito);
            $this->monto_minimo_credito=str_replace(',', '.', $this->monto_minimo_credito);

            $this->monto_maximo_credito =  str_replace('.', '', $this->monto_maximo_credito);
            $this->monto_maximo_credito=str_replace(',', '.', $this->monto_maximo_credito);
            if($this->monto_maximo_credito<1){
            	$this->monto_maximo_credito= NULL;
            }

            $this->porcentaje_refinanciamiento =  str_replace('.', '', $this->porcentaje_refinanciamiento);
            $this->porcentaje_refinanciamiento=str_replace(',', '.', $this->porcentaje_refinanciamiento);

            $this->porcentaje_reestructuracion =  str_replace('.', '', $this->porcentaje_reestructuracion);
            $this->porcentaje_reestructuracion=str_replace(',', '.', $this->porcentaje_reestructuracion);

            $this->porcentaje_disponibilidad =  str_replace('.', '', $this->porcentaje_disponibilidad);
            $this->porcentaje_disponibilidad=str_replace(',', '.', $this->porcentaje_disponibilidad);

            $this->porcentaje_cancelado =  str_replace('.', '', $this->porcentaje_cancelado);
            $this->porcentaje_cancelado=str_replace(',', '.', $this->porcentaje_cancelado);

            $this->porcentaje_cuotas_especiales =  str_replace('.', '', $this->porcentaje_cuotas_especiales);
            $this->porcentaje_cuotas_especiales=str_replace(',', '.', $this->porcentaje_cuotas_especiales);

            $this->capacidad_pago_porcentaje =  str_replace('.', '', $this->capacidad_pago_porcentaje);
            $this->capacidad_pago_porcentaje=str_replace(',', '.', $this->capacidad_pago_porcentaje);

            if($this->capacidad_pago_porcentaje =='')
                $this->capacidad_pago_porcentaje = NULL;

            ################################### BLOQUEDO DE HABERES #######################################
            $montos =[];
            if($this->monto_bloqueo_haberes_administrador !=''){
            	$this->monto_bloqueo_haberes_administrador =  str_replace('.', '', $this->monto_bloqueo_haberes_administrador);
            	$this->monto_bloqueo_haberes_administrador=str_replace(',', '.', $this->monto_bloqueo_haberes_administrador);
            	$montos['monto_bloqueo_haberes_administrador']=$this->monto_bloqueo_haberes_administrador;
            	unset($montos['porcentaje_bloqueo_haberes_administrador']);
            }
            if($this->porcentaje_bloqueo_haberes_administrador !=''){
            	$this->porcentaje_bloqueo_haberes_administrador =  str_replace('.', '', $this->porcentaje_bloqueo_haberes_administrador);
            	$this->porcentaje_bloqueo_haberes_administrador=str_replace(',', '.', $this->porcentaje_bloqueo_haberes_administrador);
            	$montos['porcentaje_bloqueo_haberes_administrador']=$this->porcentaje_bloqueo_haberes_administrador;
            	unset($montos['monto_bloqueo_haberes_administrador']);
            }
            if($this->monto_bloqueo_haberes_asociado !=''){
            	$this->monto_bloqueo_haberes_asociado =  str_replace('.', '', $this->monto_bloqueo_haberes_asociado);
            	$this->monto_bloqueo_haberes_asociado=str_replace(',', '.', $this->monto_bloqueo_haberes_asociado);
            	array_push($montos, ['monto_bloqueo_haberes_asociado'=>$this->monto_bloqueo_haberes_asociado]);
            	$montos['monto_bloqueo_haberes_asociado']=$this->monto_bloqueo_haberes_asociado;
            	unset($montos['porcentaje_bloqueo_haberes_asociado']);
            }
            if($this->porcentaje_bloqueo_haberes_asociado !=''){
            	$this->porcentaje_bloqueo_haberes_asociado =  str_replace('.', '', $this->porcentaje_bloqueo_haberes_asociado);
            	$this->porcentaje_bloqueo_haberes_asociado=str_replace(',', '.', $this->porcentaje_bloqueo_haberes_asociado);
            	$montos['porcentaje_bloqueo_haberes_asociado']=$this->porcentaje_bloqueo_haberes_asociado;
            	unset($montos['monto_bloqueo_haberes_asociado']);
            }

            if (count($montos) > 0){
            	$this->monto_disponibilidad_solicitudes = json_encode($montos);
            } else {
                $this->monto_disponibilidad_solicitudes = null;
            }
            ################################### FIN BLOQUEDO DE HABERES ####################################

            foreach ($this->attributes as $key => $value){
              if(!$this->getMetadata()->columns[$key]->isPrimaryKey){
                 if($this->getMetadata()->columns[$key]->dbType!='string' && $value =='' ){
                     $this[$this->getMetadata()->columns[$key]->name]= NULL;
                 }
              }
            }
            if($this->blnborrado =='')
               $this->blnborrado =0;

            if($this->metodo_calculo_garantia_monto_gasto =='')
               $this->metodo_calculo_garantia_monto_gasto =0;

            $this->gastos_administrativo =  str_replace('.', '', $this->gastos_administrativo);
            $this->gastos_administrativo=str_replace(',', '.', $this->gastos_administrativo);


            if($this->descontar_grantia_afianzadora =='')
                $this->descontar_grantia_afianzadora = false;

            if($this->generar_tabla_cuotas_especiales =='')
                $this->generar_tabla_cuotas_especiales = false;

            return parent::beforeSave();
        }


	/**
	 * 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 TipoCredito the static model class
	 */
	public static function model($className=__CLASS__)
	{
		return parent::model($className);
    }

    public static function getTiposCreditos()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT tc.id, concat(ttc.nombre_titulo, \' - \', tc.descripcion) as tipo_credito
            FROM prestamos.tipo_credito tc
            INNER JOIN prestamos.titulo_tipo_credito ttc ON ttc.id=tc.id_titulo_tipo_credito
            WHERE tc.blnborrado is false
            ORDER BY concat(ttc.nombre_titulo, \' - \', tc.descripcion)
        ')->queryAll();
    }

    public function calcularBloqueoPrestamos($monto)
    {
        if ($this->opcion_haberes_administrador) {
            return $this->monto_bloqueo_haberes_administrador;
        }

        return $monto * ($this->porcentaje_bloqueo_haberes_administrador / 100);
    }
}
