<?php

/**
 * This is the model class for table "retiro.liquidacion".
 *
 * The followings are the available columns in table 'retiro.liquidacion':
 * @property integer $id
 * @property integer $idasociado
 * @property string $monto_total_disponible
 * @property string $monto_total_deuda
 * @property string $monto_gasto_administrativo
 * @property string $cuenta
 * @property string $monto_liquidacion_asociado
 * @property string $monto_liquidacion_patrono
 * @property string $monto_pagar
 * @property boolean $blnborrado
 *
 * The followings are the available model relations:
 * @property Asociado $idasociado
 */
class Liquidacion extends CActiveRecord
{
    public $cedula;
    public $nombre;
    public $apellido;
    public $unidad;
    public $fecha_solicitud;
    public $idEstatus;
    public $nombre_estatus;
    public $fecha_aprobacion_range = [];
    public $fecha_solicitud_range = [];
    public $banco;
    public $referencia;
    public $observacion;
    public $mes;
    public $desde;
    public $hasta;
    public $consulta;
    public $fecha_estatus;
    public $fecha_estatus_range = [];
    public $fecha_solicita;
    public $fecha_solicita_range = [];
    public $fecha_comprobante;
    public $id_banco;
    public $fecha_pago;
    public $referencia_pago;

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

	/**
	 * @return array validation rules for model attributes.
	 */
    public function rules()
    {
		// NOTE: you should only define rules for those attributes that
		// will receive user inputs.
        return array(
            array('idasociado', 'numerical', 'integerOnly' => true),
            ['ficha_liquidacion', 'required', 'on' => 'solicitudLiquidacionAdministrador'],
            array('idasociado', 'buscarAsociado', 'on' => 'solicitudLiquidacionAdministrador'),
            array('idasociado', 'validarSolcitante', 'on' => 'solicitudLiquidacionAdministrador'),
            array('idasociado, cuenta, ficha_liquidacion', 'required', 'on' => 'solicitudLiquidacionAsociado,solicitudLiquidacionAdministrador'),
            array('cuenta', 'length', 'max' => 20, 'min' => 20, 'on' => 'solicitudLiquidacionAsociado,solicitudLiquidacionAdministrador'),
            array('cuenta', 'safe', 'on' => 'solicitudLiquidacionAsociado,solicitudLiquidacionAdministrador'),
            array('mes', 'required', 'on' => 'esc_periodo'),
            array('desde,hasta', 'required', 'on' => 'esc_fecha'),
            array('cedula', 'required', 'on' => 'solicitudLiquidacionAdministrador'),
            array('blnborrado,cedula,mes,desde,hasta,consulta, monto_pagar', 'safe'),
			// The following rule is used by search().
			// @todo Please remove those attributes that should not be searched.
            array('id, idasociado,cedula, nombre, apellido, unidad,fecha_solicitud_range, fecha_solicitud, monto_total_disponible, monto_total_deuda, monto_gasto_administrativo, cuenta, monto_liquidacion_asociado, monto_liquidacion_patrono, monto_pagar, blnborrado,idEstatus, 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'),
			'estatusLiquidacion' => array(self::HAS_MANY, 'EstatusLiquidacion', 'id_liquidacion'),
            'estatusActual' => [self::HAS_ONE, 'EstatusLiquidacion', 'id_liquidacion', 'condition' => 'actual IS TRUE'],
		);
	}

	/**
	 * @return array customized attribute labels (name=>label)
	 */
	public function attributeLabels()
	{
		return array(
			'id' => 'ID',
			'idasociado' => 'Idasociado',
			'monto_total_disponible' => 'Haber disponible',
			'monto_total_deuda' => 'Monto Total Deuda',
			'monto_gasto_administrativo' => 'Monto Gasto Administrativo',
			'cuenta' => 'Cuenta',
			'monto_liquidacion_asociado' => 'Monto Liquidacion Asociado',
			'monto_liquidacion_patrono' => 'Monto Liquidacion Patrono',
			'monto_pagar' => 'Monto a depositar',
			'blnborrado' => 'Blnborrado',
			'idEstatus' => 'Estatus',
			'mes' => 'Período',
			'consulta' => '',
            'fecha_estatus' => 'Fecha estatus',
            'fecha_solicita'=>'Fecha solicitud',
            'fecha_comprobante'=>'Fecha de comprobante',
		);
	}
        public function buscarAsociado() {
            if (!$this->hasErrors('cedula')) {
                $modelAsociado = Asociado::model()->find('cedula=:cedula AND id_estatus IN (1,3,4) AND blnborrado=false',array(':cedula'=>$this->cedula));
                if ($modelAsociado) {
                    $this->idasociado =  $modelAsociado->idasociado;
                }
                else{
                    $this->addError('cedula', 'No se encontraron registros asociados a la cédula');
                }

            }
        }

    public function validarSolcitante()
    {
        if (! $this->hasErrors('idasociado')) {
            $modelLiquidacion = EstatusLiquidacion::model()
                ->with('idLiquidacion')
                ->find('idasociado=:idasociado AND actual=true AND id_estatus_liquidacion<>3', [':idasociado'=>$this->idasociado]);

            if ($modelLiquidacion) {
                $this->addError('idtrabajador', 'Ya posee una solicitud de liquidación, realizada el dia '. Yii::app()->format->date($modelLiquidacion->fecha_registro));
            }
        }
    }

    public function setBanco($id_banco)
    {
        $this->id_banco = $id_banco;
    }

    public function setFechaPago($fecha_pago)
    {
        $this->fecha_pago = $fecha_pago;
    }

    public function setReferenciaPago($referencia_pago)
    {
        $this->referencia_pago = $referencia_pago;
    }

    public function setFechaComprobante($fecha_comprobante)
    {
        $this->fecha_comprobante = $fecha_comprobante;
    }

	/**
	 * 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.

        if (Yii::app()->user->checkAccess('usuario_asociado') && !Yii::app()->user->checkAccess('usuario_administrador') ){
                    $model =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));
                    if($model)
                        $this->idasociado = $model->idasociado;
                    else
                        $this->idasociado = 0;
                }
//
                if(isset($this->cedula)){
                    if(!is_numeric($this->cedula))
                        $this->cedula =  NULL;
                }
//
		$criteria=new CDbCriteria;
                $criteria->with='idAsociado';
		$criteria->compare('id',$this->id);
		$criteria->compare('t.idasociado',$this->idasociado);
		$criteria->compare('monto_total_disponible',$this->monto_total_disponible,true);
		$criteria->compare('monto_total_deuda',$this->monto_total_deuda,true);
		$criteria->compare('monto_gasto_administrativo',$this->monto_gasto_administrativo,true);
		$criteria->compare('cuenta',$this->cuenta,true);
		$criteria->compare('monto_liquidacion_asociado',$this->monto_liquidacion_asociado,true);
		$criteria->compare('monto_liquidacion_patrono',$this->monto_liquidacion_patrono,true);
		$criteria->compare('monto_pagar',$this->monto_pagar,true);
		$criteria->compare('t.blnborrado',false);
		$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->idEstatus) && $this->idEstatus !=''){

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

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

                //Filtro por 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_liquidacion AS c on c.id_liquidacion = t.id';
                            $criteria->addCondition('id_estatus_liquidacion=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_liquidacion AS c on c.id_liquidacion = t.id';
                            $criteria->addCondition('id_estatus_liquidacion=1 AND t.fecha_registro::DATE =\''.$creation_time.'\'');
                        }
                    }
                }

                //Filtro por fecha por estatus actual
                $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->idEstatus) && $this->idEstatus !=''){
                            $criteria->addCondition('c.fecha_registro::DATE >=\''.$from.'\' AND c.fecha_registro::DATE <=\''.$to.'\'');
                        }else{
                            $criteria->join = 'INNER JOIN retiro.estatus_liquidacion AS c on c.id_liquidacion = t.id';
                            $criteria->addCondition('c.actual = true AND c.fecha_registro::DATE >=\''.$from.'\' AND c.fecha_registro::DATE <=\''.$to.'\'');
                        }

                        /*$criteria->compare('fecha_registro',">= $from",false);
                        $criteria->compare('fecha_registro',"<= $to",false);
                        $criteria->addCondition('(SELECT count(*) FROM retiro.estatus_liquidacion WHERE id_liquidacion=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_liquidacion AS c on c.id_liquidacion = t.id';
                            $criteria->addCondition('c.actual = true AND c.fecha_registro::DATE =\''.$creation_time.'\'');
                        }

                        /*$criteria->addCondition('(SELECT count(*) FROM retiro.estatus_liquidacion WHERE id_liquidacion=t.id '.(($this->idEstatus !='')?'AND id_estatus_retiro='.$this->idEstatus:'').' AND '
                                . '(fecha_registro::DATE=\''.$creation_time.'\'))>0');*/
                    }
                }
//echo "<pre>";print_r($criteria);exit;
                $criteria->order = 't.id DESC, t.fecha_registro desc';
                $_SESSION['data'] = new CActiveDataProvider($this, array(
                                                    'criteria'=>$criteria,
                                                    'pagination'=>false,
                                                ));

		return new CActiveDataProvider($this, array(
			'criteria'=>$criteria,
		));
	}
        /**
         *
         * @return \CActiveDataProvider
         */
        public function searchPagos()
	{

		$criteria=new CDbCriteria;
                $criteria->with='idAsociado';
		$criteria->compare('id',$this->id);
		$criteria->compare('t.idasociado',$this->idasociado);
		$criteria->compare('monto_total_disponible',$this->monto_total_disponible,true);
		$criteria->compare('monto_total_deuda',$this->monto_total_deuda,true);
		$criteria->compare('monto_gasto_administrativo',$this->monto_gasto_administrativo,true);
		$criteria->compare('cuenta',$this->cuenta,true);
		$criteria->compare('monto_liquidacion_asociado',$this->monto_liquidacion_asociado,true);
		$criteria->compare('monto_liquidacion_patrono',$this->monto_liquidacion_patrono,true);
		$criteria->compare('monto_pagar',$this->monto_pagar,true);
		$criteria->compare('t.blnborrado',false);
		$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 retiro.estatus_liquidacion WHERE id_liquidacion=t.id AND id_estatus_liquidacion=2 AND actual= true)>0');
                $criteria->addCondition('id NOT IN (SELECT a.id_liquidacion 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_liquidacion IS NOT NULL)');


                $from = $to = '';
                if (count($this->fecha_solicitud_range)>=1) {
                    if (isset($this->fecha_solicitud_range['from'])) {
                        $from = $this->fecha_solicitud_range['from'];
                    }
                    if (isset($this->fecha_solicitud_range['to'])) {
                        $to= $this->fecha_solicitud_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_liquidacion WHERE id_liquidacion=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_liquidacion WHERE id_liquidacion=t.id '.(($this->idEstatus !='')?'AND id_estatus_retiro='.$this->idEstatus:'').' AND '
                                . '(fecha_registro::DATE=\''.$creation_time.'\'))>0');
                    }
                }

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



        public function afterFind(){

            $model = EstatusLiquidacion::model()->find('id_liquidacion=:id AND actual = TRUE',array(':id'=>  $this->id));
            if($model){
                $this->nombre_estatus = ($model->idEstatusLiquidacion)?$model->idEstatusLiquidacion->nombre_estatus:"";
                $this->idEstatus = $model->id_estatus_liquidacion;
                $this->fecha_estatus = $model->fecha_registro;

                $f_sol = EstatusLiquidacion::model()->find('id_liquidacion=:id AND id_estatus_liquidacion =1',array(':id'=>  $this->id));

                if(!empty($f_sol->fecha_registro)){

                    $this->fecha_solicita = $f_sol->fecha_registro;

                }else{

                    $this->fecha_solicita = '';
                }
            }

            //echo "<pre>";print_r($this);exit;
            /*$model = EstatusLiquidacion::model()->find('id_liquidacion=:id AND id_estatus_liquidacion =1',array(':id'=>  $this->id));
            if($model){
                $this->fecha_solicitud = $model->fecha_registro;
            }*/

            return parent::afterFind();
        }

        public function validarSolcitudLiquidacion($idAsociado){
        $modelAsociado = Asociado::model()->findByPk($idAsociado);
        $modelConfiguracion = ConfLiquidacion::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 > 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/> ';
                }
            }
            //validamos que no tenga retiro parcial aprobado
            //si posee un retiro parcial, debe de tener como minimo 6 meses de haberlos pedido
            $modelEstatusLiquidacion = EstatusLiquidacion::model()->with('idLiquidacion')->find(array('condition'=>'idasociado=:id AND actual =  TRUE',
                                                                                                            'params'=>array(':id'=>  $idAsociado),
                                                                                                            'order'=>'t.fecha_registro desc'));
            if($modelEstatusLiquidacion){
                if($modelEstatusLiquidacion->id_estatus_liquidacion ==2){
                    $valido = false;
                        $mensaje.='<b>Usted Posee una solicitud de Liquidación "APROBADO". Realizado el día '.date('d-m-Y h:m:s',  strtotime($modelEstatusLiquidacion->fecha_registro)).'</b> ';
                }
                if($modelEstatusLiquidacion->id_estatus_liquidacion ==1){
                        $valido = false;
                        $mensaje.='<b>Usted Posee una solicitud de Liquidacion. Realizado el día '.date('d-m-Y h:m:s',  strtotime($modelEstatusLiquidacion->fecha_registro)).'</b> ';
                }
            }

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

        }
        else{
            $valido = false;
            $mensaje.='<b>Se necesita configurar la liquidación</b><br/>';
        }
        $error ['valido']=$valido;
        $error ['mensaje']=$mensaje;

        return $error;

    }
    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!=''){
                                $cantidadLiquidacion = EstatusLiquidacion::model()->with('idLiquidacion')->count('"idLiquidacion".blnborrado= false AND id_estatus_liquidacion = 1 AND t.fecha_registro::DATE=:fecha_registro',array(':fecha_registro'=>date('d-m-Y')));
                                if($cantidadLiquidacion >= $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
                $cantidadLiquidacion = EstatusLiquidacion::model()->count('id_estatus_liquidacion = 1 AND (fecha_registro::DATE>=:fechasolicitudInicio AND fecha_registro::DATE<=:fechasolicitudFin)',
                                                        array(':fechasolicitudInicio'=>$fechaLunes,':fechasolicitudFin'=>$fechaDomingo));
                if($cantidadLiquidacion >= $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_liquidacion = 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 static 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 CheckDeudas($id_socio){

        $deudas = array();
        $deudas['prest']='';
        $deudas['ret_parc']='';

        if (!empty($id_socio) && is_numeric($id_socio)) {

                //Inicio de busqueda de solicitudes aprobadas (credito, reest., refin., retiros)

                //echo "<pre>";print_r($id_socio); exit;

                $creditos = Credito::model()->findAll('idasociado=:socio', array(':socio'=>$id_socio));
                //echo "<pre>"; print_r($creditos); exit;

                $retiros = RetiroParcial::model()->findAll('idasociado=:socio', array(':socio'=>$id_socio));
                //echo "<pre>"; print_r($retiros); exit;
                //echo "<pre>cred+ret";print_r($creditos); echo "\n";print_r($retiros); exit;
                $arr = array('prest'=>false, 'ret_parc'=>false);
                //$cred = false;
                //$ret = false;

                if (!empty($creditos)) {

                    $solicitudes = 0;

                    foreach ($creditos as $key => $value) {

                        $prestamo = CreditoSeguimiento::model()->find('id_credito=:credito AND id_estatus_credito=2 AND actual=true', array(':credito'=>$value->id));

                        if (!empty($prestamo)) {

                            $solicitudes++;
                        }
                    }

                    if ($solicitudes != 0) {

                        $deudas['prest']= $solicitudes.' préstamo(s)';
                        $arr['prest']=true;

                    }
                }

                if (!empty($retiros)) {

                    $solicitudes_retiro = 0;

                    foreach ($retiros as $clave => $valor) {

                        $retiro = EstatusRetiroParcial::model()->find('id_retiro_parcial=:retiro AND id_estatus_retiro=2 AND actual=true', array(':retiro'=>$valor->id));

                        if (!empty($retiro)) {

                            $solicitudes_retiro++;
                        }
                    }

                    if ($solicitudes_retiro != 0) {

                        $deudas['ret_parc']= $solicitudes_retiro.' retiro(s) parcial(es)';
                        $arr['ret_parc']=true;
                    }
                }

                $result = array('bool'=>$arr, 'msgs'=>$deudas);
//echo "<pre>"; print_r($result); exit;
                return $result;
        }
    }

    public function GetCuenta($id_socio){

        if (!empty($id_socio)) {

            $cuenta = Asociado::model()->find('cedula=:cedula AND blnborrado=false AND id_estatus in(1,4) ORDER BY idasociado desc', array(':cedula'=>$id_socio))->cuenta_bancaria;

            if (!empty($cuenta) && is_numeric($cuenta)) {

                return $cuenta;

            }else{

                return false;
            }

        }
    }
    public function estaLiquidacionNominaPago(){
            $model = PagosMasivosDetalle::model()->find('id_proceso=:id AND id_nombre_proceso = 3 AND id_estatus_detalle in(1,2)',[':id'=>$this->id]);
            if($model)
                return true;
            return false;
        }
    public static function checkSolicitud($socio){

        if (!empty($socio)) {

            $sol_socio = self::model()->findAll('idasociado=:socio and blnborrado=false', array(':socio'=>$socio));

            if (!empty($sol_socio)) {
                //echo "<pre>";print_r($sol_socio);exit;
                foreach ($sol_socio as $key => $value) {

                    if ($value->idEstatus == 1 || $value->idEstatus == 2 || $value->idEstatus == 4) {

                        return true;
                    }
                }
            }else{

                return false;
            }
        }
    }


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

    public function generarDeducciones($deducciones)
    {
        (new Warp($deducciones))->map(function ($ajuste) {
            AjusteHaberes::generar([
                'idasociado' => $this->idasociado,
                'id_liquidacion' => $this->id,
                'id_tipo_ajuste' => 1,
                'id_concepto_ajuste' => $ajuste['concepto'],
                'id_tipo_movimiento' => $ajuste['tipo_movimiento'],
                'observacion' => $ajuste['descripcion'],
                'numero_operacion' => $ajuste['numero_operacion'],
                'fecha_operacion' => $ajuste['fecha_operacion'],
                'monto_asociado' => $this->format($ajuste['monto_asociado']),
                'monto_patrono' => $this->format($ajuste['monto_patrono']),
            ], 2);
        });
    }

    private function format($number)
    {
        if (empty($number)) {
            return 0;
        }

        return number_format($number, 2, ',', '.');
    }

    public function liquidarCuotasDePrestamos()
    {
        $this->pagarCuotasNoAfectadas();
        $this->pagarCuotasAfectadas();
        $this->pagarPrestamosCongeladosPorLiquidacion();
    }

    public function pagarCuotasNoAfectadas()
    {
        Yii::app()->getDb()->createCommand('
            update prestamos.credito_tabla_amortizacion set id_estatus_cuota=13
            from (
                select cta.id as id_cuota
                from retiro.liquidacion l
                inner join prestamos.credito c on c.idasociado=l.idasociado
                  and c.blnborrado is false
                inner join prestamos.credito_tabla_amortizacion cta on cta.idcredito=c.id
                where l.id=:id
                  and cta.blnborrado is false
                  and id_estatus_cuota is null
            ) as d
            where id=d.id_cuota;
        ')->bindValues([
            'id' => $this->id
        ])->execute();
    }

    public function pagarCuotasAfectadas()
    {
        Yii::app()->getDb()->createCommand('
            update prestamos.credito_tabla_amortizacion set id_estatus_cuota=2
            from (
                select cta.id as id_cuota
                from retiro.liquidacion l
                inner join prestamos.credito c on c.idasociado=l.idasociado
                  and c.blnborrado is false
                inner join prestamos.credito_tabla_amortizacion cta on cta.idcredito=c.id
                where l.id=:id
                  and cta.blnborrado is false
                  and id_estatus_cuota in (1,3,6,7,8,9,12)
            ) as d
            where id=d.id_cuota;
        ')->bindValues([
            'id' => $this->id
        ])->execute();
    }

    public function pagarPrestamosCongeladosPorLiquidacion()
    {
        $creditosCongeladosPorLiquidacion = Yii::app()->getDb()->createCommand('
            select c.id
            from retiro.liquidacion l
            inner join prestamos.credito c on c.idasociado=l.idasociado
              and c.blnborrado is false
            inner join prestamos.credito_seguimiento cs on cs.id_credito=c.id
              and cs.actual is true
              and cs.id_estatus_credito=17
            where l.id=:id
        ')->bindValues([
            'id' => $this->id
        ])->queryAll();

        foreach ($creditosCongeladosPorLiquidacion as $credito) {
            CreditoSeguimiento::model()->updateAll(['actual' => false], 'id_credito=:id', [':id' => $credito['id']]);
            $model = new CreditoSeguimiento();
            $model->id_credito = $credito['id'];
            $model->id_estatus_credito = 21;
            $model->save();
        }

    }

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

    public function gestionarCuotasAfectadas()
    {
        return (new CuotasAfectadas($this))->gestionar();
    }
    
    public function getDescripcionCuotasPrestamos()
    {
        return 'Pagada por liquidación '.$this->getFechaAprobacion();
    }
    
    public function gestionarAportesEnTransito()
    {
        $aportes = $this->getAportesEnTransito();

        if (count($aportes) == 0) {
            return;
        }

        (new Warp($aportes))->map(function ($aporte) {
            $this->convertirEnDiferido($aporte);
        });

        $this->eliminarAporteOrdinario();
    }

    protected function convertirEnDiferido($aporteOrdinario)
    {
        $model = new AporteOrdinarioDiferido('cm_aportes_ordinarios_diferidos');
        $model->setAttributes($aporteOrdinario);
        $model->observaciones = 'Reverso de aportes en transito por liquidación';
        $model->id_estatus_aod = 5;
        $model->save();

        return $model;
    }

    protected function eliminarAporteOrdinario()
    {
        return Yii::app()->getDb()->createCommand('
            update retenciones.aporte_ordinario set blnborrado=true
            from (
                select ao.id as id_aporte,
                    a.cedula,
                    ao.id_txt,
                    ao.id_tipo_nomina as tipo_nomina,
                    ao.id_unidad as unidad,
                    ao.sueldo_base as sueldo,
                    ao.aporte_asociado, 
                    ao.aporte_patrono,
                    ao.blnborrado
                from retiro.liquidacion l
                inner join retenciones.aporte_ordinario ao on ao.id_asociado=l.idasociado
                inner join retenciones.estatus_txt_integrado eti on eti.id_datos_txt_integrado=ao.id_txt
                    and eti.actual is true
                    and eti.id_estatus_txt in (1,2,3)
                inner join asociado a on a.idasociado=ao.id_asociado
                where l.id=:id 
                    and ao.blnborrado is false
            ) t
            where id=t.id_aporte
        ')->bindValue('id', $this->id)->execute();
    }

    private function getAportesEnTransito()
    {
        return Yii::app()->getDb()->createCommand('
            select ao.id,
                   a.cedula,
                   ao.id_txt,
                   ao.id_tipo_nomina as tipo_nomina,
                   ao.id_unidad as unidad,
                   ao.sueldo_base as sueldo,
                   ao.aporte_asociado,
                   ao.aporte_patrono
            from retiro.liquidacion l
            inner join retenciones.aporte_ordinario ao on ao.id_asociado=l.idasociado
            inner join retenciones.estatus_txt_integrado eti on eti.id_datos_txt_integrado=ao.id_txt
                and eti.actual is true
                and eti.id_estatus_txt in (1,2,3)
            inner join asociado a on a.idasociado=ao.id_asociado
            where l.id=:id
        ')->bindValue('id', $this->id)->queryAll();
    }

    public function getAporteAportesEnTransitoAgrupados()
    {
        return Yii::app()->getDb()->createCommand('
            select l.id,
                a.cedula,
                ao.id_unidad,
                sum(ao.aporte_asociado) as aporte_asociado,
                sum(ao.aporte_patrono) as aporte_patrono
            from retiro.liquidacion l
            inner join retenciones.aporte_ordinario ao on ao.id_asociado=l.idasociado
                and ao.blnborrado is false
            inner join retenciones.estatus_txt_integrado eti on eti.id_datos_txt_integrado=ao.id_txt
                and eti.actual is true
                and eti.id_estatus_txt=3 -- aprobados
            inner join asociado a on a.idasociado=ao.id_asociado
            where l.id=:id
            group by l.id, ao.id_unidad, a.cedula
        ')->bindValue('id', $this->id)->queryAll();
    }

    public function getFechaAprobacion()
    {
        $estatus = $this->estatusActual;

        return $estatus->id_estatus_liquidacion == 2
            ? $estatus->fecha_registro
            : null;
    }

    public function gestionarAportesVoluntarios()
    {
        if ($this->hasCapitalizacionesAporteVoluntario()) {
            throw new Exception('El asociado posee aportes voluntarios en tramite consulte con el administrador');
        }

        $this->denegarRetirosAporteVoluntarios();
    }

    protected function denegarRetirosAporteVoluntarios()
    {
        $aportes = Yii::app()->getDb()->createCommand("
            select av.id
            from retenciones.aporte_voluntario  av
            inner join retenciones.estatus_aporte_voluntario eav on eav.id_aporte_voluntario=av.id
                and eav.id_status_av=1 -- cargado
                and eav.actual is true
            where av.id_tipo_aporte_voluntario=2 -- retiro
                and av.id_asociado=:id
        ")->bindValue('id', $this->idasociado)->queryAll();

        (new Warp($aportes))->map(function ($aporte) {
            EstatusAporteVoluntario::seguimiento($aporte['id'], 7);
        });
    }

    public function hasCapitalizacionesAporteVoluntario()
    {
        return Yii::app()->getDb()->createCommand("
            select exists(
                select 1
                from retenciones.aporte_voluntario  av
                inner join retenciones.estatus_aporte_voluntario eav on eav.id_aporte_voluntario=av.id
                    and eav.id_status_av=1 -- cargado
                    and eav.actual is true
                inner join retenciones.estatus_txt_integrado eti on eti.id_datos_txt_integrado=av.id_txt_integrado
                    and eti.actual is true
                where av.id_tipo_aporte_voluntario=1 -- retiro
                    and av.id_asociado=:id
                    and eti.id_estatus_txt<>4
            )
        ")->bindValue('id', $this->idasociado)->queryScalar();
    }

    /**
     * Retorna el tipo de subproceso "Pagada por liquidación"
     *
     * @return integer
     */
    public function getTipoSubproceso()
    {
        return 1;
    }
}
