<?php

/**
 * This is the model class for table "prestamos.datos_pre_nomina_credito".
 *
 * The followings are the available columns in table 'prestamos.datos_pre_nomina_credito':
 * @property integer $id
 * @property string $nombre_archivo
 * @property string $descripcion
 * @property string $fecha_registro
 * @property string $total_aportes
 * @property integer $cant_aportantes
 * @property string $fecha_aporte
 * @property string $id_usuario
 * @property string $id_tipo_carga
 * @property boolean $blnborrado
 * @property string $id_unidad
 * @property integer $id_tipo_momina_periodo
 *
 * The followings are the available model relations:
 * @property EstatusPreNomina[] $prestamos.estatusPreNominas
 * @property TipoCargaPreNomina $idTipoCarga
 * @property CreditoTablaAmortizacion[] $prestamos.creditoTablaAmortizacions
 */
class DatosPreNominaCredito extends CActiveRecord
{
    public  $id_estatus, $nombre_estatus, $fecha_registro_range=array();
    public  $cuotas_reclamar, $id_tipo_nomina, $numero_periodo;
    public $fecha_comprobante;
    public $observacion;

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

	/**
	 * @return array validation rules for model attributes.
	 */
	public function rules()
	{
		// NOTE: you should only define rules for those attributes that
		// will receive user inputs.
		return array(
			array('fecha_registro', 'required'),
            array('cant_aportantes', 'numerical', 'integerOnly'=>true),
			array('fecha_comprobante', 'required', 'on' => 'fecha_comprobante'),
			array('total_aportes', 'length', 'max'=>20),
			array('nombre_archivo, descripcion, fecha_aporte, id_usuario, id_tipo_carga,  blnborrado, id_unidad, fecha_comprobante, observacion', 'safe'),
			// The following rule is used by search().
			// @todo Please remove those attributes that should not be searched.
			array('id_tipo_nomina,numero_periodo,id_unidad,id, nombre_archivo, id_estatus, nombre_estatus, descripcion, fecha_registro, total_aportes, cant_aportantes, fecha_aporte, id_usuario, id_tipo_carga,  blnborrado, id_unidad, fecha_registro_range, cuotas_reclamar', 'safe', 'on'=>'search'),
		);
	}

	/**
	 * @return array relational rules.
	 */
	public function relations()
	{
		// NOTE: you may need to adjust the relation name and the related
		// class name for the relations automatically generated below.
		return array(
			'prestamos.estatusPreNominas' => array(self::MANY_MANY, 'EstatusPreNomina', 'pre_nomina_seguimiento(id_pre_nomina_credito, id_estatus_pre_nomina)'),
			'idTipoCarga' => array(self::BELONGS_TO, 'TipoCargaPreNomina', 'id_tipo_carga'),
			'prestamos.creditoTablaAmortizacions' => array(self::MANY_MANY, 'CreditoTablaAmortizacion', 'pre_nomina_tabla_amortizacion(id_pre_nomina_credito, id_tabla_amortizacion)'),
			'creditoTablaPrenomiona' => array(self::HAS_MANY, 'PreNominaTablaAmortizacion', 'id_pre_nomina_credito', 'condition' => 'blnborrado is false'),
			'preNominaTablaPrenomina' => array(self::HAS_MANY, 'PreNominaTablaAmortizacion', 'id_pre_nomina_credito'),
            'idTipoMominaPeriodo' => array(self::BELONGS_TO, 'TipoNominaPeriodo', 'id_tipo_momina_periodo'),
            'idUnidad' => array(self::BELONGS_TO, 'Unidad', 'id_unidad'),
            'preNominaSeguimientos' => array(self::HAS_MANY, 'PreNominaSeguimiento', 'id_pre_nomina_credito'),
            'preNominaSeguimientosActual' => array(self::HAS_MANY, 'PreNominaSeguimiento', 'id_pre_nomina_credito','condition'=>'actual =true'),
 
		);
	}

	/**
	 * @return array customized attribute labels (name=>label)
	 */
	public function attributeLabels()
	{
		return array(
			'id' => 'ID',
			'nombre_archivo' => 'Nombre del archivo',
			'descripcion' => 'Descripción',
			'fecha_registro' => 'Fecha de registro',
			'total_aportes' => 'Total en crédito',
			'cant_aportantes' => 'Cantidad de aportantes',
			'fecha_aporte' => 'Fecha de vencimiento',
			'id_usuario' => 'Id Usuario',
			'id_tipo_carga' => 'Tipo de carga',
			'blnborrado' => 'Blnborrado',
			'id_unidad' => 'Unidad',
			'id_tipo_momina_periodo' => 'Periodo de la nomina',
            'id_estatus' => 'Estatus',
            'fecha_comprobante' => 'Fecha de comprobante',
			'observacion' => 'Observación',
		);
	}

	/**
	 * Retrieves a list of models based on the current search/filter conditions.
	 *
	 * Typical usecase:
	 * - Initialize the model fields with values from filter form.
	 * - Execute this method to get CActiveDataProvider instance which will filter
	 * models according to data in model fields.
	 * - Pass data provider to CGridView, CListView or any similar widget.
	 *
	 * @return CActiveDataProvider the data provider that can return the models
	 * based on the search/filter conditions.
	 */
	public function search()
	{
		// @todo Please modify the following code to remove attributes that should not be searched.

		$criteria=new CDbCriteria;
                $criteria->with='idUnidad.unidadUsario';
                $criteria->condition = 't.blnborrado=false';
                $criteria->together = true;
		$criteria->compare('id',$this->id);
		$criteria->compare('nombre_archivo',$this->nombre_archivo,true);
		$criteria->compare('lower(t.descripcion)', strtolower($this->descripcion), true);
		$criteria->compare('fecha_registro',$this->fecha_registro,true);
		$criteria->compare('total_aportes',$this->total_aportes,true);
		$criteria->compare('cant_aportantes',$this->cant_aportantes);
		$criteria->compare('fecha_aporte',$this->fecha_aporte,true);
		$criteria->compare('id_usuario',$this->id_usuario,true);
		$criteria->compare('id_tipo_carga',$this->id_tipo_carga,true);
		$criteria->compare('id_unidad',$this->id_unidad);
		//$criteria->compare('num_comprobante',$this->num_comprobante,true);
		$criteria->compare('blnborrado',$this->blnborrado);
		if(isset($this->id_estatus) && $this->id_estatus !=''){
			
                    
                    $criteria->join='JOIN prestamos.pre_nomina_seguimiento as a on a.id_pre_nomina_credito=t.id';
                    $criteria->addCondition('a.id_estatus_pre_nomina ='.$this->id_estatus.' AND a.actual = true');
                    
                }
        if(isset($this->cuotas_reclamar) && $this->cuotas_reclamar !=''){
            // $criteria->join.='LEFT JOIN "retenciones"."datos_txt_integrado" "idDatoTxt" ON ("t"."id"="idDatoTxt"."id_prenomina_credito")
            // 	LEFT JOIN "prestamos"."datos_txt_tabla_amortizacion_diferido" "idDatoDiferidos" ON ("idDatoTxt"."id"="idDatoDiferidos"."id_txt")';
            // if($this->cuotas_reclamar ==1)
            // 	$criteria->addCondition('"idDatoDiferidos".id_estatus_amortizacion_diferida = 8');
           	// else
            // 	$criteria->addCondition('"idDatoDiferidos".id_estatus_amortizacion_diferida != 8');

            if($this->cuotas_reclamar ==1)
            	 $criteria->join = 'JOIN "prestamos"."pre_nomina_tabla_amortizacion" "prenomina" ON t.id = id_pre_nomina_credito
											AND id_estatus_cuota_excluida =8';
           	else
            	$criteria->join = 'JOIN "prestamos"."pre_nomina_tabla_amortizacion" "prenomina" ON t.id = id_pre_nomina_credito
											AND id_estatus_cuota_excluida !=8';
        }
		$from = $to = '';
		if (count($this->fecha_registro_range)>=1) {
			if (isset($this->fecha_registro_range['from'])) {
				$from = $this->fecha_registro_range['from'];
			}
			if (isset($this->fecha_registro_range['to'])) {
				$to= $this->fecha_registro_range['to'];
			}
		 
		}
		if ($from!='' || $to !='') {
			if ($from!='' && $to!='') {
				$from = date("d-m-Y", strtotime($from));
				$to = date("d-m-Y", strtotime($to));
				$criteria->compare('t.fecha_registro',">= $from",false);
				$criteria->compare('t.fecha_registro',"<= $to",false);
			}
			else {
				if ($from!='') $creation_time = $from;
				if ($to != '') $creation_time = $to;
				$creation_time = date("d-m-Y", strtotime($creation_time));
				$criteria->compare('t.fecha_registro', "$creation_time" ,false);
			}
		}
                
                
                
                if (!Yii::app()->user->checkAccess('usuario_administrador') && !Yii::app()->user->checkAccess('usuario_analista') )
                   $criteria->compare('idusuario',Yii::app()->user->id);
            
            
                $criteria->order='t.id desc';
		return new CActiveDataProvider($this, array(
			'criteria'=>$criteria,
		));
	}

	public function searchViewRezagados(){
    	$sql="SELECT un.idunidad, un.descripcion,cdt.id_tipo_nomina,tpnominap.id as id_tipo_momina_periodo,nombre_nomina, numero_periodo, fecha_desde,fecha_hasta, count(tabla.id) as cantidad
				FROM prestamos.credito_tabla_amortizacion as tabla
				JOIN prestamos.credito as cdt ON tabla.idcredito = cdt.id
				JOIN prestamos.credito_seguimiento as sg ON cdt.id =  sg.id_credito AND actual =  true AND id_estatus_credito=  4
				JOIN retenciones.tipo_nomina as tpnomina ON cdt.id_tipo_nomina = tpnomina.id
				JOIN asociado as asociado ON cdt.idasociado = asociado.idasociado
				JOIN unidad as un on asociado.idunidad = un.idunidad
				JOIN prestamos.tipo_nomina_periodo tpnominap ON cdt.id_tipo_nomina =tpnominap.id_tipo_nomina AND fecha_vencimiento BETWEEN fecha_desde AND fecha_hasta
				WHERE tabla.id_estatus_cuota is null AND fecha_vencimiento < now() AND tabla.blnborrado = false";
		if($this->id_unidad)$sql.=" AND un.idunidad=".$this->id_unidad;	
		if($this->id_tipo_nomina)$sql.=" AND cdt.id_tipo_nomina=".$this->id_tipo_nomina;	
		if($this->numero_periodo)$sql.=" AND numero_periodo=".(int)$this->numero_periodo;	
		$sql.="
				GROUP BY un.idunidad, un.descripcion,nombre_nomina, numero_periodo, fecha_desde,fecha_hasta,cdt.id_tipo_nomina,tpnominap.id 
				ORDER BY idunidad, cdt.id_tipo_nomina,fecha_desde DESC";

				$sqlCount="SELECT count(idunidad) FROM (".$sql.") as faltantes";
// echo $sql;exit;
                $rawData = Yii::app()->db->createCommand($sql); //or use ->queryAll(); in CArrayDataProvider
                $count = Yii::app()->db->createCommand($sqlCount)->queryScalar();
               return new CSqlDataProvider($rawData, array(
                'totalItemCount'=>$count,
                'keyField' =>'idunidad',
                'sort'=>array(
                        'attributes'=>array(
                                            'descripcion', 'cdt.id_tipo_nomina,', 'numero_periodo',
                                            ),
                        'defaultOrder' => array(
                                'cedula' => CSort::SORT_ASC, //default sort value
                            ),
                            ),
                'pagination'=>array(
                        'pageSize'=>20,
                        ),
                ));
//    return new CActiveDataProvider($this, array(
//      'criteria'=>$criteria,
//    ));
  
	}

	public function searchViewGeneradorRezagados($idunidad, $idperido){
    	$sql="SELECT un.idunidad, un.descripcion,cdt.id_tipo_nomina,tpnominap.id as id_tipo_momina_periodo,nombre_nomina, numero_periodo, fecha_desde,fecha_hasta, count(tabla.id) as cantidad
				FROM prestamos.credito_tabla_amortizacion as tabla
				JOIN prestamos.credito as cdt ON tabla.idcredito = cdt.id
				JOIN prestamos.credito_seguimiento as sg ON cdt.id =  sg.id_credito AND actual =  true AND id_estatus_credito=  4
				JOIN retenciones.tipo_nomina as tpnomina ON cdt.id_tipo_nomina = tpnomina.id
				JOIN asociado as asociado ON cdt.idasociado = asociado.idasociado
				JOIN unidad as un on asociado.idunidad = un.idunidad
				JOIN prestamos.tipo_nomina_periodo tpnominap ON cdt.id_tipo_nomina =tpnominap.id_tipo_nomina AND fecha_vencimiento BETWEEN fecha_desde AND fecha_hasta
				WHERE tabla.id_estatus_cuota is null AND fecha_vencimiento < now() AND tabla.blnborrado = false
					AND un.idunidad=".$idunidad." AND tpnominap.id= ".$idperido;
		if($this->id_tipo_nomina)$sql.=" AND cdt.id_tipo_nomina=".$this->id_tipo_nomina;	
		if($this->numero_periodo)$sql.=" AND numero_periodo=".(int)$this->numero_periodo;	
		$sql.="
				GROUP BY un.idunidad, un.descripcion,nombre_nomina, numero_periodo, fecha_desde,fecha_hasta,cdt.id_tipo_nomina,tpnominap.id 
				ORDER BY idunidad, cdt.id_tipo_nomina,numero_periodo";

				$sqlCount="SELECT count(idunidad) FROM (".$sql.") as faltantes";

                $rawData = Yii::app()->db->createCommand($sql); //or use ->queryAll(); in CArrayDataProvider
                $count = Yii::app()->db->createCommand($sqlCount)->queryScalar();
               return new CSqlDataProvider($rawData, array(
                'totalItemCount'=>$count,
                'keyField' =>'idunidad',
                'sort'=>array(
                        'attributes'=>array(
                                            'descripcion', 'cdt.id_tipo_nomina,', 'numero_periodo',
                                            ),
                        'defaultOrder' => array(
                                'cedula' => CSort::SORT_ASC, //default sort value
                            ),
                            ),
                'pagination'=>array(
                        'pageSize'=>20,
                        ),
                ));
//    return new CActiveDataProvider($this, array(
//      'criteria'=>$criteria,
//    ));

	}

    public function nominaConciliada()
    {
        if (in_array($this->id_estatus, [
            'descarga_rrhh' => 1,
            'carga_rechazada' => 6,
        ])) {
            return false;
        } else {
            return true;
        }
    }

        public function afterFind(){
            $model = PreNominaSeguimiento::model()->find('id_pre_nomina_credito=:id AND actual =  TRUE',array(':id'=>  $this->id));
            if($model){
                $this->nombre_estatus = $model->idEstatusPreNomina->nombre_estatus;
                $this->id_estatus = $model->id_estatus_pre_nomina;
            }
//            $model = CreditoSeguimiento::model()->find('id_credito=:id AND id_estatus_credito =1',array(':id'=>  $this->id));
//            if($model){
//                $this->fecha_solicitud = $model->fecha_registro;
//            }
            
            return parent::afterFind();
        }        
        public function beforeSave(){      
            $this->fecha_registro=date('d-m-Y');
            $this->id_usuario=Yii::app()->user->id;
            if($this->id_unidad=='')
                $this->id_unidad = NULL;
            return parent::beforeSave();
        }

        public function TieneCuotasReclamarAdmin(){
        	$model = DatosTxtTablaAmortizacionDiferido::model()->with('idDatoTxt')->count('id_prenomina_credito=:id_prenomina_credito AND "idDatoTxt".blnborrado = false AND id_estatus_amortizacion_diferida = 8',[':id_prenomina_credito'=> $this->id]);
        	if($model > 0)
        		return true;
        	else
        		return false;
        }
        public function TieneCuotasReclamar(){
        	$model = PreNominaTablaAmortizacion::model()->count('id_pre_nomina_credito=:id AND id_estatus_cuota_excluida = 8',[':id'=> $this->id]);
        	if($model > 0)
        		return true;
        	else
        		return false;
        }

    public function setEstatusPreNomina($estatus)
    {
        PreNominaSeguimiento::crear([
            'id_estatus_pre_nomina' => $estatus,
            'id_pre_nomina_credito' => $this->id,
        ]);
    }

    public function setEstatusNomina($estatus)
    {
        $nomina = DatosTxtIntegrado::model()->find('id_prenomina_credito=:id ORDER BY id desc', ['id' => $this->id]);
        EstatusTxtIntegrado::seguimiento($nomina->id, 1);
    }

    public function cuotas()
    {
        return Yii::app()->getDb()->createCommand('
            SELECT pnta.id_tabla_amortizacion
            FROM prestamos.pre_nomina_tabla_amortizacion pnta
            INNER JOIN prestamos.credito_tabla_amortizacion cta ON cta.id=pnta.id_tabla_amortizacion
            AND cta.id_estatus_cuota IN (1, 6, 7, 8, 9)
            WHERE pnta.id_pre_nomina_credito=:id
              AND pnta.actual = TRUE
        ')->bindValues([
            'id' => $this->id
        ])->queryAll();
    }

    public function getDataAgrupada(){

    	return Yii::app()->getDb()->createCommand("
    		SELECT cedula, concat_ws(nombre, apellidos,' ') as nombre_apellido, tt.descripcion as tipo_trabajador,
				( 
					SELECT cuenta_bancaria
					FROM asociado_cuenta_banco as acb
					WHERE acb.idasociado = c.idasociado AND cuenta_principal = TRUE 
					LIMIT 1
				)
				as cuenta_bancaria,codigo AS cod_unidad,
				sum(monto_capital) AS capital_cuota, SUM(monto_interes) AS interes_cuota, SUM(monto_cuota) AS monto_cuota	

			FROM prestamos.pre_nomina_tabla_amortizacion AS creditoTablaPrenomiona
				INNER JOIN prestamos.credito_tabla_amortizacion as ctm ON creditoTablaPrenomiona.id_tabla_amortizacion = ctm.id 
				INNER JOIN prestamos.credito AS c ON ctm.idcredito = c.id
				INNER JOIN asociado AS aso ON c.idasociado = aso.idasociado
				LEFT JOIN tipo_trabajador as tt ON aso.idtipotrabajador = tt.idtipotrabajador
				--LEFT JOIN asociado_cuenta_banco AS acb ON aso.idasociado = acb.idasociado AND cuenta_principal = TRUE 
				LEFT JOIN unidad as u ON aso.idunidad = u.idunidad
				WHERE creditoTablaPrenomiona.id_pre_nomina_credito=:id
                    and creditoTablaPrenomiona.blnborrado is false
				GROUP BY c.idasociado,cedula,nombre, apellidos,tt.descripcion ,u.codigo
				ORDER BY cedula

    		"

    	)->bindValues([
            'id' => $this->id
        ])->queryAll();

    }

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