<?php

/**
 * This is the model class for table "retiro.retiro_parcial".
 *
 * The followings are the available columns in table 'retiro.retiro_parcial':
 * @property integer $id
 * @property integer $idasociado
 * @property double $monto_total_disponible
 * @property double $monto_solicitado
 * @property double $monto_aprobado
 * @property boolean $blnborrado
 * @property double $monto_gasto_administrativo
 * @property string $cuenta
 * @property string $monto_retiro_asociado
 * @property string $monto_retiro_patrono
 * @property string $monto_pagar
 *
 * The followings are the available model relations:
 * @property Asociado $idasociado
 */
class RetiroParcial extends CActiveRecord
{
    public $cedula, $nombre, $apellido, $idUnidad, $fechaSolicitud, $idEstatus, $nombre_estatus, $fecha_estatus, $fecha_solicitud, $fecha_solicitud_range = array(), $fecha_estatus_range = array();
    public $fecha_solicita, $fecha_solicita_range = array();
    public $referencia;
    public $idComprobantePago;
    public $tituloProceso;
    public $fecha_comprobante;
    public $prestamos_seleccionado;
    public $observacion;
    public $fecha_aprobacion;

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

	/**
	 * @return array validation rules for model attributes.
	 */
	public function rules()
    {
        return [
            ['cedula', 'required', 'on' => ['SolicitudAdministrador', 'PrestamoRetiroParcialAdministrador']],
            ['cedula', 'length', 'min' => 3, 'max' => 10, 'on' => ['SolicitudAdministrador', 'PrestamoRetiroParcialAdministrador']],
            ['cedula', 'buscarAsociado', 'on' => ['SolicitudAdministrador', 'PrestamoRetiroParcialAdministrador']],
            ['idasociado, monto_total_disponible,monto_solicitado, cuenta', 'required'],
            ['idasociado', 'validarSolicitudRetiro', 'on' => ['SolicitudAdministrador', 'SolicitudRetiroParcial', 'PrestamoRetiroParcialAdministrador', 'PrestamoRetiroParcialAsociado']],
            ['monto_aprobado', 'required', 'on' => 'aprobacionSolicitud'],
            ['monto_aprobado', 'ValidarMontoAprobado', 'on' => 'aprobacionSolicitud'],
            ['monto_pagar', 'ValorPositivo', 'on' => 'aprobacionSolicitud'],
            ['cuenta', 'length', 'min' => 20, 'max' => 20],
            ['idasociado, cedula', 'numerical', 'integerOnly' => true],
            ['monto_total_disponible, monto_gasto_administrativo', 'numerical'],
            ['monto_solicitado', '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', ],
            ['monto_solicitado', 'validarMontoSolicitado', 'on' => ['SolicitudAdministrador', 'SolicitudRetiroParcial']],
            ['monto_solicitado', 'validarMontoSolicitadoPagoCredito', 'on' => ['PrestamoRetiroParcialAdministrador', 'PrestamoRetiroParcialAsociado']],
            ['monto_aprobado', 'montoPermitido', 'on' => ['SolicitudAdministrador', 'SolicitudRetiroParcial', 'PrestamoRetiroParcialAdministrador', 'PrestamoRetiroParcialAsociado']],
            ['blnborrado, cedula, monto_aprobado, observacion, fecha_comprobante', 'safe'],
            // The following rule is used by search().
            ['id, idasociado, monto_total_disponible, monto_solicitado, monto_aprobado, blnborrado,idEstatus, monto_gasto_administrativo, cuenta, cedula, nombre,apellido, idUnidad, fechaSolicitud, fecha_estatus, fecha_estatus_range, fecha_solicita, fecha_solicita_range', '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(
			'idAsociado' => array(self::BELONGS_TO, 'Asociado', 'idasociado'),
            'estatusRetiroParcial' => array(self::HAS_MANY, 'EstatusRetiroParcial', 'id_retiro_parcial'),
            'procesoPago' => [self::HAS_ONE, 'ProcesoPago', 'id_proceso', 'condition' => 'id_nombre_proceso=2 AND actual IS TRUE AND blnborrado IS FALSE'],
            'procesoPagoCount' => [self::STAT, 'ProcesoPago', 'id_proceso', 'condition' => 'id_nombre_proceso=2 AND blnborrado IS FALSE']
		);
	}

	/**
	 * @return array customized attribute labels (name=>label)
	 */
	public function attributeLabels()
	{
		return array(
			'id' => 'ID',
			'idasociado' => 'Cedula',
			'monto_total_disponible' => 'Monto aportes',
			'monto_solicitado' => '<b>Monto solicitud</b>',
			'monto_aprobado' => 'Monto Aprobado',
            'monto_pagar' => 'Monto a pagar',
			'blnborrado' => 'Blnborrado',
			'monto_gasto_administrativo' => 'Gasto Administrativo',
			'cuenta' => 'Cuenta',
			'cedula' => 'Cédula',
			'nombre' => 'Nombres',
			'apellido' => 'Apellidos',
			'idUnidad' => 'Unidad',
			'idEstatus' => 'Estatus de la solicitud',
            'fecha_solicita'=>'Fecha solicitud',
            'fecha_estatus'=>'Fecha estatus'
		);
	}

        public function validarEjercioContable($id){
            Yii::import('application.modules.contable.models.*',true);
           $ejerciciocontable=  EjerciciosContables::model()->find("estatus=1");
           $mensaje='';
                  if (!isset($ejerciciocontable->id)){
                     $mensaje.="No hay ningún ejercicio contable<strong> abierto</strong> deberá crearlo o seleccionarlo para continuar.<br/>";
                  }
            return $mensaje;
        }

        public function validarMontoSolicitado() {
            if (!$this->hasErrors('monto_solicitado')) {
                $montoSolcitado =  str_replace('.', '', $this->monto_solicitado);
                $montoSolcitado=str_replace(',', '.',$montoSolcitado);
                $this->monto_total_disponible = round($this->monto_total_disponible, 2);

                if($this->scenario )
                if ($montoSolcitado > $this->monto_total_disponible){
                    $this->addError(
                        'monto_solicitado',
                        'Monto solicitado ('.$this->monto_solicitado.') no puede ser mayor al monto disponible ('.number_format ($this->monto_total_disponible,2,',','.').')'
                    );
                }
            }
        }

        public function ValorPositivo () {

            if (!$this->hasErrors('monto_pagar')  && $this->monto_pagar != '') {
                $monto_pagar=str_replace(',', '.',str_replace('.', '', $this->monto_pagar));

                if ($monto_pagar < 0){
                    $this->addError('monto_aprobado', 'El monto aprobado no cubre los gastos y/o comisiones.');
                }
            }
        }

        public function validarMontoSolicitadoPagoCredito () {
            if (!$this->hasErrors('monto_solicitado')  && $this->saldo_deudor > 0) {
                $montoSolcitado=str_replace(',', '.',str_replace('.', '', $this->monto_solicitado));

                if ($this->saldo_deudor > $montoSolcitado){
                    $this->addError('monto_solicitado', 'El monto solicitado (' . $this->monto_solicitado . ') es menor que el '
                            . 'monto de los préstamos seleccionado (' . number_format ($this->saldo_deudor,2,',','.') . ')');
                }
            }
        }

        public function ValidarMontoAprobado () {
            if (!$this->hasErrors('monto_aprobado')  && $this->saldo_deudor > 0) {
                $monto_aprobado=str_replace(',', '.',str_replace('.', '', $this->monto_aprobado));

                if ($this->saldo_deudor > $monto_aprobado){
                    $this->addError('monto_aprobado', 'El monto aprobado (' . $this->monto_aprobado . ') es menor que el '
                            . 'monto de los préstamos seleccionado (' . number_format ($this->saldo_deudor,2,',','.') . ')');
                }
            }
        }

    public function montoPermitido()
    {
        if (! $this->hasErrors('monto_solicitado') && ! $this->hasErrors('idasociado')) {
            Yii::import('application.modules.aportes.models.Disponibilidad');

            $confRP = ConfRetiroParcial::model()->find();
            $montoSolcitado = str_replace('.', '', $this->monto_solicitado);
            $montoSolcitado = str_replace(',', '.', $montoSolcitado);

            $this->monto_total_disponible = (new Disponibilidad([
                'asociado' => $this->idasociado,
                'proceso' => 2,
                'porcentaje_disponibilidad' => 100,
            ]))->formula('T.total');

            if ($this->scenario == 'SolicitudAdministrador' || $this->scenario == 'PrestamoRetiroParcialAdministrador') {
                $montoSolicitud = '';
                if ($confRP->opcion_administrador == 1) {
                    if ($confRP->monto_maximo_administrador != '') {
                        $montoSolicitud = $confRP->monto_maximo_administrador;
                    }
                } else {
                    if ($confRP->porcentaje_maximo_asociado != '') {
                        $montoSolicitud = (new Disponibilidad([
                            'asociado' => $this->idasociado,
                            'proceso' => 2,
                            'porcentaje_disponibilidad' => $confRP->porcentaje_maximo_asociado,
                        ]))->formula('T.total');
                    }
                }

                if ($this->scenario == 'SolicitudAdministrador' || $this->scenario == 'PrestamoRetiroParcialAdministrador') {
                    if ($montoSolicitud > 0 && $montoSolcitado > $montoSolicitud) {
                        $this->addError('monto_solicitado', 'El monto solicitado ('.$this->monto_solicitado.') es mayor que el '
                        .'monto disponible por solicitud ('.number_format($montoSolicitud, 2, ',', '.').')');
                    }
                }

                $montoBloqueo = '';
                if ($confRP->opcion_haberes_administrador == 1) {
                    if ($confRP->monto_bloqueo_haberes_administrador != '') {
                        $montoTotal = $montoSolcitado + $confRP->monto_bloqueo_haberes_administrador;

                        if ($montoTotal > $this->monto_total_disponible) {
                            $this->addError('monto_solicitado', 'El monto solicitado ('.$this->monto_solicitado.') no puede ser otorgado');
                        }
                    }
                } else {
                    if ($confRP->porcentaje_bloqueo_haberes_administrador != '') {
                        $montoTotal = (new Disponibilidad([
                            'asociado' => $this->idasociado,
                            'proceso' => 2,
                            'porcentaje_disponibilidad' => $confRP->porcentaje_bloqueo_haberes_administrador,
                        ]))->formula('T.total');

                        if ($montoTotal > $montoSolcitado) {
                            $this->addError('monto_solicitado', 'El monto solicitado ('.$this->monto_solicitado.') no puede ser otorgado');
                        }
                    }
                }
            } else {
                $montoSolicitud = '';
                if ($confRP->opcion_asociado == 1) {
                    if ($confRP->monto_maximo_asociado != '') {
                        $montoSolicitud = $confRP->monto_maximo_asociado;
                    }
                } else {
                    if ($confRP->porcentaje_maximo_asociado != '') {
                        $montoS = new Disponibilidad([
                            'asociado' => $this->idasociado,
                            'proceso' => 2,
                            'porcentaje_disponibilidad' => $confRP->porcentaje_maximo_asociado,
                        ]);
                    }

                    $montoSolicitud = $montoS->formula('T.total');
                }

                if ($this->scenario == 'SolicitudRetiroParcial' || $this->scenario == 'PrestamoRetiroParcialAsociado') {
                    if ($montoSolicitud > 0 && $montoSolcitado > $montoSolicitud) {
                        $this->addError('monto_solicitado', 'El monto solicitado ('.$this->monto_solicitado.') es mayor que el '
                                .'monto disponible por solicitud ('.number_format($montoSolicitud, 2, ',', '.').')');
                    }
                }

                if ($confRP->opcion_haberes_asociado == 1) {
                    if ($confRP->monto_bloqueo_haberes_asociado != '') {
                        $montoTotal = $montoSolcitado + $confRP->monto_bloqueo_haberes_asociado;
                        if ($montoTotal > $this->monto_total_disponible) {
                            $this->addError('monto_solicitado', 'El monto solicitado ('.$this->monto_solicitado.') no puede ser otorgado');
                        }
                    }
                } else {
                    if ($confRP->porcentaje_bloqueo_haberes_asociado != '') {
                        $montoTotal = (new Disponibilidad([
                            'asociado' => $this->idasociado,
                            'proceso' => 2,
                            'porcentaje_disponibilidad' => $confRP->porcentaje_maximo_asociado,
                        ]))->formula('T.total');

                        if ($montoTotal > $montoSolcitado) {
                            $this->addError('monto_solicitado', 'El monto solicitado ('.$this->monto_solicitado.') no puede ser otorgado');
                        }
                    }
                }
            }
        }
    }

    public function buscarAsociado()
    {
        if ($this->hasErrors('cedula')) {
            return;
        }

        $modelAsociado = Asociado::model()->find([
            'select' => 'idasociado',
            'condition' => 'cedula=:cedula AND blnborrado=false AND id_estatus in(1,4)',
            'order' => 'idasociado desc',
            'params' => [
                'cedula' => $this->cedula,
            ],
        ]);

        if (! $modelAsociado) {
            $this->addError('cedula', 'No se encontraron registros asociados a la cédula');
        }

        $this->idasociado = $modelAsociado->idasociado;
        $this->monto_total_disponible = (new Disponibilidad([
            'asociado' => $this->idasociado,
            'proceso' => 2,
            'porcentaje_disponibilidad' => ConfRetiroParcial::getPorcentajeDisponibilidad(),
        ]))->formula('T.total');
    }

        public function validarSolicitudRetiro(){
            if(!$this->hasErrors('idasociado')){

                $solicitanteAsociado =  ($this->scenario =='SolicitudAdministrador' || $this->scenario =='PrestamoRetiroParcialAdministrador')? false: true;

                if($this->scenario =='SolicitudAdministrador' || $this->scenario =='PrestamoRetiroParcialAdministrador')
                    $validarRetiroParcial= RetiroParcial::validarSolcitudRetiroParcialAdministrador($this->idasociado);
                else
                    $validarRetiroParcial= RetiroParcial::validarSolcitudRetiroParcial($this->idasociado);

                    if($validarRetiroParcial['valido']==0 ){
                         $this->addError('cedula',$validarRetiroParcial['mensaje']);
                    }
            }
        }

        public function validarUnidades($id){
            Yii::import('application.modules.contable.models.*',true);
           $modelParamContable=  VswParametrosContables::model()->findAllBySql("
               Select a.id_unidad,c.descripcion
               from retiro.retiro_parcial, unidad c
               where not exists  (select id_unidad from contable.vsw_parametros_contables b
               where b.id_unidad = a.id_unidad and b.id_escenario=1 and b.id_unidad>=1)
            and c.idunidad=a.id_unidad
            and a.id_txt=$this->id and a.escenario='A'");
           $mensaje='';
           foreach ($modelParamContable as $contable):
                  if (isset($contable->id_unidad)){
                     $mensaje.="La unidad: <strong>$contable->descripcion</strong> no está parametrizada en el módulo: Parametrización de unidades.<br/>";
                  }
            endforeach;
            return $mensaje;
        }


        public function estatusRetiroParcial(){

            $model = EstatusRetiroParcial::model()->find('id_retiro_parcial=:id AND actual =  TRUE',array(':id'=>  $this->id));
            if($model){
                $this->nombre_estatus = $model->nombre_estatus;
                $this->idEstatus = $model->id_estatus_retiro;
            }
        }
	public function search()
	{
		// @todo Please modify the following code to remove attributes that should not be searched.

		$criteria=new CDbCriteria;
                $criteria->condition='t.blnborrado=false';
                $criteria->with='idAsociado';
		if (Yii::app()->user->checkAccess('usuario_asociado') && !Yii::app()->user->checkAccess('usuario_administrador') ){
                    $this->idasociado = Asociado::model()->find('cedula=:cedula 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;

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

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

                if(!is_numeric($this->monto_aprobado))
                    $this->monto_aprobado =  NULL;
                //echo $this->idasociado;exit;
		$criteria->compare('t.idasociado',$this->idasociado);
		$criteria->compare('monto_total_disponible',$this->monto_total_disponible);
		//$criteria->compare('monto_disponible',$this->monto_disponible);
		$criteria->compare('monto_solicitado',$this->monto_solicitado);
		$criteria->compare('monto_aprobado',$this->monto_aprobado);
        $criteria->compare('monto_pagar',$this->monto_pagar);
		$criteria->compare('t.blnborrado',false);
		$criteria->compare('monto_gasto_administrativo',$this->monto_gasto_administrativo);
		$criteria->compare('cuenta',$this->cuenta,true);

		$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->idUnidad);
                if(isset($this->idEstatus) && $this->idEstatus !=''){

                    $criteria->join = 'INNER JOIN retiro.estatus_retiro_parcial AS c on c.id_retiro_parcial = t.id';
                    $criteria->addCondition('id_estatus_retiro='.$this->idEstatus.' AND c.actual = true');

                    //$criteria->addCondition('(SELECT count(*) FROM retiro.estatus_retiro_parcial WHERE id_retiro_parcial=t.id AND id_estatus_retiro='.$this->idEstatus.' AND actual= true)>0');
                }

                //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->idEstatus) && $this->idEstatus !=''){

                            $criteria->addCondition('t.fecha_registro::DATE >=\''.$from.'\' AND t.fecha_registro::DATE <=\''.$to.'\'');

                        }else{

                            $criteria->join = 'INNER JOIN retiro.estatus_retiro_parcial AS c on c.id_retiro_parcial = t.id';
                            $criteria->addCondition('id_estatus_retiro=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->idEstatus) && $this->idEstatus !=''){

                            $criteria->addCondition('t.fecha_registro::DATE =\''.$creation_time.'\'');

                        }else{

                            $criteria->join = 'INNER JOIN retiro.estatus_retiro_parcial AS c on c.id_retiro_parcial = t.id';
                            $criteria->addCondition('id_estatus_retiro=1 AND t.fecha_registro::DATE =\''.$creation_time.'\'');
                        }
                    }
                }

                //Filtro para fecha por 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));
                        //$criteria->compare('fecha_registro',">= $from",false);
                        //$criteria->compare('fecha_registro',"<= $to",false);

                        if(isset($this->idEstatus) && $this->idEstatus !=''){
                            $criteria->addCondition('c.fecha_registro::DATE >=\''.$from.'\' AND c.fecha_registro::DATE <=\''.$to.'\'');
                        }else{
                            $criteria->join = 'INNER JOIN retiro.estatus_retiro_parcial AS c on c.id_retiro_parcial = t.id';
                            $criteria->addCondition('c.actual = true AND c.fecha_registro::DATE >=\''.$from.'\' AND c.fecha_registro::DATE <=\''.$to.'\'');
                        }

                        /*$criteria->addCondition('(SELECT count(*) FROM retiro.estatus_retiro_parcial WHERE id_retiro_parcial=t.id  '.(($this->idEstatus !='')?'AND id_estatus_retiro='.$this->idEstatus:'').' 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));

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

                $criteria->order='t.id DESC';

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

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

        public function searchPagos()
	{
		// @todo Please modify the following code to remove attributes that should not be searched.

		$criteria=new CDbCriteria;

                $criteria->with='idAsociado';
		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;

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

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

                if(!is_numeric($this->monto_aprobado))
                    $this->monto_aprobado =  NULL;
                //echo $this->idasociado;exit;
		$criteria->compare('t.idasociado',$this->idasociado);
		$criteria->compare('monto_total_disponible',$this->monto_total_disponible);
		//$criteria->compare('monto_disponible',$this->monto_disponible);
		$criteria->compare('monto_solicitado',$this->monto_solicitado);
		$criteria->compare('monto_aprobado',$this->monto_aprobado);
		$criteria->compare('t.blnborrado',false);
		$criteria->compare('monto_gasto_administrativo',$this->monto_gasto_administrativo);
		$criteria->compare('cuenta',$this->cuenta,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->idUnidad);
                $criteria->addCondition('(SELECT count(*) FROM retiro.estatus_retiro_parcial WHERE id_retiro_parcial=t.id AND id_estatus_retiro=2 AND actual= true)>0');
                $criteria->addCondition('id NOT IN (SELECT a.id_retiro id FROM retiro.detalle_pagos AS a
                                                    JOIN retiro.pagos_masivos AS b ON a.id_pagos=b.id
                                                    WHERE  b.id_estatus!=5 AND a.blnborrado=FALSE  AND id_retiro IS NOT NULL)');



                $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));
                        $criteria->compare('fecha_registro',">= $from",false);
                        $criteria->compare('fecha_registro',"<= $to",false);
                        $criteria->addCondition('(SELECT count(*) FROM retiro.estatus_retiro_parcial WHERE id_retiro_parcial=t.id  '.(($this->idEstatus !='')?'AND id_estatus_retiro='.$this->idEstatus:'').' 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 retiro.estatus_retiro_parcial WHERE id_retiro_parcial=t.id '.(($this->idEstatus !='')?'AND id_estatus_retiro='.$this->idEstatus:'').' AND '
                                . '(fecha_registro::DATE=\''.$creation_time.'\'))>0');
                    }
                }

                $criteria->order='id DESC';
		return new CActiveDataProvider($this, array(
			'criteria'=>$criteria,
		));
	}

    public function criteriaRetiroXAsociado($id)
    {
        if ($id == '') {
            $id = 0;
        }

        if (isset($_GET['cedula'])) {
            if (is_numeric($_GET['cedula'])) {
                $id = 0;
                $model = Asociado::model()->find('cedula=:cedula AND blnborrado= FALSE AND id_estatus in(1,2,4) ORDER BY idasociado desc', [':cedula' => $_GET['cedula']]);
                if ($model) {
                    $id = $model->idasociado;
                }
            } else {
                $id = 0;
            }
        }

        $criteria = new CDbCriteria();
        $criteria->condition = 't.blnborrado=false';
        $criteria->compare('t.idasociado', $id);
        $criteria->compare('t.blnborrado', false);

        return $criteria;
    }

    public function searchRetiroXAsociado($id)
    {
        $criteria = $this->criteriaRetiroXAsociado($id);

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

    public function searchRetiroXAsociadoFichaLiquidacion($id, $params)
    {
        $criteria = $this->criteriaRetiroXAsociado($id);
        $criteria->join .= ' inner join retiro.estatus_retiro_parcial erp on erp.id_retiro_parcial=t.id and erp.actual is true';
        $criteria->addColumnCondition([
            'erp.id_estatus_retiro' => 4 // pagados
        ]);

        return new CActiveDataProvider($this, [
            'criteria' => $criteria,
            'pagination' => [
                'pageSize' => 10,
                'params'  => $params,
            ],
        ]);
    }

    public function retiroAsociadoFichaLiquidacion($id)
    {
        $criteria = $this->criteriaRetiroXAsociado($id);
        $criteria->join .= ' inner join retiro.estatus_retiro_parcial erp on erp.id_retiro_parcial=t.id and erp.actual is true';
        $criteria->addColumnCondition([
            'erp.id_estatus_retiro' => 4 // pagados
        ]);

        $datos = self::model()->findAll($criteria);

        return (new Warp($datos))->map(function ($retiro) {
            return [
                'id' => $retiro->id,
                'fecha_registro' => $retiro->fecha_registro,
                'monto_total_disponible' => $retiro->monto_total_disponible,
                'monto_solicitado' => $retiro->monto_solicitado,
                'monto_aprobado' => $retiro->monto_aprobado,
                'fecha_estatus' => $retiro->fecha_estatus,
                'estatus' => $retiro->nombre_estatus,
            ];
        });
    }

        public function getTotalMontoDisponible($id) {
            $total = '0';
            $model = self::model()->find(array('select' => 'sum(monto_total_disponible) AS monto_total_disponible',
                'condition' => 'idasociado=:idtrabajador',
                'params' => array(':idtrabajador' => $id)));
            if ($model)
                $total = number_format($model->monto_total_disponible, 2, ",", ".");

            return $total;
        }

        public function getTotalMontoSolicitado($id) {
            $total = '0';
            $model = self::model()->find(array('select' => 'sum(monto_solicitado) AS monto_solicitado',
                'condition' => 'idasociado=:idtrabajador and blnborrado=false',
                'params' => array(':idtrabajador' => $id)));
            if ($model)
                $total = number_format($model->monto_solicitado, 2, ",", ".");

            return $total;
        }

        public function getTotalMontoAprobado($id) {
            $total = '0';
            $model = self::model()->find(array('select' => 'sum(monto_aprobado) AS monto_aprobado',
                'condition' => 'idasociado=:idtrabajador and blnborrado=false',
                'params' => array(':idtrabajador' => $id)));
            if ($model)
                $total = number_format($model->monto_aprobado, 2, ",", ".");

            return $total;
        }

        public function semana(){
          $fecha_act= date('Y-m-j');
          $date2 = strtotime($fecha_act);
          $inicio0 = strtotime('sunday this week 0 week', $date2);

          $inicio=date('Y-m-d', $inicio0);

          for($i=1;$i<=7;$i++){
             $fecha= date("d-m-Y", strtotime("$inicio +$i day"));
             $semana= date("w", strtotime($fecha));
             if ($semana == 3)
             {
               $dia_p= $fecha;
             }
          }
          return $dia_p;

        }


        public function afterFind(){
            $model = EstatusRetiroParcial::model()->find('id_retiro_parcial=:id AND actual = TRUE',array(':id'=>  $this->id));
            if($model){
                $this->nombre_estatus = $model->idEstatusRetiro->nombre_estatus;
                $this->idEstatus = $model->id_estatus_retiro;
                $this->fecha_estatus = $model->fecha_registro;

                $f_sol = EstatusRetiroParcial::model()->find('id_retiro_parcial=:id AND id_estatus_retiro=1',array(':id'=>  $this->id));
                if (!empty($f_sol->fecha_registro)) {

                    $this->fecha_solicita = $f_sol->fecha_registro;
                }else{

                    $this->fecha_solicita = '';
                }
            }
            /*$model = EstatusRetiroParcial::model()->find('id_retiro_parcial=:id AND id_estatus_retiro =1',array(':id'=>  $this->id));
            if($model){
                $this->fecha_solicitud = $model->fecha_registro;
            }*/



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

            return parent::beforeSave();
        }


    public static function validarSolcitudRetiroParcial($idAsociado){
        $modelAsociado = Asociado::model()->findByPk($idAsociado);
        $modelConfiguracion = ConfRetiroParcial::model()->find();
        //$model = self::model()->find('idtrabajador=:idtrabajador',array(':idtrabajador'=>$idAsociado));
        $error =  array();
        $error['valido']=1;
        $mensaje = '';
        $valido = TRUE;
        if($modelConfiguracion){
            ###################################################### TIEMPO COMO ASOCIADO A LA CAJA DE AHORRO #########################################
            if ($modelConfiguracion->tiempo_asociado > 0) {

                if ($modelAsociado->validacionTiempoAsociado()< $modelConfiguracion->tiempo_asociado) {
                    $valido = false;
                    $mensaje.='<b>No tiene el tiempo de '.$modelConfiguracion->tiempo_asociado.' meses, necesario para optar por al retiro parcial...</b><br/> ';
                }
            }
            ###################################################### TIEMPO COMO ASOCIADO A LA CAJA DE AHORRO #########################################

            //validamos que no tenga retiro parcial aprobado
            //si posee un retiro parcial, debe de tener como minimo 6 meses de haberlos pedido
            if($modelConfiguracion->metodo_evaluacion_solicitud ==1){
                ################## METODO DE AVALUACION DE SOLICITUD POR EL ULTIMO ESTATUS DEL RETIRO PARCIAL Y EL TIEMPO EN MESES ##########################
                    $modelEstatusRetiroParcial = EstatusRetiroParcial::model()->with('idRetiroParcial')->find(array('condition'=>'idasociado=:id AND actual =  TRUE',
                                                                                                                    'params'=>array(':id'=>  $idAsociado),
                                                                                                                    'order'=>'id_retiro_parcial desc'));
                    if($modelEstatusRetiroParcial){
                        if ($modelConfiguracion->tiempo_retiro_parcial > 0) {
                            if($modelEstatusRetiroParcial->id_estatus_retiro !=3){
                                $estatusVerificacion = EstatusRetiroParcial::model()->find(array('condition'=>'id_retiro_parcial=:id_retiro_parcial AND id_estatus_retiro =:id_estatus_retiro',
                                                                                                'params'=>array(':id_retiro_parcial'=>$modelEstatusRetiroParcial->id_retiro_parcial,
                                                                                                                ':id_estatus_retiro'=>$modelConfiguracion->estatus_tiempo_retiro_parcial),
                                                                                                                ));
                                if($estatusVerificacion){
                                    if ($estatusVerificacion->validacionTiempoRetiroParcial()< $modelConfiguracion->tiempo_retiro_parcial) {
                                        $valido = false;
                                        $mensaje.='<b>Debe esperar un lapso de '.$modelConfiguracion->tiempo_retiro_parcial.' mes(es), necesario para optar por otro retiro parcial...</b><br/> ';
                                    }
                                }
                            }
                        }
                        if($modelEstatusRetiroParcial->id_estatus_retiro ==1){
                                $valido = false;
                                $mensaje.='<b> Usted  posee una solicitud de retiro parcial. Realizado el día '.date('d-m-Y h:m:s',  strtotime($modelEstatusRetiroParcial->fecha_registro)).'</b> ';
                        }
                    }
                ################## FIN METODO DE AVALUACION DE SOLICITUD POR EL ULTIMO ESTATUS DEL RETIRO PARCIAL Y EL TIEMPO EN MESES ######################

            }
            else{
                ################## METODO DE AVALUACION DE SOLICITUD POR EL TIEMPO EN DIAS ##########################
                    $modelEstatusRetiroParcial = EstatusRetiroParcial::model()->with('idRetiroParcial')->find(array('condition'=>'idasociado=:id AND id_estatus_retiro = 1',
                                                                                                                    'params'=>array(':id'=>  $idAsociado),
                                                                                                                    'order'=>'id_retiro_parcial desc'));
                    if($modelEstatusRetiroParcial){
                        if ($modelConfiguracion->tiempo_retiro_parcial > 0) {
                            if ($modelEstatusRetiroParcial->validacionTiempoRetiroParcial($dias = TRUE)< $modelConfiguracion->tiempo_retiro_parcial) {
                                $valido = false;
                                $mensaje.='<b>Debe esperar un lapso de '.$modelConfiguracion->tiempo_retiro_parcial.' dia(s), necesario para optar por otro retiro parcial...</b><br/> ';
                            }
                        }
                    }
                ################## FIN METODO DE AVALUACION DE SOLICITUD POR EL TIEMPO EN DIAS ##########################

            }



            $modelPrestamos = ReporteCreditos::model()->find('idasociado=:idasociado AND id_estatus_credito =1', array(':idasociado' => $idAsociado));
            if ($modelPrestamos) {
                    $valido = false;
                    $mensaje.="<b> Usted  posee un préstamo SOLICITADO el día " . date('d-m-Y', strtotime($modelPrestamos->fecha_registro)) . ", deberá esperar a que sea aprobado ó denegado</b></br>";
            }

            // if($solicitanteAsociado ==TRUE || $modelConfiguracion->limitar_solicitud_administrardor == TRUE){
            //     $validacionDisponibilidad = self::model()->validarDisponibilidadDiaria($modelConfiguracion);
            //     if (!$validacionDisponibilidad) {
            //         $mensaje.='<b>No hay disponibilidad para solicitar retiro parcial</b><br/>';
            //     }
            //     $valido = $validacionDisponibilidad && $valido;

            // }

            $validacionDisponibilidad = self::model()->validarDisponibilidadDiaria($modelConfiguracion);
            if (!$validacionDisponibilidad) {
                $mensaje.='<b>No hay disponibilidad para solicitar retiro parcial</b><br/>';
            }
            $valido = $validacionDisponibilidad && $valido;

            $modelPrestamos = ReporteCreditos::model()->findAll('idasociado=:idasociado AND id_estatus_credito =4', array(':idasociado' => $idAsociado));
            if($modelPrestamos){
                if($modelConfiguracion->creditos_permitidos !=''){
                    $prestamosPermitidos = json_decode($modelConfiguracion->creditos_permitidos,true);
                    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 por el retiro parcial</b><br/>';
                                }
                            }
                        }
                    }
                }
                else{
                    $valido = false;
                    $mensaje.='<b>El asociado posee préstamos activos, pero no hay configuración que permita la solicitud de retiro parcial</b><br/>';
                }
            }

        }
        else{
            $valido = false;
            $mensaje.='<b>Se necesita configurar de retiro parcial</b><br/>';
        }
        $error ['valido']=$valido;
        $error ['mensaje']=$mensaje;

        return $error;

    }
    public static function validarSolcitudRetiroParcialAdministrador($idAsociado){
        $modelAsociado = Asociado::model()->findByPk($idAsociado);
        $modelConfiguracion = ConfRetiroParcial::model()->find();
        //$model = self::model()->find('idtrabajador=:idtrabajador',array(':idtrabajador'=>$idAsociado));
        $error =  array();
        $error['valido']=1;
        $mensaje = '';
        $valido = TRUE;
        if($modelConfiguracion){

            if ($modelConfiguracion->tiempo_asociado_administrador > 0) {

                if ($modelAsociado->validacionTiempoAsociado()< $modelConfiguracion->tiempo_asociado_administrador) {
                    $valido = false;
                    $mensaje.='<b>No tiene el tiempo de '.$modelConfiguracion->tiempo_asociado_administrador.' meses, necesario para optar por al retiro parcial...</b><br/> ';
                }
            }
            if($modelConfiguracion->metodo_evaluacion_solicitud ==1){
                ################## METODO DE AVALUACION DE SOLICITUD POR EL ULTIMO ESTATUS DEL RETIRO PARCIAL Y EL TIEMPO EN MESES ##########################
                    $modelEstatusRetiroParcial = EstatusRetiroParcial::model()->with('idRetiroParcial')->find(array('condition'=>'idasociado=:id AND actual =  TRUE',
                                                                                                                    'params'=>array(':id'=>  $idAsociado),
                                                                                                                    'order'=>'id_retiro_parcial desc'));
                    if($modelEstatusRetiroParcial){
                        if ($modelConfiguracion->tiempo_retiro_parcial_administrador > 0) {
                            if($modelEstatusRetiroParcial->id_estatus_retiro !=3){
                                $estatusVerificacion = EstatusRetiroParcial::model()->find(array('condition'=>'id_retiro_parcial=:id_retiro_parcial AND id_estatus_retiro =:id_estatus_retiro',
                                                                                                'params'=>array(':id_retiro_parcial'=>$modelEstatusRetiroParcial->id_retiro_parcial,
                                                                                                                ':id_estatus_retiro'=>$modelConfiguracion->estatus_tiempo_retiro_parcial),
                                                                                                                ));
                                if($estatusVerificacion){
                                    if ($estatusVerificacion->validacionTiempoRetiroParcial()< $modelConfiguracion->tiempo_retiro_parcial_administrador) {
                                        $valido = false;
                                        $mensaje.='<b>Debe esperar un lapso de '.$modelConfiguracion->tiempo_retiro_parcial_administrador.' mes(es), necesario para optar por otro retiro parcial...</b><br/> ';
                                    }
                                }
                            }
                        }
                        if($modelEstatusRetiroParcial->id_estatus_retiro ==1){
                                $valido = false;
                                $mensaje.='<b> El asociado posee una solicitud de retiro parcial. Realizado el día '.date('d-m-Y h:m:s',  strtotime($modelEstatusRetiroParcial->fecha_registro)).'</b> ';
                        }
                    }
                ################## FIN METODO DE AVALUACION DE SOLICITUD POR EL ULTIMO ESTATUS DEL RETIRO PARCIAL Y EL TIEMPO EN MESES ######################

            }
            else{
                ################## METODO DE AVALUACION DE SOLICITUD POR EL TIEMPO EN DIAS ##########################
                    $modelEstatusRetiroParcial = EstatusRetiroParcial::model()->with('idRetiroParcial')->find(array('condition'=>'idasociado=:id AND id_estatus_retiro = 1',
                                                                                                                    'params'=>array(':id'=>  $idAsociado),
                                                                                                                    'order'=>'id_retiro_parcial desc'));
                    if($modelEstatusRetiroParcial){
                        if ($modelConfiguracion->tiempo_retiro_parcial_administrador > 0) {
                            if ($modelEstatusRetiroParcial->validacionTiempoRetiroParcial($dias = TRUE)< $modelConfiguracion->tiempo_retiro_parcial_administrador) {
                                $valido = false;
                                $mensaje.='<b>Debe esperar un lapso de '.$modelConfiguracion->tiempo_retiro_parcial_administrador.' dia(s), necesario para optar por otro retiro parcial...</b><br/> ';
                            }
                        }
                    }
                ################## FIN METODO DE AVALUACION DE SOLICITUD POR EL TIEMPO EN DIAS ##########################

            }

            // //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',
            //                                                                                                 'params'=>array(':id'=>  $idAsociado),
            //                                                                                                 'order'=>'id_retiro_parcial desc'));
            // if($modelEstatusRetiroParcial){
            //     if ($modelConfiguracion->tiempo_retiro_parcial_administrador > 0) {
            //         //$modelRetiroParcial = RetiroParcial::model()->with()->find('idtrabajador=:idtrabajador AND blnborrado =  false AND estatus = 1', array(':idtrabajador' => $modelAsociado->idasociado));
            //         if($modelEstatusRetiroParcial->id_estatus_retiro !=3){
            //             $estatusVerificacion = EstatusRetiroParcial::model()->find(array('condition'=>'id_retiro_parcial=:id_retiro_parcial AND id_estatus_retiro =:id_estatus_retiro',
            //                                                                             'params'=>array(':id_retiro_parcial'=>$modelEstatusRetiroParcial->id_retiro_parcial,
            //                                                                                             ':id_estatus_retiro'=>$modelConfiguracion->estatus_tiempo_retiro_parcial_administrador),
            //                                                                                             ));
            //             if($estatusVerificacion){
            //                 if ($estatusVerificacion->validacionTiempoRetiroParcial()< $modelConfiguracion->tiempo_retiro_parcial_administrador) {
            //                     $valido = false;
            //                     $mensaje.='<b>No tiene el tiempo de '.$modelConfiguracion->tiempo_retiro_parcial_administrador.' meses, necesario para optar por otro retiro parcial...</b><br/> ';
            //                 }
            //             }
            //         }
            //     }
            //     if($modelEstatusRetiroParcial->id_estatus_retiro ==1){
            //             $valido = false;
            //             $mensaje.='<b>El asociado posee una solicitud de retiro parcial. Realizado el día '.date('d-m-Y h:m:s',  strtotime($modelEstatusRetiroParcial->fecha_registro)).'</b> ';
            //     }
            // }


            $modelPrestamos = ReporteCreditos::model()->find('idasociado=:idasociado AND id_estatus_credito =1', array(':idasociado' => $idAsociado));
            if ($modelPrestamos) {
                    $valido = false;
                    $mensaje.="<b>El asociado posee un préstamo SOLICITADO el día " . date('d-m-Y', strtotime($modelPrestamos->fecha_registro)) . ", deberá esperar a que sea aprobado ó denegado</b></br>";
            }

            if($modelConfiguracion->limitar_solicitud_administrardor == TRUE){
                $validacionDisponibilidad = self::model()->validarDisponibilidadDiaria($modelConfiguracion);
                if (!$validacionDisponibilidad) {
                    $mensaje.='<b>No hay disponibilidad para solicitar retiro parcial</b><br/>';
                }
                $valido = $validacionDisponibilidad && $valido;

            }

            //verificar los tipos de prestamos que posee el asociado
            $modelPrestamos = ReporteCreditos::model()->findAll('idasociado=:idasociado AND id_estatus_credito =4', array(':idasociado' => $idAsociado));
            if($modelPrestamos){
                if($modelConfiguracion->creditos_permitidos !=''){
                    $prestamosPermitidos = json_decode($modelConfiguracion->creditos_permitidos,true);
                    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 por el retiro parcial</b><br/>';
                                }
                            }
                        }
                    }
                }
                else{
                    $valido = false;
                    $mensaje.='<b>El asociado posee préstamos activos, pero no hay configuración que permita la solicitud de retiro parcial</b><br/>';
                }
            }
        }
        else{
            $valido = false;
            $mensaje.='<b>Se necesita configurar de retiro parcial</b><br/>';
        }
        $error ['valido']=$valido;
        $error ['mensaje']=$mensaje;

        return $error;

    }

    public static function validarDisponibilidadAdministrador(){
        $modelConfiguracion = ConfRetiroParcial::model()->find();
        //$model = self::model()->find('idtrabajador=:idtrabajador',array(':idtrabajador'=>$idAsociado));
        $error =  array();
        $error['valido']=1;
        $mensaje = '';
        $valido = TRUE;
        if($modelConfiguracion){
            if($modelConfiguracion->limitar_solicitud_administrardor == TRUE){
                $validacionDisponibilidad = self::model()->validarDisponibilidadDiaria($modelConfiguracion);
                if (!$validacionDisponibilidad) {
                    $mensaje.='<b>No hay disponibilidad para solicitar retiro parcial</b><br/>';
                }
                $valido = $validacionDisponibilidad && $valido;
            }
        }
        else{
            $valido = false;
            $mensaje.='<b>Se necesita configurar de retiro parcial</b><br/>';
        }
        $error ['valido']=$valido;
        $error ['mensaje']=$mensaje;

        return $error;

    }

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

    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('"idRetiroParcial".blnborrado= false AND 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 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 format($number, $digitos = 2)
    {
        $multiplicador = pow(10, $digitos);
        $resultado = ((int) ($number * $multiplicador)) / $multiplicador;

        return floatval(number_format($resultado, $digitos, '.', ''));
    }

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

    public function getIdComprobantePago()
    {
        return $this->idComprobantePago;
    }

    public function setIdComprobantePago($idComprobantePago)
    {
        $this->idComprobantePago = $idComprobantePago;
    }

    public function getTituloProceso()
    {
        return $this->tituloProceso;
    }

    public function setTituloProceso($tituloProceso)
    {
        $this->tituloProceso = $tituloProceso;
    }

    public function getProcesoPago()
    {
        $procesoPago = $this->procesoPago;

        if (empty($procesoPago)) {
            throw new Exception('El retiro no posee un pago asociado, para poder realizar un reverso');
        }

        return $procesoPago;
    }

    public function getUltimoComprobante()
    {
        $comprobante = Yii::app()->getDb()->createCommand('
            select c.id, c.fecha_comprobante
            from retiro.retiro_parcial rp
            inner join contable.proceso_pago pp on pp.id_proceso=rp.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=2
                and pc.id_proceso=rp.id
                and pc.id_pago=pp.id
            inner join contable.comprobante c on c.id=pc.id_comprobante
            where rp.id=:prestamo
        ')->bindValues([
            'tipo' => 2,
            '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 retiro.retiro_parcial rp
            inner join contable.proceso_pago pp on pp.id_proceso=rp.id
                and pp.id_nombre_proceso=2
                AND pp.actual IS TRUE
                AND pp.blnborrado IS FALSE
            inner join contable.proceso_comprobante pc on pc.id_titulo_proceso=2
                and pc.id_proceso=rp.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 rp.id=:retiro
        ')->bindValues([
            'retiro' => $this->id
        ])->queryAll();
    }

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

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

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

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

    public function getFechaAprobacion()
    {
        return $this->fecha_aprobacion;
    }

    public function setFechaAprobacion($fecha)
    {
        $this->fecha_aprobacion = $fecha;
    }

    public function liquidacion()
    {
        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)
            ) as liquidacion
        ')->bindValues([
            'asociado' => $this->idasociado
        ])->queryRow()['liquidacion'];
    }

    public function reversarPago()
    {
        $transaction = Yii::app()->getDb()->beginTransaction();
        try {
            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);
                }

                $procesoPago = $this->getProcesoPago();
                $this->referencia = $procesoPago->referencia;
                $this->setTituloProceso($procesoPago->id_nombre_proceso);

                Yii::import('application.modules.contable.models.comprobantes.*', true);
                Yii::import('application.modules.contable.models.comprobantes.retiro.*', true);
                (new ReversoParcial($this, (object) [
                    'id_banco' => $procesoPago->id_banco,
                    'fecha_pago' => $comprobante->fecha_comprobante,
                ]))->contabilizar();
            }

            if ($this->liquidacion()) {
                throw new Exception("No se puede reversar préstamo, el asociado tiene una liquidación.");
            }

            EstatusRetiroParcial::model()->updateAll(['actual' => false], 'id_retiro_parcial=:id', ['id' => $this->id]);

            $model = new EstatusRetiroParcial('pagaraRetiro');
            $model->id_retiro_parcial = $this->id;
            $model->id_estatus_retiro = 2;
            $model->observacion = $this->observacion;

            if (! $model->save()) {
                throw new Exception('No se pudo actualizar el seguimiento del retiro.');
            }

            $this->reversarComprobantePago();

            $this->reversarPrestamosAnteriores();

            $this->reversarCuotasTablaAmortizacion();

            $transaction->commit();
            Yii::app()->user->setFlash('success', 'Retiro parcial 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=2',
        [
            'id' => $this->id
        ]);
    }

    public function reversarPrestamosAnteriores()
    {
        foreach (json_decode($this->prestamos_pago) as $prestamo) {
            $modelCredito = Credito::model()->findByPk($prestamo->id_credito);

            if ($modelCredito->cuotasModificadas()) {
                throw new Exception('Hay créditos con cuotas modificadas, no se puede reversar.');
            }

            CreditoSeguimiento::model()->updateAll([
                'actual' => false
            ],
            'id_credito=:id', [
                'id' => $prestamo->id_credito
            ]);

            $model = new CreditoSeguimiento();
            $model->id_credito = $prestamo->id_credito;
            $model->id_estatus_credito = 20;
            $model->save();
        }
    }

    public function reversarCuotasTablaAmortizacion()
    {
        Yii::import('application.modules.prestamo.models.*', true);

        foreach (json_decode($this->prestamos_pago) as $prestamo) {
            $model = Credito::model()->findByPk($prestamo->id_credito);

            if ($model->cuotasModificadas()) {
                throw new Exception('Hay créditos relacionados con cuotas modificadas y no se puede reversar.');
            }

            $cuotas = CreditoTablaAmortizacion::model()->findAll([
                'condition' => 'idcredito=:id AND id_estatus_cuota=11',
                'params' => [
                    ':id' => $model->id
                ]
            ]);

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

    public function saldoDeudorPrestamo($credito)
    {
        return (object) Yii::app()->getDb()->createCommand('
            select count(*),
                   coalesce(sum(cta.monto_capital), 0) as capital,
                   coalesce(sum(cta.monto_interes), 0) as interes,
                   coalesce(sum(cta.monto_capital), 0) + coalesce(sum(cta.monto_interes), 0) as total
            from prestamos.credito_tabla_amortizacion cta
            where cta.idcredito=:credito
                and cta.blnborrado is false
                and cta.id_estatus_cuota is null
        ')->bindValues([
            'credito' => $credito
        ])->queryRow();
    }

    public function getSaldoDeudorCapital($credito)
    {
        return Yii::app()->getDb()->createCommand('
            SELECT COALESCE(deuda_actual, 0) + COALESCE(deuda_actual_esp, 0)
            FROM reporte_creditos t
            WHERE idcredito=:credito
        ')->bindValue('credito', $credito)->queryScalar();
    }

    public function cuentaPorCobrarPrestamo($credito)
    {
        return (object) Yii::app()->getDb()->createCommand('
            select count(*),
                coalesce(sum(cta.monto_capital), 0) + coalesce(sum(cdc.capital_cobro), 0) as capital,
                coalesce(sum(cta.monto_interes), 0) + coalesce(sum(cdc.interes_cobro), 0) as interes,
                coalesce(sum(cta.monto_capital), 0) + coalesce(sum(cdc.capital_cobro), 0) + coalesce(sum(cta.monto_interes), 0) + coalesce(sum(cdc.interes_cobro), 0) as total
            from prestamos.credito_tabla_amortizacion cta
            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.id_nombre_proceso=1
            where cta.idcredito=:credito
                and cta.blnborrado is false
                and cta.id_estatus_cuota in (1,3,6,7,8,9,12)
        ')->bindValues([
            'credito' => $credito
        ])->queryRow();
    }

    public function getPrestamosSeleccionados()
    {
        return Yii::app()->getDb()->createCommand('
            select c.id,
                    ttc.nombre_titulo,
                    tc.descripcion
            from (
                select json_array_elements(prestamos_pago) as datos
                from retiro.retiro_parcial
                where id=:retiro
            ) as t
            inner join prestamos.credito c on c.id=cast(t.datos->>\'id_credito\' as integer)
            inner join prestamos.tipo_credito tc on tc.id=c.id_tipo_credito
            inner join prestamos.titulo_tipo_credito ttc on ttc.id=tc.id_titulo_tipo_credito
        ')->bindValue('retiro', $this->id)->queryAll();
    }

    public function cuotasTablaAmortizacion($prestamo)
    {
        return Yii::app()->getDb()->createCommand('
            select cta.id,
                   cta.numero_cuota,
                   cta.fecha_vencimiento,
                   cta.monto_base,
                   cta.monto_capital,
                   cta.monto_interes,
                   cta.monto_cuota,
                   dtta.monto_cuota_pagado as monto_pagado,
                   cta.monto_credito,
                   ecta.nombre_estatus
            from prestamos.credito_tabla_amortizacion cta
            LEFT JOIN prestamos.datos_txt_tabla_amortizacion dtta on dtta.id_tabla_amortizacion=cta.id and dtta.actual is true
            left join prestamos.estatus_cuota_tabla_amortizacion ecta on ecta.id=cta.id_estatus_cuota
            where cta.idcredito=:credito
                and cta.blnborrado is false
            order by cta.numero_cuota
        ')->bindValues([
            'credito' => $prestamo
        ])->queryAll();
    }

    public function actualizarCuentaPorCobrarPrestamosRelacionados()
    {
        $prestamosSeleccionados = (new Warp(json_decode($this->prestamos_pago, true)))->map(function ($prestamo) {
            $saldoDeudor = $this->saldoDeudorPrestamo($prestamo['id_credito']);
            $cuentaPorCobrar = $this->cuentaPorCobrarPrestamo($prestamo['id_credito']);

            return array_merge($prestamo, [
                'monto' => $this->getSaldoDeudorCapital($prestamo['id_credito']),
                'saldo_deudor_capital' => (float) $saldoDeudor->capital,
                'saldo_deudor_interes' => (float) $saldoDeudor->interes,
                'saldo_deudor_total' => (float) round($saldoDeudor->total, 2),
                'cuenta_x_cobrar_capital' => (float) $cuentaPorCobrar->capital,
                'cuenta_x_cobrar_interes' => (float) $cuentaPorCobrar->interes,
                'cuenta_x_cobrar_total' => (float) round($cuentaPorCobrar->total, 2),
                'total_cuenta_x_cobrar' => (float) round($saldoDeudor->capital + $cuentaPorCobrar->total, 2),
            ]);
        });

        $this->prestamos_pago = json_encode($prestamosSeleccionados);

        // Actualiza el monto del saldo deudor
        $this->saldo_deudor = (new Warp($prestamosSeleccionados))->sum('monto');
    }

    public function calcularMontoPagar()
    {
        $montoAprobado = str_replace('.', '', $this->monto_aprobado);
        $montoAprobado = str_replace(',', '.', $montoAprobado);
        $prestamos = json_decode($this->prestamos_pago, true);

        $capitalDeCuotasNoAfectadas = (new Warp($prestamos))->sum('saldo_deudor_capital');
        $totalCuotasAfectadas = (new Warp($prestamos))->sum('cuenta_x_cobrar_total');

        $this->monto_pagar = bcsub(
            $montoAprobado,
            array_sum([
                $totalCuotasAfectadas,
                $capitalDeCuotasNoAfectadas,
                $this->monto_comision_bancaria,
                $this->monto_gasto_administrativo,
            ]),
            2
        );
    }

    public function gestionarCuotasNoAfectadas()
    {
        return (new CuotasNoAfectadas($this))->gestionar();
    }

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

    /**
     * Retorna el tipo de subproceso "Pagada por retiro parcial"
     *
     * @return integer
     */
    public function getTipoSubproceso()
    {
        return 2;
    }

    public function getDescripcionCuotasPrestamos()
    {
        return 'Pagada por retiro parcial '.$this->getFechaAprobacion();
    }

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