<?php

/**
 * This is the model class for table "prestamos.credito".
 *
 * The followings are the available columns in table 'prestamos.credito':
 * @property integer $id
 * @property string $idasociado
 * @property string $id_tipo_credito
 * @property double $cuota_pagar
 * @property integer $taza_interes
 * @property double $monto_credito
 * @property string $cuenta
 * @property string $fecha_primer_descuento
 * @property integer $fiador
 * @property double $gastos_administrativo
 * @property boolean $blnborrado
 * @property string $fecha_registro
 *
 * The followings are the available model relations:
 * @property Estatus[] $prestamos.estatuses
 * @property CreditoTablaAmortizacion[] $creditoTablaAmortizacions
 * @property Asociado $idasociado
 * @property TipoCredito $idTipoCredito
 */
class Credito extends CActiveRecord
{
    public $cedula,
            $nombre,
            $apellido,
            $unidad,
            $fecha_registro_range = array(),
            $id_estatus,
            $nombre_estatus,
            $habereDisponibles,
            $id_titulo_tipo_credito,
            $id_afianzadora,
            $generar_tabla_cuotas_especiales=0,
            $tcredito,
            $fecha_solicitud,
            $fecha_solicitud_range= array(),
            $fecha_estatus,
            $fecha_estatus_range= array(),
            $fecha_solicita, $numero_cuotas,
            $cuotas_manuales = 0,
            $fecha_solicita_range = array(),
            $omitir_evaluacion_capacidad_pago = false,
            $omitir_monto_maximo_permitido = false,
            $reestructuracion_tabla = false;
    public $fecha_comprobante, $agrupar_prestamo;
    public $observacion;
    public $bloqueo_anticipado_prestamos = false;

    static $ruta ='doc/recibos_pago/';

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

	/**
	 * @return array validation rules for model attributes.
	 */
	public function rules()
    {
        return [
            ['cuenta,cedula,id_titulo_tipo_credito, id_tipo_cobro', 'required', 'on' => 'SolicitudAdministrador'],
            ['cedula,id_titulo_tipo_credito', 'required', 'on' => 'SolicitudAdministradorTienda'],
            ['cuenta,cedula,id_credito_padre,refinanciado,id_tipo_cobro', 'required', 'on' => 'SolicitudAdministradorRefinanciamiento'],
            ['cuenta,id_credito_padre,refinanciado', 'required', 'on' => 'SolicitudRefinanciamiento'],
            ['cuenta,id_titulo_tipo_credito', 'required', 'on' => 'SolcitudAsociado'],
            ['cedula', 'length', 'min' => 3, 'max' => 10, 'on' => 'SolicitudAdministrador,SolicitudAdministradorRefinanciamiento'],
            ['cedula', 'buscarAsociado', 'on' => 'SolicitudAdministrador,SolicitudAdministradorRefinanciamiento,SolicitudAdministradorTienda'],
            ['id_tipo_credito,monto_credito, idasociado', 'required'],
            ['id', 'required', 'on' => 'cambio-fecha'],

            ['fecha_primer_descuento', 'required', 'on' => 'aprobacionSolicitud, cambio-fecha'],
            ['fecha_primer_descuento', 'validarFechaNomina', 'on' => 'aprobacionSolicitud, cambio-fecha'],

            ['monto_credito', 'match',  'pattern' => '/^[0-9]\d{0,2}(\.[0-9]\d{2,2})*(\,\d{1,2})?$/', 'message' => 'El valor del campo debe tener un formato 100.000,00'],
            ['taza_interes', 'match', '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'],

            ['nombre_recibo_pago', 'file', 'allowEmpty' => true, 'types' => 'xls,xlxs,pdf,jpeg,jpg,png,doc', 'enableClientValidation' => false, 'on' => 'SolicitudAdministrador,SolcitudAsociado,SolicitudAdministradorTienda'],

            ['monto_credito', 'validarMontoSolicitado'],
            ['id_tipo_credito', 'validarTipoPrestamo'],

            ['cuota_pagar', 'numerical'],
            ['cuenta', 'length', 'min' => 20, 'max' => 20, 'on' => 'SolicitudAdministrador,SolicitudAdministradorRefinanciamiento,SolcitudAsociado,SolicitudRefinanciamient '],
            ['numero_cuotas', 'numerical', 'integerOnly' => true],
            ['numero_cuotas', 'length', 'min' => 1, 'max' => 3],
            ['refinanciado, idasociado,id_titulo_tipo_credito,monto_haberes_comprometido, id_tipo_credito, cuenta,
            fecha_primer_descuento, blnborrado, habereDisponibles,nombre_recibo_pago, generar_tabla_cuotas_especiales,
            id_tipo_cobro, numero_cuotas, cuotas_manuales, omitir_evaluacion_capacidad_pago, omitir_monto_maximo_permitido,
            agrupar_prestamo, fecha_comprobante, bloqueo_anticipado_prestamos, monto_bloqueo_anticipado, ajuste_haberes', 'safe'],

            ['refinanciado,cedula, nombre,id_titulo_tipo_credito,monto_haberes_comprometido, apellido,unidad, fecha_registro_range,
            id_estatus, nombre_estatus, habereDisponibles, id, idasociado, id_tipo_credito, cuota_pagar, taza_interes, monto_credito,
            cuenta, fecha_primer_descuento, fiador, gastos_administrativo, blnborrado, fecha_registro, fecha_estatus,
            fecha_estatus_range, fecha_solicita, fecha_solicita_range, id_tipo_cobro, monto_credito_depositar', '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(
			'prestamos.estatuses' => array(self::MANY_MANY, 'Estatus', 'estatus_credito(id_credito, id_estatus_credito)'),
			'creditoTablaAmortizacions' => array(self::HAS_MANY, 'CreditoTablaAmortizacion', 'idcredito'),
			'creditoTablaAmortizacionsCuotaOrdinaria' => array(self::HAS_MANY, 'CreditoTablaAmortizacion', 'idcredito' , 'condition'=>'tipo_cuota=\'O\' AND blnborrado= false', 'order'=>'id'),
			'creditoTablaAmortizacionsCuotaEspecial' => array(self::HAS_MANY, 'CreditoTablaAmortizacion', 'idcredito' , 'condition'=>'tipo_cuota=\'A\'  AND blnborrado= false'),
			'idAsociado' => array(self::BELONGS_TO, 'Asociado', 'idasociado'),
			'idAfianzadora' => array(self::BELONGS_TO, 'Afianzadora', 'id_afianzadora'),
			'idTipoCredito' => array(self::BELONGS_TO, 'TipoCredito', 'id_tipo_credito'),
			'idTipoNomina' => array(self::BELONGS_TO, 'TipoNomina', 'id_tipo_nomina'),
			'idCreditoSeguimiento' => array(self::HAS_MANY, 'CreditoSeguimiento', 'id_credito'),
			'idCreditoSeguimientoActual' => array(self::HAS_MANY, 'CreditoSeguimiento', 'id_credito', 'condition'=>'actual=true'),
            'idTipoCobro' => array(self::BELONGS_TO, 'TipoCobro', 'id_tipo_cobro'),
            'procesoPago' => [self::HAS_ONE, 'ProcesoPago', 'id_proceso', 'condition' => 'id_nombre_proceso=1 AND actual IS TRUE AND blnborrado IS FALSE'],
            'procesoPagoCount' => [self::STAT, 'ProcesoPago', 'id_proceso', 'condition' => 'id_nombre_proceso=1 AND blnborrado IS FALSE']
		);
	}

	/**
	 * @return array customized attribute labels (name=>label)
	 */
	public function attributeLabels()
	{
		return array(
			'id' => 'ID',
			'idasociado' => 'Idasociado',
			'id_tipo_credito' => 'Plazo del préstamo',
			'cuota_pagar' => 'Cuota a pagar',
			'taza_interes' => 'Tasa de interes',
			'monto_credito' => 'Monto del préstamo',
			'cuenta' => 'Número de cuenta',
			'fecha_primer_descuento' => 'Fecha del primer descuento',
			'fiador' => 'Fiador',
			'gastos_administrativo' => 'Gastos administrativo',
			'blnborrado' => 'Blnborrado',
			'fecha_registro' => 'Fecha de registro',
			'id_estatus' => 'Estatus',
			'cedula' => 'Cédula de identidad del solicitante',
			'nombre_recibo_pago' => 'Recibo de pago',
            'id_titulo_tipo_credito' => 'Categoría del préstamo',
            'monto_credito_anterior' => 'Monto anterior',
            'monto_credito_depositar' => 'Monto a ser depositado',
            'refinanciado' => 'Tipo de préstamo',
            'tcredito'=>'Tipo de credito',
			'fecha_estatus' => 'Fecha estatus',
            'fecha_solicita'=>'Fecha solicitud',
            'id_tipo_cobro'=>'Tipo de cobro',
            'omitir_evaluacion_capacidad_pago'=>'Omitir evaluación de capacidad de pago',
            'omitir_monto_maximo_permitido'=>'Omitir el monto máximo permitido',
            'id_tipo_nomina'=>'Tipo de nómina'
		);
	}
        public function validarFechaNomina(){
            if(!$this->hasErrors('fecha_primer_descuento')){
                $modelTipoNomina = TipoNominaPeriodo::model()->find('id_tipo_nomina=:id_tipo_nomina AND :fecha BETWEEN fecha_desde AND fecha_hasta',[':id_tipo_nomina'=>$this->id_tipo_nomina, ':fecha'=>$this->fecha_primer_descuento]);
                if($modelTipoNomina){
                    $model = DatosPreNominaCredito::model()->with('preNominaSeguimientos')->together(true)->find('id_tipo_momina_periodo=:id_tipo_momina_periodo AND actual = true and id_estatus_pre_nomina !=9 AND id_unidad=:id_unidad',[':id_tipo_momina_periodo'=>$modelTipoNomina->id,':id_unidad'=>$this->idAsociado->idunidad]);
                    if($model)
                        $this->addError('fecha_primer_descuento','Existe una nómina de préstamo generada, se debe asignar una fecha superior a la asignada');
                }
            }
        }

        public function validarMontoSolicitado(){
            if(!$this->hasErrors('monto_credito') && !$this->hasErrors('id_tipo_credito') && $this->isNewRecord){
                $montoSolcitado =  str_replace('.', '', $this->monto_credito);
                $montoSolcitado=str_replace(',', '.',$montoSolcitado);
                if($montoSolcitado >0){
                    $this->habereDisponibles =$this->calcularHaberesDisponibles($this->idasociado,  $this->id_tipo_credito);

                    $modelTipoCredito = TipoCredito::model()->find('id=:id',array(':id'=>$this->id_tipo_credito));
                    if($modelTipoCredito->numero_haberes_disponible>0){

                        $this->monto_haberes_comprometido = round($this->habereDisponibles,2);

                        if($this->habereDisponibles>0)
                            $this->habereDisponibles *=  $modelTipoCredito->numero_haberes_disponible;
                        else
                            $this->habereDisponibles +=($modelTipoCredito->numero_haberes_disponible*$this->habereDisponibles*-1);

                    }

                    $this->habereDisponibles =$this->MontoSugerido($modelTipoCredito, $this->idasociado);

                    if($this->scenario =='SolicitudAdministradorTienda'){
                        $montoHaberesDisponibles =ConfBonoDisponibilidadHaberes::calculoMontoBonoTiendaVirtual($this->habereDisponibles);
                    }
                    else{
                        $montoHaberesDisponibles =$this->habereDisponibles;
                    }
                    if(!$this->omitir_monto_maximo_permitido){

                        if( !$this->reestructuracion_tabla ){

                            if($montoSolcitado> $montoHaberesDisponibles)
                                $this->addError('monto_credito','El monto solicitado es mayo que el disponible ('.number_format( $montoHaberesDisponibles,2,",",".").')');

                        }
                    }

                }
                else{
                    $this->addError('monto_credito','El monto solicitado debe ser mayor de 0');
                }
            }
        }

        public function MontoSugerido($modelTipoCredito, $idAsociado){
             //$modelTipoCredito = TipoCredito::model()->find('id=:id',array(':id'=>$idTipoCredito));
            $montoTotalSolicitud =0;
            if($modelTipoCredito->numero_haberes_disponible>0){
                $montoTotalSolicitud = Credito::model()->calcularHaberesDisponibles($idAsociado, $modelTipoCredito->id);

                if($montoTotalSolicitud>0)
                    $montoTotalSolicitud *=  $modelTipoCredito->numero_haberes_disponible;
                else
                    $montoTotalSolicitud +=($modelTipoCredito->numero_haberes_disponible*$montoTotalSolicitud*-1);

            }
            else{
                if($modelTipoCredito->id_clasificacion_tipo_credito==2 && ($modelTipoCredito->monto_maximo_credito!='' &&  $modelTipoCredito->monto_maximo_credito > 0)){
                        $montoTotalSolicitud = $modelTipoCredito->monto_maximo_credito;
                }
                else{
                    if($modelTipoCredito->porcentaje_disponibilidad !='')
                        $porcentaje = $modelTipoCredito->porcentaje_disponibilidad;
                    else
                        $porcentaje = 80;

                    $modelBasica = Basica::model()->find();


                    $haberes = (object) Yii::app()->db->createCommand('
                        SELECT aporte_total, asignacion_monto_asociado, asignacion_monto_patrono, descuento_monto_asociado, descuento_monto_patrono, retiro_parcial, total_haberes
                        FROM reporte_haberes
                        WHERE idasociado=:id
                        LIMIT 1
                    ')->bindValue('id', $idAsociado)->queryRow();

                    if (! $haberes) {
                        $haberes = new self();
                    }

                    $modelMontoTotalFiador = ReporteCreditos::model()->getTotalMontoFiador($idAsociado);
                    $modelMontoTotalDeuda = ReporteCreditos::model()->getTotalMontoDeuda($idAsociado);
                    $total = ($haberes->aporte_total + $haberes->asignacion_monto_asociado + $haberes->asignacion_monto_patrono) - ($haberes->descuento_monto_asociado + $haberes->descuento_monto_patrono);

                    if($modelBasica->formula_disponibilidad_haberes!=''){
                        $busqueda = array('H','R','X','P');
                        $reemplazar = array($total,$haberes->retiro_parcial,($porcentaje/100),($modelMontoTotalDeuda + $modelMontoTotalFiador));
                        $formula = str_replace($busqueda, $reemplazar, $modelBasica->formula_disponibilidad_haberes);

                        eval("\$res = $formula;");
                        $montoTotalSolicitud = round($res,2);
                    }
                    else{
                        $montoTotalSolicitud = round(($haberes->total_haberes * ($porcentaje/100)) - ($modelMontoTotalDeuda + $modelMontoTotalFiador),2);
                    }

                    if($montoTotalSolicitud < 0)
                        $montoTotalSolicitud=0;

                    if($modelTipoCredito->monto_maximo_credito >0 && ($montoTotalSolicitud>$modelTipoCredito->monto_maximo_credito))
                        $montoTotalSolicitud = $modelTipoCredito->monto_maximo_credito;

                }



            }
           return $montoTotalSolicitud;
        }

        public function MontoBloqueoHaberes($modelTipoCredito, $idAsociado, $asociado){
             //$modelTipoCredito = TipoCredito::model()->find('id=:id',array(':id'=>$idTipoCredito));

            $monto = ReporteHaberes::model()->haberDisponible($idAsociado,100);
            $montoBloqueo = 0;
            if($asociado){
                if($modelTipoCredito->opcion_haberes_asociado ==1){
                   if($modelTipoCredito->monto_bloqueo_haberes_asociado !='')
                    $montoBloqueo =$modelTipoCredito->monto_bloqueo_haberes_asociado;
                }
                else{
                    if($modelTipoCredito->porcentaje_bloqueo_haberes_asociado !=''){
                        $montoBloqueo =round(($modelTipoCredito->porcentaje_bloqueo_haberes_asociado /100)* $monto,2);
                    }
                }
            }
            else{
                if($modelTipoCredito->opcion_haberes_administrador ==1){
                   if($modelTipoCredito->monto_bloqueo_haberes_administrador !='')
                    $montoBloqueo =$modelTipoCredito->monto_bloqueo_haberes_administrador;
                }
                else{
                    if($modelTipoCredito->porcentaje_bloqueo_haberes_administrador !=''){
                        $montoBloqueo =round(($modelTipoCredito->porcentaje_bloqueo_haberes_administrador /100)* $monto,2);
                    }
                }
            }


           return $montoBloqueo;
        }

        public function MontoSugeridoTiendaVirtual($modelTipoCredito, $idAsociado){
             //$modelTipoCredito = TipoCredito::model()->find('id=:id',array(':id'=>$idTipoCredito));
            $montoTotalSolicitud =0;
            if($modelTipoCredito->numero_haberes_disponible>0){
                $montoTotalSolicitud = Credito::model()->calcularHaberesDisponibles($idAsociado, $modelTipoCredito->id);
                $montoTotalSolicitud =ConfBonoDisponibilidadHaberes::calculoMontoBonoTiendaVirtual($montoTotalSolicitud);

                if($montoTotalSolicitud>0)
                    $montoTotalSolicitud *=  $modelTipoCredito->numero_haberes_disponible;
                else
                    $montoTotalSolicitud +=($modelTipoCredito->numero_haberes_disponible*$montoTotalSolicitud*-1);

            }
            else{
                if($modelTipoCredito->id_clasificacion_tipo_credito==2 && $modelTipoCredito->monto_maximo_credito!=''){
                        $montoTotalSolicitud = $modelTipoCredito->monto_maximo_credito;
                        $montoTotalSolicitud =ConfBonoDisponibilidadHaberes::calculoMontoBonoTiendaVirtual($montoTotalSolicitud);
                }
                else{
                    if($modelTipoCredito->porcentaje_disponibilidad !='')
                        $porcentaje = $modelTipoCredito->porcentaje_disponibilidad;
                    else
                        $porcentaje = 80;

                    $modelBasica = Basica::model()->find();
                    $haberes = ReporteHaberes::model()->find('idasociado=:ida', array(':ida' =>$idAsociado));
                    $modelMontoTotalFiador = ReporteCreditos::model()->getTotalMontoFiador($idAsociado);
                    $modelMontoTotalDeuda = ReporteCreditos::model()->getTotalMontoDeuda($idAsociado);
                    if($modelBasica->formula_disponibilidad_haberes!=''){
                        $busqueda = array('H','R','X','P');
                        $reemplazar = array($haberes->aporte_total,$haberes->retiro_parcial,($porcentaje/100),($modelMontoTotalDeuda + $modelMontoTotalFiador));
                        $formula = str_replace($busqueda, $reemplazar, $modelBasica->formula_disponibilidad_haberes);

                        eval("\$res = $formula;");
                        $montoTotalSolicitud = round($res,2);
                         $montoTotalSolicitud =ConfBonoDisponibilidadHaberes::calculoMontoBonoTiendaVirtual($montoTotalSolicitud);
                    }
                    else{
                        $montoTotalSolicitud = round(($haberes->total_haberes * ($porcentaje/100)) - ($modelMontoTotalDeuda + $modelMontoTotalFiador),2);
                         $montoTotalSolicitud =ConfBonoDisponibilidadHaberes::calculoMontoBonoTiendaVirtual($montoTotalSolicitud);
                    }

                    if($montoTotalSolicitud < 0)
                        $montoTotalSolicitud=0;

                    if($modelTipoCredito->monto_maximo_credito >0 && ($montoTotalSolicitud>$modelTipoCredito->monto_maximo_credito))
                        $montoTotalSolicitud = $modelTipoCredito->monto_maximo_credito;

                }



            }
           return $montoTotalSolicitud;
        }

        public function validarTipoPrestamo(){
            if(!$this->hasErrors('id_tipo_credito')&& $this->isNewRecord ){

                $tipo = array();
                $modelTC = TipoCredito::model()->findByPk($this->id_tipo_credito);
                $modelAsociado = Asociado::model()->findByPk($this->idasociado);

                if($this->scenario =='SolicitudAdministrador'  || $this->scenario =='SolicitudAdministradorRefinanciamiento')
                    $tipo = $modelTC->validarTipoCreditoAdministrador($modelTC, $tipo, $modelAsociado) ;
                else
                    $tipo = $modelTC->validarTipoCreditoOrdinarias($modelTC, $tipo, $modelAsociado) ;

                if($this->scenario !='SolicitudAdministradorRefinanciamiento' &&  $this->scenario !='SolicitudRefinanciamiento'){
                    if(!$modelTC->capacidad_pago_sueldo_aporte && $this->nombre_recibo_pago ==''){
                        $this->addError('nombre_recibo_pago','Debe consignar el recibo de pago');
                    }
                }

                if($tipo['mensaje']!='')
                    $this->addError('cedula',$tipo['mensaje']);
            }
        }
        public function buscarAsociado() {
            if (!$this->hasErrors('cedula')) {
                $modelAsociado = Asociado::model()->find('cedula=:cedula AND blnborrado= false AND id_estatus in(1,4) ORDER BY idasociado desc',array(':cedula'=>$this->cedula));
                if($modelAsociado){
                    $this->idasociado =  $modelAsociado->idasociado;
                    $modelHaberesSocio = ReporteHaberes::model()->find('idasociado=:idasociado',array(':idasociado'=>$modelAsociado->idasociado));

                    $modelMontoTotalFiador = ReporteCreditos::model()->getTotalMontoFiador($modelAsociado->idasociado);
//                    $modelConfiguracion = ConfRetiroParcial::model()->find();
//                    if($modelConfiguracion)
//                        $porcentaje = $modelConfiguracion->porcentaje_tope;
//                    else
                        $porcentaje = 80;
                    $modelMontoTotalFiador = ReporteCreditos::model()->getTotalMontoFiador($this->idasociado);
                    $this->habereDisponibles = ($modelHaberesSocio->total_haberes * ($porcentaje/100)) - ($modelHaberesSocio->deuda_actual + $modelMontoTotalFiador);
                    $this->id_tipo_nomina = $modelAsociado->getIdTipoNomina();
                }
                else{
                    $this->addError('cedula','No se encontraron registros asociados a la cédula');
                }

            }
        }

	/**
	 * 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;
                $criteria->with='idAsociado';
                $criteria->condition='t.blnborrado=false';

                if(!is_numeric($this->cedula))
                    $this->cedula =  NULL;

                if(!is_numeric($this->monto_credito))
                    $this->monto_credito =  NULL;


                if (Yii::app()->user->checkAccess('usuario_asociado') && !Yii::app()->user->checkAccess('usuario_administrador') ){
                    $this->idasociado = Asociado::model()->find('cedula=:cedula AND blnborrado = false AND id_estatus in(1,4) ORDER BY idasociado desc',array(':cedula'=>CrugeUserI::model()->findByPk(Yii::app()->user->id)->cedula))->idasociado;
                }

                if(!is_numeric($this->cedula))
                    $this->cedula = NULL;

		$criteria->compare('id',$this->id);
		$criteria->compare('t.idasociado',$this->idasociado);
		$criteria->compare('id_tipo_credito',$this->id_tipo_credito);
		$criteria->compare('cuota_pagar',$this->cuota_pagar);
		$criteria->compare('taza_interes',$this->taza_interes);
		$criteria->compare('monto_credito',$this->monto_credito);
		$criteria->compare('cuenta',$this->cuenta,true);
		$criteria->compare('fecha_primer_descuento',$this->fecha_primer_descuento,true);
		$criteria->compare('fiador',$this->fiador);
		$criteria->compare('gastos_administrativo',$this->gastos_administrativo);
		$criteria->compare('blnborrado',$this->blnborrado);
		$criteria->compare('fecha_registro',$this->fecha_registro,true);
        $criteria->compare('refinanciado',$this->refinanciado);
		$criteria->compare('id_tipo_cobro',$this->id_tipo_cobro);

                $criteria->compare('cedula',$this->cedula);
		$criteria->compare('UPPER(nombre||apellidos)',  strtoupper($this->nombre),true);
		//$criteria->compare('UPPER(apellidos)',strtoupper($this->apellido),true);
		$criteria->compare('idunidad',$this->unidad);


                //CONSULTA PARA FILTRAR POR ESTATUS EN ADMIN
                if(isset($this->id_estatus) && $this->id_estatus !=''){
                    //$criteria->with = 'idCreditoSeguimientoActual';
                    $criteria->join = 'INNER JOIN prestamos.credito_seguimiento AS c on c.id_credito = t.id';
                    $criteria->addCondition('c.id_estatus_credito ='.$this->id_estatus.' AND c.actual = true');
                    /*$criteria->addCondition('(SELECT count(*) FROM prestamos.credito_seguimiento WHERE id_credito=t.id AND id_estatus_credito='.$this->id_estatus.' AND actual= true)>0');*/
                    //echo "<pre>";print_r($criteria);exit;
                }


                //FILTRO PARA FECHAS

                //Filtro para fecha de solicitud
                $from = $to = '';
                if (count($this->fecha_solicita_range)>=1) {
                    if (isset($this->fecha_solicita_range['from'])) {
                        $from = $this->fecha_solicita_range['from'];
                    }
                    if (isset($this->fecha_solicita_range['to'])) {
                        $to= $this->fecha_solicita_range['to'];
                    }
                }
                if ($from!='' || $to !='') {
                    if ($from!='' && $to!='') {
                        $from = date("d-m-Y", strtotime($from));
                        $to = date("d-m-Y", strtotime($to));

                        if(isset($this->id_estatus) && $this->id_estatus !=''){

                            $criteria->addCondition('t.fecha_registro::DATE >=\''.$from.'\' AND t.fecha_registro::DATE <=\''.$to.'\'');
                            //echo "<pre>44";print_r($criteria);exit;

                        }else{

                            $criteria->join = 'INNER JOIN prestamos.credito_seguimiento AS c on c.id_credito = t.id';
                            $criteria->addCondition('id_estatus_credito=1 AND t.fecha_registro::DATE >=\''.$from.'\' AND t.fecha_registro::DATE <=\''.$to.'\'');
                        }
                    }
                    else {
                        if ($from!='') $creation_time = $from;
                        if ($to != '') $creation_time = $to;
                        $creation_time = date("d-m-Y", strtotime($creation_time));

                        if(isset($this->id_estatus) && $this->id_estatus !=''){

                            $criteria->addCondition('t.fecha_registro::DATE =\''.$creation_time.'\'');
                            //echo "<pre>45";print_r($criteria);exit;

                        }else{

                            $criteria->join = 'INNER JOIN prestamos.credito_seguimiento AS c on c.id_credito = t.id';
                            $criteria->addCondition('id_estatus_credito=1 AND t.fecha_registro::DATE =\''.$creation_time.'\'');
                        }
                    }
                }

                //Filtro para fecha de estatus
                $from = $to = '';
                if (count($this->fecha_estatus_range)>=1) {
                    if (isset($this->fecha_estatus_range['from'])) {
                        $from = $this->fecha_estatus_range['from'];
                    }
                    if (isset($this->fecha_estatus_range['to'])) {
                        $to= $this->fecha_estatus_range['to'];
                    }
                }
                if ($from!='' || $to !='') {
                    if ($from!='' && $to!='') {
                        $from = date("d-m-Y", strtotime($from));
                        $to = date("d-m-Y", strtotime($to));

                        if(isset($this->id_estatus) && $this->id_estatus !=''){
                            $criteria->addCondition('c.fecha_registro::DATE >=\''.$from.'\' AND c.fecha_registro::DATE <=\''.$to.'\'');
                        }else{
                            $criteria->join = 'INNER JOIN prestamos.credito_seguimiento AS c on c.id_credito = t.id';
                            $criteria->addCondition('c.actual = true AND c.fecha_registro::DATE >=\''.$from.'\' AND c.fecha_registro::DATE <=\''.$to.'\'');
                        }
                    }
                    else {
                        if ($from!='') $creation_time = $from;
                        if ($to != '') $creation_time = $to;
                        $creation_time = date("d-m-Y", strtotime($creation_time));

                        if(isset($this->id_estatus) && $this->id_estatus !=''){
                            $criteria->addCondition('c.fecha_registro::DATE =\''.$creation_time.'\'');
                        }else{
                            $criteria->join = 'INNER JOIN prestamos.credito_seguimiento AS c on c.id_credito = t.id';
                            $criteria->addCondition('c.actual = true AND c.fecha_registro::DATE =\''.$creation_time.'\'');
                        }
                        /*$criteria->addCondition('(SELECT count(*) FROM prestamos.credito_seguimiento WHERE id_credito=t.id '.(($this->id_estatus !='')?'AND id_estatus_credito='.$this->id_estatus:'').' AND '
                                . '(fecha_registro::DATE=\''.$creation_time.'\'))>0');*/
                    }
                }

                $criteria->order='t.fecha_registro desc';
                $_SESSION['datos_filtrados'] = new CActiveDataProvider($this, array(
                                                    'criteria'=>$criteria,
                                                    'pagination'=>false,
                                                ));

		return new CActiveDataProvider($this, array(
			'criteria'=>$criteria,
		));
	}
        public function searchPreNomina()
	{
		// @todo Please modify the following code to remove attributes that should not be searched.

		$criteria=new CDbCriteria;
                $criteria->with='idAsociado';

                if(!is_numeric($this->cedula))
                    $this->cedula =  NULL;

                if(!is_numeric($this->monto_credito))
                    $this->monto_credito =  NULL;



		$criteria->compare('id',$this->id);
		$criteria->compare('idasociado',$this->idasociado,true);
		$criteria->compare('id_tipo_credito',$this->id_tipo_credito);
		$criteria->compare('cuota_pagar',$this->cuota_pagar);
		$criteria->compare('taza_interes',$this->taza_interes);
		$criteria->compare('monto_credito',$this->monto_credito);
		$criteria->compare('cuenta',$this->cuenta,true);
		$criteria->compare('fecha_primer_descuento',$this->fecha_primer_descuento,true);
		$criteria->compare('fiador',$this->fiador);
		$criteria->compare('gastos_administrativo',$this->gastos_administrativo);
		$criteria->compare('blnborrado',$this->blnborrado);
		$criteria->compare('fecha_registro',$this->fecha_registro,true);

                $criteria->compare('cedula',$this->cedula);
		$criteria->compare('UPPER(nombre)',  strtoupper($this->nombre),true);
		$criteria->compare('UPPER(apellidos)',strtoupper($this->apellido),true);
		$criteria->compare('idunidad',$this->unidad);

                $criteria->addCondition('(SELECT count(*) FROM prestamos.credito_seguimiento WHERE id_credito=t.id  AND id_estatus_credito=3 )>0');
                //$criteria->addCondition('(SELECT count(*) FROM prestamos.pre_nomina_tabla_amortizacion WHERE id_credito=t.id)=0');

                $from = $to = '';
                if (count($this->fecha_registro_range)>=1) {
                    if (isset($this->fecha_registro_range['from'])) {
                        $from = $this->fecha_registro_range['from'];
                    }
                    if (isset($this->fecha_registro_range['to'])) {
                        $to= $this->fecha_registro_range['to'];
                    }
                }
                if ($from!='' || $to !='') {
                    if ($from!='' && $to!='') {
                        $from = date("d-m-Y", strtotime($from));
                        $to = date("d-m-Y", strtotime($to));
                        $criteria->addCondition('(SELECT count(*) FROM prestamos.credito_seguimiento WHERE id_credito=t.id  '.(($this->id_estatus !='')?'AND id_estatus_credito='.$this->id_estatus:'').' AND '
                                . '(fecha_registro::DATE >=\''.$from.'\' AND fecha_registro::DATE <=\''.$to.'\'))>0');

                    }
                    else {
                        if ($from!='') $creation_time = $from;
                        if ($to != '') $creation_time = $to;
                        $creation_time = date("d-m-Y", strtotime($creation_time));
                        $criteria->addCondition('(SELECT count(*) FROM prestamos.credito_seguimiento WHERE id_credito=t.id '.(($this->id_estatus !='')?'AND id_estatus_credito='.$this->id_estatus:'').' AND '
                                . '(fecha_registro::DATE=\''.$creation_time.'\'))>0');
                    }
                }

                $_SESSION['datos_filtrados'] = new CActiveDataProvider($this, array(
                                                    'criteria'=>$criteria,
                                                    'pagination'=>false,
                                                ));

		return new CActiveDataProvider($this, array(
			'criteria'=>$criteria,
		));
	}
        /**
         * Busca los creditos aprobados para el proceso de pagos masivos
         * @return \CActiveDataProvider
         */
        public function searchPagos()
	{
		// @todo Please modify the following code to remove attributes that should not be searched.

		$criteria=new CDbCriteria;
                $criteria->with='idAsociado';

                if(!is_numeric($this->cedula))
                    $this->cedula =  NULL;

                if(!is_numeric($this->monto_credito))
                    $this->monto_credito =  NULL;


                if (Yii::app()->user->checkAccess('usuario_asociado') && !Yii::app()->user->checkAccess('usuario_administrador') ){
                    $this->idasociado = Asociado::model()->find('cedula=:cedula',array(':cedula'=>CrugeUserI::model()->findByPk(Yii::app()->user->id)->cedula))->idasociado;
                }

                if(!is_numeric($this->cedula))
                    $this->cedula = NULL;

		$criteria->compare('id',$this->id);
		$criteria->compare('t.idasociado',$this->idasociado);
		$criteria->compare('id_tipo_credito',$this->id_tipo_credito);
		$criteria->compare('cuota_pagar',$this->cuota_pagar);
		$criteria->compare('taza_interes',$this->taza_interes);
		$criteria->compare('monto_credito',$this->monto_credito);
		$criteria->compare('cuenta',$this->cuenta,true);
		$criteria->compare('fecha_primer_descuento',$this->fecha_primer_descuento,true);
		$criteria->compare('fiador',$this->fiador);
		$criteria->compare('gastos_administrativo',$this->gastos_administrativo);
		$criteria->compare('blnborrado',$this->blnborrado);
		$criteria->compare('fecha_registro',$this->fecha_registro,true);

                $criteria->compare('cedula',$this->cedula);
		$criteria->compare('UPPER(nombre)',  strtoupper($this->nombre),true);
		$criteria->compare('UPPER(apellidos)',strtoupper($this->apellido),true);
		$criteria->compare('idunidad',$this->unidad);


                if(isset($this->id_estatus) && $this->id_estatus !='')
                    $criteria->addCondition('(SELECT count(*) FROM prestamos.credito_seguimiento WHERE id_credito=t.id AND id_estatus_credito='.$this->id_estatus.' AND actual= true)>0');



                $from = $to = '';
                if (count($this->fecha_registro_range)>=1) {
                    if (isset($this->fecha_registro_range['from'])) {
                        $from = $this->fecha_registro_range['from'];
                    }
                    if (isset($this->fecha_registro_range['to'])) {
                        $to= $this->fecha_registro_range['to'];
                    }
                }
                if ($from!='' || $to !='') {
                    if ($from!='' && $to!='') {
                        $from = date("d-m-Y", strtotime($from));
                        $to = date("d-m-Y", strtotime($to));
                        $criteria->addCondition('(SELECT count(*) FROM prestamos.credito_seguimiento WHERE id_credito=t.id  '.(($this->id_estatus !='')?'AND id_estatus_credito='.$this->id_estatus:'').' AND '
                                . '(fecha_registro::DATE >=\''.$from.'\' AND fecha_registro::DATE <=\''.$to.'\'))>0');

                    }
                    else {
                        if ($from!='') $creation_time = $from;
                        if ($to != '') $creation_time = $to;
                        $creation_time = date("d-m-Y", strtotime($creation_time));
                        $criteria->addCondition('(SELECT count(*) FROM prestamos.credito_seguimiento WHERE id_credito=t.id '.(($this->id_estatus !='')?'AND id_estatus_credito='.$this->id_estatus:'').' AND '
                                . '(fecha_registro::DATE=\''.$creation_time.'\'))>0');
                    }
                }

                $_SESSION['datos_filtrados'] = new CActiveDataProvider($this, array(
                                                    'criteria'=>$criteria,
                                                    'pagination'=>false,
                                                ));

		return new CActiveDataProvider($this, array(
			'criteria'=>$criteria,
		));
	}







        public function calcularHaberesDisponibles($idAsociado, $idTipo){
                $modelTipoCredito = TipoCredito::model()->find('id=:id',array(':id'=>$idTipo));
                if($modelTipoCredito && $modelTipoCredito->porcentaje_disponibilidad !='')
                    $porcentaje = $modelTipoCredito->porcentaje_disponibilidad;
                else
                    $porcentaje = 80;

                $haberes = ReporteHaberes::model()->find('idasociado=:ida', array(':ida' => $idAsociado));
                $modelMontoTotalFiador = ReporteCreditos::model()->getTotalMontoFiador($idAsociado);
                $modelMontoTotalDeuda = ReporteCreditos::model()->getTotalMontoDeuda($idAsociado);


                return  round(($haberes->total_haberes * ($porcentaje/100)) - ($modelMontoTotalDeuda + $modelMontoTotalFiador),2);


        }




        public function calculoGastoAdministrativoAfianzadora(){

            //la clasificacion del credito mayores que 1 son los que tienen fianza externa
            $modelTipoCredito = TipoCredito::model()->findByPk( $this->id_tipo_credito);
            if($modelTipoCredito->id_clasificacion_tipo_credito==2){
                $montoSolicitado =  str_replace('.', '', $this->monto_credito);
                $montoSolicitado =str_replace(',', '.',$montoSolicitado);

                $diaSemana=date('w', strtotime(date('d-m-Y')));
                $modelPeriodicidad = PeriodicidadAfianzadora::model()->find('dia=:dia',array(':dia'=>$diaSemana));
                if($modelPeriodicidad){
                    if($modelPeriodicidad->id_periodicidad ==1){
                         $this->id_afianzadora = $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
                            $this->id_afianzadora  =  $modelUltimoCredito->id_afianzadora+1;
                            if($this->id_afianzadora>2)
                                $this->id_afianzadora = 1;
                         }
                         else{
                            $this->id_afianzadora = $modelPeriodicidad->id_afianzadora;
                         }
                    }


                    $gastosAdministrativoAfianzadora = GastosAdministrativosAfianzadora::model()->find('duracion=:duracion AND idafianzadora=:idafianzadora AND :monto between rango_uno and rango_dos',
                                                                                                array(':duracion'=>$modelTipoCredito->duracion_credito,':idafianzadora'=> $this->id_afianzadora,':monto'=>$montoSolicitado));
                    if($gastosAdministrativoAfianzadora){
                        $this->gastos_administrativos_afianzadora = $gastosAdministrativoAfianzadora->garantia;
                    }
                    else{
                        $gastosAdministrativoAfianzadora = GastosAdministrativosAfianzadora::model()->find('duracion=:duracion AND idafianzadora=:idafianzadora AND porcentaje IS NOT NULL',
                                                                                                array(':duracion'=>$modelTipoCredito->duracion_credito,':idafianzadora'=> $this->id_afianzadora));
                        if($gastosAdministrativoAfianzadora){
                             $this->gastos_administrativos_afianzadora = ($montoSolicitado* $gastosAdministrativoAfianzadora->porcentaje)/100;

                        }
                    }

                }

            }
        }

        public function estaPrestamoNominaPago(){
            $model = PagosMasivosDetalle::model()->find('id_proceso=:id AND id_nombre_proceso = 1 AND id_estatus_detalle in(1,2)',[':id'=>$this->id]);
            if($model)
                return true;
            return false;
        }
        public function afterFind(){
            $model = CreditoSeguimiento::model()->find('id_credito=:id AND actual =  TRUE',array(':id'=>  $this->id));
            if($model){
                $this->nombre_estatus = EstatusCredito::model()->findByPk($model->id_estatus_credito)->nombre_estatus;
                $this->id_estatus = $model->id_estatus_credito;
                $this->fecha_estatus = $model->fecha_registro;

                if ($model->id_estatus_credito == 1 || $model->id_estatus_credito == 6 || $model->id_estatus_credito == 8) {

                    $model = CreditoSeguimiento::model()->find('id_credito=:id AND (id_estatus_credito =1 OR id_estatus_credito =6 OR id_estatus_credito =8)',array(':id'=>  $this->id));
                    if($model){
                        $this->fecha_estatus = $model->fecha_registro;
                    }
                }

                $f_sol = CreditoSeguimiento::model()->find('id_credito=:id AND id_estatus_credito in (1,6,8)',array(':id'=>  $this->id));
                if (!empty($f_sol->fecha_registro)) {

                    $this->fecha_solicita = $f_sol->fecha_registro;
                    //echo "<pre>";print_r($this->fecha_solicita);echo "\n";print_r($f_sol);exit;
                }else{

                    $this->fecha_solicita = '';
                }
            }
            /*$model = CreditoSeguimiento::model()->find('id_credito=:id AND (id_estatus_credito =1 OR id_estatus_credito =6 OR id_estatus_credito =8)',array(':id'=>  $this->id));
            if($model){
                $this->fecha_solicitud = $model->fecha_registro;
                //echo "<pre>";print_r($this->id);exit;
            }*/

            return parent::afterFind();
        }
         public function beforeSave(){
            $this->monto_credito =  str_replace('.', '', $this->monto_credito);
            $this->monto_credito=str_replace(',', '.', $this->monto_credito);

            $this->taza_interes =  str_replace('.', '', $this->taza_interes);
            $this->taza_interes=str_replace(',', '.', $this->taza_interes);

            if($this->cuota_pagar=='')$this->cuota_pagar = NULL;
            if($this->gastos_administrativo=='')$this->gastos_administrativo = NULL;
            if($this->gastos_administrativos_afianzadora=='')$this->gastos_administrativos_afianzadora = NULL;
            if($this->monto_credito=='')$this->monto_credito = NULL;
            if($this->taza_interes=='')$this->taza_interes = NULL;

            if ($this->isNewRecord==true) {

                if($this->refinanciado ==2 && !$this->reestructuracion_tabla ){

                    $this->monto_credito += $this->monto_credito_anterior;

                }

            }

            if($this->id_credito_padre !='')
                $this->id_credito_padre = NULL;
           // $this->monto_credito_depositar = $this->monto_credito - $this->monto_credito_anterior;

            // $this->idcredito  = NULL;

            if($this->fecha_registro =='')
                $this->fecha_registro=date('d-m-Y');

            if($this->fecha_primer_descuento ==''){
                $this->fecha_primer_descuento= NULL;
            }

            return parent::beforeSave();
        }

//        protected function beforeSave() {
//        if ($this->isNewRecord) {
//            }
//                parent::beforeSave();
//             return true;
//            }
//

    public function bancoCuentaContable($id_banco)
    {
        return Yii::app()->getDb()->createCommand('
            SELECT clvcuenta
            FROM configuracion.param_bancos
            WHERE id=:id AND estatus IS TRUE;
        ')->bindValue('id', $id_banco)->queryRow()['clvcuenta'];
    }


    // public static function getDetallesCreditos($opcionAdm = TRUE, $idAsociado, $id_estatus = NULL, $cedula  = NULL, $tipo_credito = NULL, $opcion = NULL){
    public static function getDetallesCreditos($data = []){

        $idAsociado = ((array_key_exists('idAsociado',$data))?$data['idAsociado']:NULL);

        $id_estatus = ((array_key_exists('id_estatus',$data))?$data['id_estatus']:NULL);

        $cedula = ((array_key_exists('cedula',$data))?$data['cedula']:NULL);

        $tipo_credito = ((array_key_exists('tipo_credito',$data))?$data['tipo_credito']:NULL);

        $opcion = ((array_key_exists('opcion',$data))?$data['opcion']:NULL);

        $prestamos_excluidos = ((array_key_exists('prestamos_excluidos',$data))?$data['prestamos_excluidos']:NULL);

        $sql = 'SELECT idcredito,
                       nombre_titulo AS categoria,
                       id_tipo_credito,
                       tc.descripcion as plazo_prestamo,
                       c.monto_credito as prestamo,
                       c.fecha_registro,
                       (
                            select coalesce(sum(monto),0)
                            from (
                                select case coalesce(cdc.id::boolean, false)
                                        when false then coalesce(cta.monto_capital,0)
                                        when true then coalesce(cdc.capital_cobro,0)
                                    end as monto
                                from prestamos.credito_tabla_amortizacion cta
                                inner join prestamos.credito cx on cx.id=cta.idcredito
                                    and cx.id=c.id
                                    and cx.blnborrado is false
                                left join prestamos.datos_txt_tabla_amortizacion dtta on dtta.id_tabla_amortizacion=cta.id
                                    and dtta.actual is true
                                left join prestamos.cobro_diferencial_cuota cdc on cdc.id_proceso=dtta.id
                                    and cdc.blnborrado is false
                                where cta.blnborrado IS FALSE
                                    and cta.id_estatus_cuota is null
                            ) d
                        ) as deuda_actual,
                       sc.id_estatus_credito ,
                       nombre_estatus,
                       id_tipo_nomina,
                       COALESCE(cuotas_pagadas::numeric, 0::numeric) AS cuotas_pagadas
                FROM prestamos.credito c
                LEFT JOIN (
                    SELECT idcredito, 
                           sum(monto_capital) as deuda_actual 
                    FROM prestamos.credito_tabla_amortizacion
                    WHERE blnborrado = false 
                        AND (id_estatus_cuota IS NULL OR id_estatus_cuota in(1,3,6,7,8,9)) 
                    GROUP BY idcredito
                ) as cta ON cta.idcredito = c.id';

        $sql .=(($cedula > 0 )?'LEFT JOIN asociado AS a ON c.idasociado = a.idasociado':'');

        $sql .= '
                LEFT JOIN prestamos.tipo_credito as tc ON c.id_tipo_credito = tc.id
                LEFT JOIN ( SELECT cancelado.idcredito AS id_credito, count(*) AS cuotas_pagadas
                           FROM prestamos.credito_tabla_amortizacion cancelado
                          WHERE cancelado.blnborrado = false AND (COALESCE(cancelado.id_estatus_cuota::numeric, 0::numeric) <> ALL (ARRAY[0::numeric, 1::numeric, 3::numeric, 6::numeric, 7::numeric, 8::numeric, 9::numeric]))
                          GROUP BY cancelado.idcredito) cuotaspagadas ON cuotaspagadas.id_credito = c.id

                LEFT JOIN prestamos.titulo_tipo_credito ttc ON tc.id_titulo_tipo_credito = ttc.id
                LEFT JOIN prestamos.credito_seguimiento as sc ON c.id = sc.id_credito AND actual = true
                LEFT JOIN prestamos.estatus_credito as ec ON sc.id_estatus_credito = ec.id
                WHERE true ';

        if ($prestamos_excluidos !="" )

             $sql .= ' AND tc.id IN('.$prestamos_excluidos.') ';

        $sql .=((!is_null($id_estatus))?' AND sc.id_estatus_credito ='.$id_estatus:'');
        $sql .=((!is_null($idAsociado))?' AND c.idasociado ='.$idAsociado:'');
        $sql .=(($cedula > 0)?' AND cedula='.$cedula :'');

        if($opcion > 0){

            if($opcion ==1){
                $sql .=' AND tc.refinanciamiento IS TRUE ';

                if($tipo_credito > 0)

                    $sql .=' AND refinanciamiento_conversion_tipo ilike \'%'.$tipo_credito.'"%\'';

            }
            else{

                $sql .=' AND tc.reestructuracion IS TRUE ';

                if($tipo_credito > 0)

                    $sql .=' AND reestructuracion_conversion_tipo ilike \'%"'.$tipo_credito.'"%\'';
            }
        }

        return Yii::app()->db->createCommand($sql)->queryAll();;/// $this->VistaHaberesSocio($modelAsoci
    }

    public function pagarCuotasPrestamosAnteriores()
    {
        $prestamos = json_decode($this->prestamos_seleccionados);

        if (! $prestamos) {
            return;
        }

        foreach ($prestamos as $prestamo) {
            CreditoTablaAmortizacion::model()->updateAll([
                'id_estatus_cuota' => $this->getEstatusCuota()
            ], '(id_estatus_cuota IS NULL OR id_estatus_cuota in (1,3,6,7,8,9)) and idcredito=:id', [
                'id' => $prestamo->id_credito
            ]);
        }
    }

    public function getEstatusCuota()
    {
        switch ($this->refinanciado) {
            case 1:
                return 4;
            case 2:
                return 5;
        }
    }


    public function generarFechaDescuentos($datos = [] ){

        if($datos['tipo_cuota'] == 'O'){

            #####################3 SEMANAL #################################3
            if($this->id_tipo_nomina ==3)
                $periodicidad =' week';

            //nomina quincenal
            elseif($this->id_tipo_nomina ==2){

                $nroDia = date("z", strtotime($datos['ultima_fecha'])); //Coloca la fecha que desees

                $numeroQincenas = (floor($nroDia / 15)+1) % 2; //Averiguo el número de quincena para la fecha

                $periodicidad =' month';
            }

            //nomina mensual
            else
                $periodicidad =' month';


            $nuevafecha = '';

            $i = 1;

            while ($nuevafecha == '') {

                if( $this->id_tipo_nomina == 2){

                    if( ( $i % 2 ) ==0 ){

                        if( $numeroQincenas ==0 ){

                            $fecha = new DateTime(date('Y-m-d', strtotime('+'.( $i%2 ).' months', strtotime(date('Y-m-d')))));

                            $fecha->modify('first day of this month');

                            $nuevafechaCalculada = $fecha->format('Y-m-d');


                        }
                        else{

                            $nvFecha = date('Y-m',strtotime($datos['ultima_fecha'])).'-15';

                            $nuevafechaCalculada = date ( 'Y-m-d' ,strtotime ( '+'.( $i%2 ).' months' , strtotime ( $nvFecha ) ) );

                        }

                    }
                    else{
                        if( $numeroQincenas ==0 ){


                            $nvFecha = date('Y-m',strtotime($datos['ultima_fecha'])).'-15';

                            $nuevafechaCalculada = date ( 'Y-m-d' ,strtotime ( '+'.( $i%2 ).' months', strtotime ( $nvFecha ) ) );

                        }
                        else{

                            $fecha = new DateTime(date('Y-m-d', strtotime('+'.( $i/2 ).' months', strtotime(date('Y-m-d')))));

                            $fecha->modify('first day of this month');

                            $nuevafechaCalculada = $fecha->format('Y-m-d');

                        }

                    }

                }
                else{

                    $nuevafechaCalculada = date ( 'Y-m-d' ,strtotime ( '+'.$i.$periodicidad  , strtotime ( $datos['ultima_fecha'] ) ));
                }


                $modelTipoNomina = TipoNominaPeriodo::model()->find('id_tipo_nomina=:id_tipo_nomina AND :fecha BETWEEN fecha_desde AND fecha_hasta',[':id_tipo_nomina'=>$this->id_tipo_nomina, ':fecha'=>$nuevafechaCalculada]);

                if($modelTipoNomina){

                    $model = DatosPreNominaCredito::model()->with('preNominaSeguimientos')->together(true)->find('id_tipo_momina_periodo=:id_tipo_momina_periodo AND actual = true and id_estatus_pre_nomina !=9 AND id_unidad=:id_unidad',[':id_tipo_momina_periodo'=>$modelTipoNomina->id,':id_unidad'=>$this->idAsociado->idunidad]);

                    if(!$model)

                        $nuevafecha = $nuevafechaCalculada;

                }
                else{

                        $nuevafecha = $nuevafechaCalculada;
                }

                $i++;
            }

            return $nuevafecha;




        }
        else{

            $numeroCuotasAnuales = TipoCreditoCuotasEspeciales::model()->count('id_tipo_credito=:id_tipo_credito',[':id_tipo_credito'=>$this->id_tipo_credito]);


            if($numeroCuotasAnuales == 1){

                $nuevafecha = '';

                $i = 1;
                while ($nuevafecha == '') {

                    $nuevafechaCalculada = date ( 'Y-m-d' ,strtotime ( '+'.$i.' year' , strtotime ( $datos['ultima_fecha'] ) ));

                    $modelTipoNomina = TipoNominaPeriodo::model()->find('id_tipo_nomina=:id_tipo_nomina AND :fecha BETWEEN fecha_desde AND fecha_hasta',[':id_tipo_nomina'=>$this->id_tipo_nomina, ':fecha'=>$nuevafechaCalculada]);

                    if($modelTipoNomina){

                        $model = DatosPreNominaCredito::model()->with('preNominaSeguimientos')->together(true)->find('id_tipo_momina_periodo=:id_tipo_momina_periodo AND actual = true and id_estatus_pre_nomina !=9 AND id_unidad=:id_unidad',[':id_tipo_momina_periodo'=>$modelTipoNomina->id,':id_unidad'=>$this->idAsociado->idunidad]);

                        if(!$model)

                            $nuevafecha = $nuevafechaCalculada;

                    }
                    else{

                            $nuevafecha = $nuevafechaCalculada;
                    }
                }

                return $nuevafecha;
            }
            else{

                $annio = date ( 'Y' ,strtotime($datos['ultima_fecha'])  );

                $nuevafecha = '';
                $numeroCuotaEspecial = 0;
                while ($nuevafecha =='') {

                    $numeroCuotaEspecial++;

                    if($numeroCuotaEspecial> $numeroCuotasAnuales){

                        $numeroCuotaEspecial = 1;

                        $annio++;

                    }

                    $modelFechaAnual = TipoCreditoCuotasEspeciales::model()->find('numero_cuota=:numero_cuota AND id_tipo_credito=:id_tipo_credito',
                                                                                [':numero_cuota'=>$numeroCuotaEspecial, ':id_tipo_credito'=>$this->id_tipo_credito]);

                    $nuevafechaCalculada = $annio .'-'.date('m-d',strtotime($modelFechaAnual->fecha_cuota));

                    $modelTipoNomina = TipoNominaPeriodo::model()->find('id_tipo_nomina=:id_tipo_nomina AND :fecha BETWEEN fecha_desde AND fecha_hasta',[':id_tipo_nomina'=>$this->id_tipo_nomina, ':fecha'=>$nuevafechaCalculada]);

                    if($modelTipoNomina){

                        $model = DatosPreNominaCredito::model()->with('preNominaSeguimientos')->together(true)->find('id_tipo_momina_periodo=:id_tipo_momina_periodo AND actual = true and id_estatus_pre_nomina !=9 AND id_unidad=:id_unidad',[':id_tipo_momina_periodo'=>$modelTipoNomina->id,':id_unidad'=>$this->idAsociado->idunidad]);

                        if(!$model)

                            $nuevafecha = $nuevafechaCalculada;

                    }
                    else{

                            $nuevafecha = $nuevafechaCalculada;
                    }
                }

                $nuevafecha = date("Y-m-d",strtotime ( '-2 day' , strtotime ( $nuevafecha ) ) );


                return $nuevafecha;
            }
        }
    }

    public function validacionFechaComprobante()
    {
        Yii::import('application.modules.contable.models.*', true);
        return ParamEscenarios::fechaComprobante(['pago_prestamos' => 4]) && $this->hasComprobante();
    }

    public function hasComprobante()
    {
        return $this->getUltimoComprobante() == true;
    }

    public function getFechaComprobante()
    {
        if (! $this->hasComprobante()) {
            return;
        }

        return $this->getUltimoComprobante()->fecha_comprobante;
    }

    public function getUltimoComprobante()
    {
        $comprobante = Yii::app()->getDb()->createCommand('
            select c.id, c.fecha_comprobante, pp.id_banco, pp.id as id_proceso_pago, pp.id_nombre_proceso, pp.referencia
            from prestamos.credito p
            inner join contable.proceso_pago pp on pp.id_proceso=p.id
                and pp.id_nombre_proceso=:tipo
                AND pp.actual IS TRUE
                AND pp.blnborrado IS FALSE
            inner join contable.proceso_comprobante pc on pc.id_titulo_proceso=:tipo
                and pc.id_proceso=p.id
                and pc.id_pago=pp.id
            inner join contable.comprobante c on c.id=pc.id_comprobante
            where p.id=:prestamo
        ')->bindValues([
            'tipo' => 1,
            'prestamo' => $this->id,
        ])->queryRow();

        if (! $comprobante) {
            return false;
        }

        return (object) $comprobante;
    }

    public function getUltimoComprobanteDetalle()
    {
        return Yii::app()->getDb()->createCommand('
            select dc.id, dc.id_cuenta, dc.referencia, dc.clv_comprobante, dc.monto_debe as debe, dc.monto_haber as haber
            from prestamos.credito p
            inner join contable.proceso_pago pp on pp.id_proceso=p.id
                and pp.id_nombre_proceso=:tipo
                AND pp.actual IS TRUE
                AND pp.blnborrado IS FALSE
            inner join contable.proceso_comprobante pc on pc.id_titulo_proceso=:tipo
                and pc.id_proceso=p.id
                and pc.id_pago=pp.id
            inner join contable.comprobante c on c.id=pc.id_comprobante
            inner join contable.det_comprobante dc on dc.clv_comprobante=c.id
            where p.id=:prestamo
        ')->bindValues([
            'tipo' => 1,
            'prestamo' => $this->id,
        ])->queryAll();
    }

    public function nominaPagoAsociada()
    {
        return PagosMasivosDetalle::model()->exists('id_proceso=:id AND id_nombre_proceso=1 AND id_estatus_detalle in(1,2)', [
            'id' => $this->id
        ]);
    }

    public function cuotasModificadas()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT exists(
                SELECT 1
                FROM prestamos.credito_tabla_amortizacion t
                WHERE idcredito=:id
                    AND id_estatus_cuota IS NOT NULL
            )
        ')->bindValue('id', $this->id)->queryScalar();
    }

    public function hasLiquidacion()
    {
        return Yii::app()->getDb()->createCommand('
            select exists(
                select 1
                from retiro.liquidacion l
                inner join retiro.estatus_liquidacion el on el.id_liquidacion=l.id
                    and el.actual is true
                inner join retiro.estatus_retiro ep on ep.id=el.id_estatus_liquidacion
                where l.idasociado=:asociado
                    and id_estatus_liquidacion in (1,2,4)
            )
        ')->bindValues([
            'asociado' => $this->idasociado
        ])->queryScalar();
    }

    public function reversarPago()
    {
        $transaction = Yii::app()->getDb()->beginTransaction();
        try {
            if ($this->hasLiquidacion()) {
                throw new Exception("No se puede reversar préstamo, el asociado <strong>{$this->idAsociado->nombre()}</strong> tiene una liquidación.");
            }

            // 4. no permitir reversar creditos que tenga cuotas con estatus diferente de NULL
            if ($this->cuotasModificadas()) {
                throw new Exception('El credito tiene cuotas modificadas y no se puede reversar.');
            }

            // 5 Reversar comprobante contable
            if ($this->hasComprobante()) {
                $comprobante = $this->getUltimoComprobante();

                if (strtotime($this->fecha_comprobante) < strtotime($comprobante->fecha_comprobante)) {
                    $this->addError('fecha_comprobante', 'La fecha de comprobante no puede ser menor la fecha de contabilización.');
                    throw new Exception('La fecha de comprobante es invalida.', 10);
                }

                Yii::import('application.modules.contable.models.comprobantes.*', true);
                Yii::import('application.modules.contable.models.comprobantes.prestamo.*', true);
                (new ReversoIndividual($this, (object) [
                    'id' => $comprobante->id_proceso_pago,
                    'id_banco' => $comprobante->id_banco,
                    'id_nombre_proceso' => $comprobante->id_nombre_proceso,
                    'referencia' => $comprobante->referencia,
                    'fecha_pago' => $comprobante->fecha_comprobante,
                ]))->contabilizar();
            }

            // 1 Devolver el credito a estatus'aprobado'
            $this->reversarCredito();

            // 2 reversar prestamos anteriores a bloqueado por reestructuracion/refinanciamiento
            $this->reversarCreditosAnteriores();

            $this->reversarComprobantePago();

            $transaction->commit();
            Yii::app()->user->setFlash('success', 'Préstamo reversado correctamente.');

            return true;
        } catch(Exception $e) {
            $transaction->rollback();

            if ($e->getCode() == 10) {
                return false;
            }

            Yii::app()->user->setFlash('error', $e->getMessage());

            return false;
        }
    }

    public function reversarComprobantePago()
    {
        if ($this->procesoPagoCount == 0) {
            return;
        }

        ProcesoPago::model()->updateAll([
            'actual' => false,
            'blnborrado' => true,
        ],
        'id_proceso=:id and id_nombre_proceso=1',
        [
            'id' => $this->id
        ]);
    }

    public function reversarCredito()
    {
        CreditoSeguimiento::model()->updateAll(['actual' => false], 'id_credito=:id', ['id' => $this->id]);

        $modelCreditoAnterior = new CreditoSeguimiento();
        $modelCreditoAnterior->id_credito = $this->id;
        $modelCreditoAnterior->id_estatus_credito = 2;

        return $modelCreditoAnterior->save();
    }

    public function reversarCreditosAnteriores()
    {
        $prestamos = json_decode($this->prestamos_seleccionados);

        if (! $prestamos) {
            return false;
        }

        Yii::import('application.modules.prestamo.models.*', true);
        foreach ($prestamos as $prestamo) {
            $model = Credito::model()->findByPk($prestamo->id_credito);

            CreditoSeguimiento::model()->updateAll(['actual' => false], 'id_credito=:id', [':id' => $model->id]);
            $modelCreditoSeguimiento = new CreditoSeguimiento();
            $modelCreditoSeguimiento->id_credito = $model->id;
            $modelCreditoSeguimiento->id_estatus_credito = $this->getEstatusTipoCredito();

            if (! $modelCreditoSeguimiento->save()) {
                throw new Exception('No se pudierón reversar prestamos anteriores.');
            }

            // 3 Reversar las cuotas de los prestamos a su estatus anterior
            $cuotas = CreditoTablaAmortizacion::model()->findAll([
                'condition' => 'idcredito=:id AND id_estatus_cuota IN (4, 5)',
                'params' => [
                    'id' => $model->id
                ]
            ]);

            foreach ($cuotas as $cuota) {
                $cuota->id_estatus_cuota = CuotaSeguimiento::lastStatus($cuota->id);
                $cuota->save();
            }
        }
    }

    public function getEstatusTipoCredito()
    {
        switch ($this->refinanciado) {
            case 1:
                // Bloqueado por refinanciamiento
                return 7;
            case 2:
                // Bloqueado por reestructuración
                return 9;
        }
    }

    public function getTipoSubproceso()
    {
        switch ($this->refinanciado) {
            case 1:
                // Pagada por refinanciamiento
                return 4;
            case 2:
                // Pagada por reestructuración
                return 5;
        }
    }
    
    public function gestionarCuotasNoAfectadas()
    {
        return (new CuotasNoAfectadas($this))->gestionar();
    }

    public function gestionarCuotasAfectadas()
    {
        return (new CuotasAfectadas($this))->gestionar();
    }

    public function hasBloqueoAnticipado()
    {
        return $this->idTipoCredito->bloqueo_anticipado_prestamos && $this->scenario === 'aprobacionSolicitud';
    }

    public function hasAjusteHaber()
    {
        return $this->ajuste_haberes !== null;
    }

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

    public function getDescripcion()
    {
        $descripcion = $this->procesoPago;
        if ($descripcion) {
            $descripcion = $descripcion->getDescripcion();
        } else {
            $descripcion = '';
        }

        return vsprintf("%s Tipo de crédito: %s Monto: %s", [
            $descripcion,
            $this->idTipoCredito->descripcion,
            Yii::app()->format->number($this->gastos_administrativos_afianzadora)
        ]);
    }
}
