<?php

/**
 * This is the model class for table "retenciones.aporte_voluntario".
 *
 * The followings are the available columns in table 'retenciones.aporte_voluntario':
 * @property integer $id
 * @property string $id_asociado
 * @property string $id_banco_destino
 * @property string $cuenta_destino
 * @property string $referencia
 * @property string $fecha_pago
 * @property string $fecha_registro
 * @property string $id_aportante
 * @property string $monto
 * @property string $id_txt_integrado
 * @property boolean $blnborrado
 * @property boolean $aprobado
 *
 * The followings are the available model relations:
 * @property Aportante $idAportante
 * @property Asociado $idAsociado
 * @property ParamBancos $idBancoDestino
 * @property DatosTxtIntegrado $idTxtIntegrado

 */
class AporteVoluntario extends CActiveRecord
{
        public $anombre,
                $aapellido,
                $acedula,
                $aid_unidad,
                $estatus,
                $nombre_estatus,
                $fecha_status,
                $fecha_status_range=array(),
                $fecha_solicita,
                $fecha_solicita_range=array();

        public $fecha_pagos_range = array(), $fecha_referencia_range = array(), $fecha_registro_range = array();
        public $porcentajeComision;
    public $fecha_comprobante;
    public $procesoPago;
    public $observacion;
    
	/**
	 * @return string the associated database table name
	 */
	public function tableName()
	{
		return 'retenciones.aporte_voluntario';
	}

	/**
	 * @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('id_banco_destino,cuenta_destino,referencia,fecha_pago,monto,id_asociado', 'required', 'on' => 'individual'),
            array('acedula,id_banco_asociado,monto', 'required', 'on' => 'retiro_aporte_voluntario'),
            array('monto', 'required', 'on' => 'aprobarRetiro'),
            array('acedula,monto_cargado,aid_unidad,id_aportante', 'required', 'on' => 'carga_masiva'),
            array('id_asociado,id_unidad', 'required', 'on' => 'carga_masiva_guardado'),
            array('monto, monto_cargado', 'numerical', 'integerOnly' => false, 'on' => 'carga_masiva'),
            array('id_asociado,acedula,aid_unidad,id_aportante, opcion_retiro', 'numerical', 'integerOnly' => true),
            array('monto, monto_retirado, monto_capitalizado', 'length', 'max' => 20),
            array('opcion_retiro', 'required', 'on' => array('carga_masiva_guardado', 'carga_masiva')),
            array('monto', 'validarAdm', 'on' => 'retiro_aporte_voluntario'),
            array('monto', 'validarAsc', 'on' => 'retiro_aporte_voluntario_asc'),
            array('id_asociado, id_banco_destino, cuenta_destino, referencia, fecha_pago, fecha_registro, fecha_referencia,
                fecha_pago, fecha_registro, id_aportante, id_txt_integrado, blnborrado, observacion', 'safe'),
            array('acedula', 'validaAsociado', 'on' => (self::getConf('NO DEFINIDOS') == 'SI') ? 'carga_masiva_guardado' : 'carga_masiva'),
            array('fecha_pagos_range,anombre,aapellido,acedula,id, id_asociado, id_banco_destino, cuenta_destino, referencia, fecha_pago, fecha_registro, id_aportante, monto, id_txt_integrado, blnborrado,monto_retirado,monto_total, estatus, fecha_status, fecha_status_range, fecha_solicita, fecha_solicita_range, nombre_estatus, aid_unidad, id_tipo_aporte_voluntario', '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(
            'idAportante' => array(self::BELONGS_TO, 'Aportante', 'id_aportante'),
            'idTipoAporteVoluntario' => array(self::BELONGS_TO, 'TipoAporteVoluntario', 'id_tipo_aporte_voluntario'),
            'idBancoAsociado' => [self::HAS_ONE, 'AsociadoCuentaBanco', 'idasociado', 'condition' => 'cuenta_principal IS TRUE AND blnborrado IS FALSE'],
			'idAsociado' => array(self::BELONGS_TO, 'Asociado', 'id_asociado'),
			'bancoAso' => array(self::BELONGS_TO, 'Banco', 'id_banco_asociado'),
            'opcionRetiro' => array(self::BELONGS_TO, 'TipoOperacion', 'opcion_retiro'),
			'idBancoDestino' => array(self::BELONGS_TO, 'ParamBancos', 'id_banco_destino'),
			'idTxtIntegrado' => array(self::BELONGS_TO, 'DatosTxtIntegrado', 'id_txt_integrado'),
            'idUnidad' => array(self::BELONGS_TO, 'Unidad', 'id_unidad'),
			'idUsuario' => array(self::BELONGS_TO, 'CrugeUser', 'id_usuario'),
            //'estatus' => array(self::MANY_MANY, 'EstatusAporteVoluntario', 'estatus_aporte_voluntario(id_aporte_voluntario, id_status_av)'),
            'estatus' => array(self::HAS_MANY, 'EstatusAporteVoluntario', 'id_aporte_voluntario'),
            'estatusActual' => array(self::HAS_ONE, 'EstatusAporteVoluntario', 'id_aporte_voluntario', 'condition' => 'actual IS TRUE'),
		);
	}

	/**
	 * @return array customized attribute labels (name=>label)
	 */
	public function attributeLabels()
	{

        $numero_operacion = $this->scenario == 'pagar' ? 'Numero de operación ': 'Referencia';

		return array(
			'id' => 'ID',
			'id_asociado' => 'Id Asociado',
			'id_banco_destino' => 'Banco de destino',
			'cuenta_destino' => 'Cuenta de destino',
			'referencia' => 'Referencia',
			'fecha_pago' => 'Fecha de operación',
			'fecha_registro' => 'Fecha del registro',
			'id_aportante' => 'Aportante',
			'monto' => 'Monto aporte',
			'id_txt_integrado' => 'Id Txt Integrado',
			'blnborrado' => 'Borrado',
            'acedula'=>'Cédula',
            'anombre'=>'Nombre',
            'aapellido'=>'Apellido',
            'aprobado' => 'Estatus',
            'aid_unidad'=>'Unidad',
            'estatus'=>'Estatus',
            'fecha_status' => 'Fecha estatus',
            'opcion_retiro' => 'Tipo operación',
            'monto_cargado' => 'Monto cargado',
            'monto_comision_capitaliza' => 'Comisión capitalización',
            'monto_comision_retira' => 'Comisión retira',
            'id_tipo_aporte_voluntario' => 'Tipo de aporte voluntario',
            'id_banco_asociado' => 'Banco de destino',
            'fecha_comprobante' => 'Fecha del comprobante',
		);
	}

    public function formatter($monto)
    {
        if (! empty($monto)) {
            $monto_formato = str_replace('.', '', $monto);
            $monto_formato = str_replace(',', '.', $monto_formato);

            return $monto_formato;
        }
    }


    public function validarAdm(){

        if(!$this->hasErrors('id_asociado')){

            $model = Asociado::model()->find('idAsociado=:idasociado AND blnborrado =false AND id_estatus in(1,4) ORDER BY idasociado desc' ,[':idasociado'=>$this->id_asociado]);

            $modelConf = ConfAporteVoluntario::model()->find();
            if($modelConf){

                ####################### Tiempo de registro en la caja ##########################
                if ($modelConf->tiempo_inscripcion_adm > 0) {

                    if ($modelConf->tiempo_inscripcion_adm > $model->validacionTiempoAsociado()) {

                        $this->addError('id_asociado', 'No tiene el tiempo de '.$modelConf->tiempo_inscripcion_adm.' meses, necesario para optar para el retiro de aporte voluntario...');
                    }
                }
                ####################### Tiempo de solicitud de retiro ##########################
                if ($modelConf->tiempo_solicitud_adm > 0) {

                    $modelUltimoSolicitud = EstatusAporteVoluntario::model()->with('idAporteVoluntario')->find([
                        'condition' => 'id_asociado=:id_asociado
                                        AND id_tipo_aporte_voluntario = 2
                                        AND id_status_av=:id_status_av',
                        'params' => [
                            'id_asociado' => $model->idasociado,
                            'id_status_av' => $modelConf->id_estatus_solicitud_adm,
                        ],
                        'order' => 't.id_aporte_voluntario desc'
                    ]);

                    if($modelUltimoSolicitud){

                        if ($modelConf->tiempo_solicitud_adm > $modelUltimoSolicitud->validacionTiempoSolicitud()) {
                            $this->addError('id_asociado', 'No tiene el tiempo de '.$modelConf->tiempo_solicitud_adm.' meses, necesario para optar para el retiro de aporte voluntario...');
                        }
                        
                    }

                }

                $aportes = AporteVoluntario::model()->getTotalAporte($this->id_asociado);

                $porcentaje = 1;

                if( $modelConf->porcentaje_retiro_adm != '') {
                    $porcentaje = ($modelConf->porcentaje_retiro_adm/100);
                }

                $disponible = $aportes['monto_capitalizado'] * $porcentaje;
                if ($this->monto > round($disponible, 2)) {
                    $this->addError('monto', 'El monto es mayor al disponible');
                }
            }
        }
    }


    public function validarAsc(){

        if(!$this->hasErrors('id_asociado')){

            $model = Asociado::model()->find('idAsociado=:idasociado AND blnborrado =false AND id_estatus in(1,4) ORDER BY idasociado desc' ,[':idasociado'=>$this->id_asociado]);

            $modelConf = ConfAporteVoluntario::model()->find();

            if($modelConf){

                ####################### Tiempo de registro en la caja ##########################
                if ($modelConf->tiempo_inscripcion_asc > 0) {

                    if ($modelConf->tiempo_inscripcion_asc > $model->validacionTiempoAsociado()) {

                        $this->addError('id_asociado', '<b>No tiene el tiempo de '.$modelConf->tiempo_inscripcion_asc.' meses, necesario para optar para el retiro de aporte voluntario...</b><br/> ');
                    }
                }
                
                ####################### Tiempo de solicitud de retiro ##########################
                if ($modelConf->tiempo_solicitud_asc > 0) {

                    $modelUltimoSolicitud = EstatusAporteVoluntario::model()->with('idAporteVoluntario')->find([ 'condition'=>'id_asociado=:id_asociado AND id_tipo_aporte_voluntario = 2 AND id_status_av=:id_status_av',
                                                                                                                        'params'=> [':id_asociado'=>$model->idasociado,':id_status_av'=>$modelConf->id_estatus_solicitud_asc],
                                                                                                                        'order'=> 't.id_aporte_voluntario desc'
                                                                                                                    ]);

                        if($modelUltimoSolicitud){

                            if ($modelConf->tiempo_solicitud_asc > $modelUltimoSolicitud->validacionTiempoSolicitud()) {
                                $this->addError('id_asociado', '<b>No tiene el tiempo de '.$modelConf->tiempo_solicitud_asc.' meses, necesario para optar para el retiro de aporte voluntario...</b><br/> ');
                            }
                            
                        }

                }

                $aportes = AporteVoluntario::model()->getTotalAporte($this->id_asociado);

                $porcentaje = 1;

                if( $modelConf->porcentaje_retiro_adm != '')

                    $porcentaje = ($modelConf->porcentaje_retiro_asc/100);


                $disponible = $aportes['monto_capitalizado'] * $porcentaje;
                
                if ($this->monto > round($disponible, 2)) {
                    $this->addError('monto', 'El monto es mayor al disponible');
                }


            }
        }
    }

    public function getProcesoPago()
    {
        return $this->procesoPago;
    }
    
    public function setProcesoPago($proceso)
    {
        $this->procesoPago = $proceso;

        return $this;
    }
	/**
	 * 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()
    {
        $criteria = new CDbCriteria();

        if (Yii::app()->user->checkAccess('usuario_asociado')) {
            $model = Asociado::model()->find('cedula=:cedula AND blnborrado= FALSE AND id_estatus in(1,2,4) ORDER BY idasociado desc', [
                ':cedula' => Yii::app()->user->getUser()->cedula
            ]);

            if ($model) {
                $criteria->addColumnCondition([
                    'id_asociado' => $model->idasociado
                ]);
            }
        }

        $criteria->with = 'idAsociado';
        $criteria->compare('id', $this->id);
        $criteria->compare('cedula', $this->acedula);
        $criteria->compare('UPPER(nombre||apellidos)', strtoupper($this->anombre), true);
        $criteria->compare('"idAsociado".idunidad', $this->aid_unidad);
        $criteria->compare('id_tipo_aporte_voluntario', $this->id_tipo_aporte_voluntario);
        $criteria->compare('id_banco_destino', $this->id_banco_destino);
        $criteria->compare('cuenta_destino', $this->cuenta_destino, true);
        $criteria->compare('referencia', $this->referencia, true);

        if (isset($this->estatus) && $this->estatus != '') {
            $criteria->join = 'INNER JOIN retenciones.estatus_aporte_voluntario AS est on est.id_aporte_voluntario = t.id';
            $criteria->addCondition('est.id_status_av ='.$this->estatus.' AND est.actual = true');
        }

        //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->estatus) && $this->estatus != '') {
                    $criteria->addCondition('t.fecha_registro::DATE >=\''.$from.'\' AND t.fecha_registro::DATE <=\''.$to.'\'');
                } else {
                    $criteria->join = 'INNER JOIN retenciones.estatus_aporte_voluntario AS est on est.id_aporte_voluntario = t.id';
                    $criteria->addCondition('id_status_av=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->estatus) && $this->estatus != '') {
                    $criteria->addCondition('t.fecha_registro::DATE =\''.$creation_time.'\'');
                } else {
                    $criteria->join = 'INNER JOIN retenciones.estatus_aporte_voluntario AS est on est.id_aporte_voluntario = t.id';
                    $criteria->addCondition('id_status_av=1 AND t.fecha_registro::DATE =\''.$creation_time.'\'');
                }
            }
        }

        //Filtro por fecha de estatus
        $from = $to = '';
        if (count($this->fecha_status_range) >= 1) {
            if (isset($this->fecha_status_range['from'])) {
                $from = $this->fecha_status_range['from'];
            }
            if (isset($this->fecha_status_range['to'])) {
                $to = $this->fecha_status_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->estatus) && $this->estatus != '') {
                    $criteria->addCondition('est.fecha_registro::DATE >=\''.$from.'\' AND est.fecha_registro::DATE <=\''.$to.'\'');
                } else {
                    $criteria->join = 'INNER JOIN retenciones.estatus_aporte_voluntario AS est on est.id_aporte_voluntario = t.id';
                    $criteria->addCondition('est.actual = true AND est.fecha_registro::DATE >=\''.$from.'\' AND est.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->estatus) && $this->estatus != '') {
                    $criteria->addCondition('est.fecha_registro::DATE =\''.$creation_time.'\'');
                } else {
                    $criteria->join = 'INNER JOIN retenciones.estatus_aporte_voluntario AS est on est.id_aporte_voluntario = t.id';
                    $criteria->addCondition('est.actual = true AND est.fecha_registro::DATE =\''.$creation_time.'\'');
                }
            }
        }

        $criteria->compare('fecha_registro', $this->fecha_registro, true);
        $criteria->compare('id_aportante', $this->id_aportante);
        $criteria->compare('monto', $this->monto);
        $criteria->compare('blnborrado', $this->blnborrado);

        $criteria->addcondition('id_txt_integrado is null');
        $criteria->order = 't.id DESC, t.fecha_registro desc';

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

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

    public function criteriaAporteAsociado($id)
    {
        $criteria = new CDbCriteria();
        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,4) ORDER BY idasociado desc', [':cedula' => $_GET['cedula']]);
                if ($model) {
                    $id = $model->idasociado;
                }
            } else {
                $id = 0;
            }
        }

        $criteria->with = ['opcionRetiro', 'estatusActual'];
        $criteria->compare('id_asociado', $id);

        $criteria->compare('id_banco_destino', $this->id_banco_destino);
        $criteria->compare('cuenta_destino', $this->cuenta_destino, true);
        $criteria->compare('referencia', $this->referencia, true);

        //fecha_vigencia_range
        $from = $to = '';
        if (count($this->fecha_pagos_range) >= 1) {
            if (isset($this->fecha_pagos_range['from'])) {
                $from = $this->fecha_pagos_range['from'];
            }
            if (isset($this->fecha_pagos_range['to'])) {
                $to = $this->fecha_pagos_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_pago', ">= ${from}", false);
                $criteria->compare('fecha_pago', "<= ${to}", false);
            } else {
                if ($from != '') {
                    $creation_time = $from;
                }
                if ($to != '') {
                    $creation_time = $to;
                }
                $creation_time = date('d-m-Y', strtotime($creation_time));
                $criteria->compare('fecha_pago', "${creation_time}", false);
            }
        }

        $criteria->compare('fecha_registro', $this->fecha_registro, true);
        $criteria->compare('id_aportante', $this->id_aportante);
        $criteria->compare('monto', $this->monto);
        $criteria->compare('id_txt_integrado', $this->id_txt_integrado);
        $criteria->compare('blnborrado', $this->blnborrado);

        return $criteria;
    }

    public function searchAporteAsociado($id, $ocultar = null)
    {
        $criteria = $this->criteriaAporteAsociado($id);

        if ($ocultar !== null) {
            $criteria->addColumnCondition([
                't.id_tipo_aporte_voluntario' => $ocultar
            ]);
        }

        $criteria->addColumnCondition([
            't.id_aportante' => 1,
            '"estatusActual".id_status_av' => 2, // aprobados
        ]);

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

	public function searchAporteVoluntarioFichaLiquidacion($id, $id_aportante = null, $params)
    {
        $criteria = $this->criteriaAporteAsociado($id);
        $criteria->addcondition('t.id_txt_integrado is null');
        $criteria->addColumnCondition([
            'id_aportante' => $id_aportante
         ]);

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

    public function aporteVoluntarioIndividualFichaLiquidacion($id, $id_aportante = null)
    {
        $criteria = $this->criteriaAporteAsociado($id);
        $criteria->addcondition('t.id_txt_integrado is null');
        $criteria->addColumnCondition([
            'id_aportante' => $id_aportante
        ]);

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

        return (new Warp($datos))->map(function ($aporte) {
            return [
                'id' => $aporte->id,
                'codigo' => ! empty($aporte->id_txt_integrado) ? $aporte->id_txt_integrado : 'Aporte Individual',
                'monto' => $aporte->monto,
                'aportante' => $aporte->idAportante ? $aporte->idAportante->nombre : '',
                'fecha_pago' => $aporte->fecha_pago,
                'opcion_retiro' => $aporte->opcionRetiro ? $aporte->opcionRetiro->nombre : "",
                'estatus' => $aporte->nombre_estatus,
                'fecha_registro' => ! empty($aporte->fecha_status) ? Yii::app()->format->date($aporte->fecha_status) : '',
            ];
        });
    }

    public function criteriaAporteAsociadoMasivo($id)
    {
        if($id =='')
            $id = 0;
        //echo "<pre>";print_r($_GET);exit;
        if(isset($_GET['cedula'])){//echo $_GET['cedula'];exit;
            if(is_numeric($_GET['cedula'])){
                $id = 0;
                $model= Asociado::model()->find('cedula=:cedula AND blnborrado= FALSE AND id_estatus in(1,4) ORDER BY idasociado desc',array(':cedula'=>$_GET['cedula']));
                if($model)
                  $id = $model->idasociado;
            }
            else {
                $id = 0;
            }
        }
        $criteria=new CDbCriteria;
        $criteria->select = 't.*';
        $criteria->with = array('idAsociado', 'opcionRetiro');
        $criteria->join = 'inner join retenciones.datos_txt_integrado dti on dti.id=t.id_txt_integrado
                           inner join retenciones.estatus_txt_integrado eti on eti.id_datos_txt_integrado=dti.id
                             and eti.id_estatus_txt = 5 -- txt pagado
                             and eti.actual is true';
        $criteria->compare('id', $this->id);
        $criteria->compare('"idAsociado".cedula::TEXT', $this->acedula, true);
        $criteria->compare('LOWER("idAsociado".nombre::TEXT)',   strtolower($this->anombre), true);
        $criteria->compare('LOWER("idAsociado".apellidosTEXT)', strtolower($this->aapellido), true);
        $criteria->compare('id_asociado', $this->id_asociado, true);
        $criteria->compare('id_banco_destino', $this->id_banco_destino);
        $criteria->compare('cuenta_destino', $this->cuenta_destino, true);
        $criteria->compare('referencia', $this->referencia, true);
        $from = $to = '';
        if (count($this->fecha_pagos_range) >= 1) {
            if (isset($this->fecha_pagos_range['from'])) {
                $from = $this->fecha_pagos_range['from'];
            }
            if (isset($this->fecha_pagos_range['to'])) {
                $to = $this->fecha_pagos_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_pago', ">= $from", false);
                $criteria->compare('fecha_pago', "<= $to", false);
            }
            else {
                if ($from != '') $creation_time = $from;
                if ($to != '') $creation_time = $to;
                $creation_time = date('d-m-Y', strtotime($creation_time));
                $criteria->compare('fecha_pago',  "$creation_time", false);
            }
        }
        $criteria->compare('fecha_registro', $this->fecha_registro, true);
        $criteria->compare('id_aportante', $this->id_aportante);
        $criteria->compare('opcion_retiro',  $this->opcion_retiro);
        $criteria->compare('monto::TEXT', $this->monto, true);
        $criteria->compare('monto_retirado::TEXT', $this->monto_retirado, true);
        $criteria->compare('monto_capitalizado::TEXT',  $this->monto_capitalizado, true);
        $criteria->compare('monto_total::TEXT', $this->monto_total, true);
        $criteria->addColumnCondition([
            't.blnborrado' => false,
            't.id_asociado' => $id
        ]);

        return $criteria;
    }

    public function searchAportesAsociadoMasivo($id)
    {
        $criteria = $this->criteriaAporteAsociadoMasivo($id);

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

    public function searchAVMasivoFichaLiquidacion($id, $id_aportante = null, $params)
    {
        $criteria = $this->criteriaAporteAsociado($id);
        $criteria->addcondition('t.id_txt_integrado is null');
        $criteria->addColumnCondition([
            'id_aportante' => $id_aportante,
            'opcion_retiro' => 1,
         ]);

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

    public function aportevoluntarioMasivoFichaLiquidacion($id, $id_aportante = null)
    {
        $criteria = $this->criteriaAporteAsociado($id);
        $criteria->addcondition('t.id_txt_integrado is null');
        $criteria->addColumnCondition([
            'id_aportante' => $id_aportante,
            'opcion_retiro' => 1,
         ]);

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

        return (new Warp($datos))->map(function ($aporte) {
            return [
                'id' => $aporte->id,
                'aportante' => $aporte->idAportante->nombre,
                'opcion_retiro' => $aporte->opcionRetiro ? $aporte->opcionRetiro->nombre : "",
                'monto_cargado' => $aporte->monto_cargado,
                'monto_retirado' => $aporte->monto_retirado,
                'monto_comision_retira' => $aporte->monto_comision_retira,
                'monto_capitalizado' => $aporte->monto_capitalizado,
                'monto_comision_capitaliza' => $aporte->monto_comision_capitaliza,
                'fecha_pagos' => Yii::app()->format->date($aporte->fecha_pago),
                'nombre_estatus' => $aporte->idTxtIntegrado ? $aporte->idTxtIntegrado->getEstatus() : "",
            ];
        });
    }

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

        $criteria=new CDbCriteria;
        $criteria->with = array('idAsociado',  'opcionRetiro');


        $criteria->compare('id',$this->id);
        $criteria->compare('"idAsociado".cedula::TEXT',$this->acedula,TRUE);
        $criteria->compare('LOWER("idAsociado".nombre::TEXT)',  strtolower($this->anombre),TRUE);
        $criteria->compare('LOWER("idAsociado".apellidosTEXT)',strtolower($this->aapellido),TRUE);
        $criteria->compare('id_asociado',$this->id_asociado,true);

        $criteria->compare('id_banco_destino',$this->id_banco_destino);
        $criteria->compare('cuenta_destino',$this->cuenta_destino,true);
        $criteria->compare('referencia',$this->referencia,true);
//$criteria->compare('fecha_pago',$this->fecha_pago);
//fecha_vigencia_range
        $from = $to = '';
        if (count($this->fecha_pagos_range)>=1) {
            if (isset($this->fecha_pagos_range['from'])) {
                $from = $this->fecha_pagos_range['from'];
            }
            if (isset($this->fecha_pagos_range['to'])) {
                $to= $this->fecha_pagos_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_pago',">= $from",false);
                $criteria->compare('fecha_pago',"<= $to",false);
            }
            else {
                if ($from!='') $creation_time = $from;
                if ($to != '') $creation_time = $to;
                $creation_time = date("d-m-Y", strtotime($creation_time));
                $criteria->compare('fecha_pago', "$creation_time" ,false);
            }
        }
        $criteria->join .= 'LEFT JOIN retenciones.estatus_aporte_voluntario eav on eav.id_aporte_voluntario=t.id and eav.actual IS TRUE ';
        $criteria->compare('eav.id_status_av', $this->estatus);
        $criteria->compare('fecha_registro',$this->fecha_registro,true);
        $criteria->compare('id_aportante',$this->id_aportante);
        $criteria->compare('opcion_retiro', $this->opcion_retiro);
        $criteria->compare('monto::TEXT',$this->monto,TRUE);
        $criteria->compare('monto_retirado::TEXT',$this->monto_retirado,TRUE);
        $criteria->compare('monto_capitalizado::TEXT', $this->monto_capitalizado, true);
        $criteria->compare('monto_total::TEXT',$this->monto_total,TRUE);
        $criteria->compare('id_txt_integrado',$id);
        $criteria->compare('blnborrado',$this->blnborrado);
        $criteria->order = '"idAsociado".nombre ASC';
//                $criteria->addcondition('aprobado=FALSE');

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

    public function searchAsociadosSinCuenta($id)
    {
        $criteria=new CDbCriteria;
        $criteria->with = array('idAsociado',  'opcionRetiro');
        $criteria->compare('id',$this->id);
        $criteria->compare('"idAsociado".cedula::TEXT',$this->acedula,TRUE);
        $criteria->compare('LOWER("idAsociado".nombre::TEXT)',  strtolower($this->anombre),TRUE);
        $criteria->compare('LOWER("idAsociado".apellidosTEXT)',strtolower($this->aapellido),TRUE);
        $criteria->compare('id_asociado',$this->id_asociado,true);
        $criteria->compare('id_banco_destino',$this->id_banco_destino);
        $criteria->compare('cuenta_destino',$this->cuenta_destino,true);
        $criteria->compare('referencia',$this->referencia,true);
        $from = $to = '';
        if (count($this->fecha_pagos_range)>=1) {
            if (isset($this->fecha_pagos_range['from'])) {
                $from = $this->fecha_pagos_range['from'];
            }
            if (isset($this->fecha_pagos_range['to'])) {
                $to= $this->fecha_pagos_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_pago',">= $from",false);
                $criteria->compare('fecha_pago',"<= $to",false);
            }
            else {
                if ($from!='') $creation_time = $from;
                if ($to != '') $creation_time = $to;
                $creation_time = date("d-m-Y", strtotime($creation_time));
                $criteria->compare('fecha_pago', "$creation_time" ,false);
            }
        }
        $criteria->join .= 'INNER JOIN retenciones.estatus_txt_integrado r_eti on r_eti.id_datos_txt_integrado=t.id_txt_integrado and r_eti.actual IS TRUE ';
        $criteria->compare('r_eti.id_estatus_txt', $this->estatus);
        $criteria->compare('fecha_registro',$this->fecha_registro,true);
        $criteria->compare('id_aportante',$this->id_aportante);
        $criteria->compare('opcion_retiro', $this->opcion_retiro);
        $criteria->compare('monto::TEXT',$this->monto,TRUE);
        $criteria->compare('monto_retirado::TEXT',$this->monto_retirado,TRUE);
        $criteria->compare('monto_capitalizado::TEXT', $this->monto_capitalizado, true);
        $criteria->compare('monto_total::TEXT',$this->monto_total,TRUE);
        $criteria->compare('id_txt_integrado',$id);
        $criteria->compare('blnborrado',$this->blnborrado);
        $criteria->addCondition('cuenta_destino IS NULL');
        $criteria->addCondition('opcion_retiro in (2,3)');

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

                /**
         * validaAsociado valida que la cedula esta registrada en la caja de ahorro
         * @param type $attributes
         */
        public function validaAsociado($attributes)
        {
           if($this->acedula)
               {
                if(is_numeric($this->acedula)){
                $modelAsociado=Asociado::model()->find('cedula=:ci and blnborrado=FALSE and id_estatus=1',array(':ci'=>$this->acedula));
                if(!$modelAsociado)
                    $this->addError('acedula','La cédula no pertenece a ningún asociado');
                }
               }
        }
        /**
         * Obtiene la configuracion segun el parametro
         * @param type $att
         * @return type
         */
        public function getConf($att)
        {
           $conf=ConfRetenciones::model()->find('atributo=:att',array(':att'=>$att));
           if($conf)return $conf->valor;
           else return NULL;
        }
	/**
	 * Returns the static model of the specified AR class.
	 * Please note that you should have this exact method in all your CActiveRecord descendants!
	 * @param string $className active record class name.
	 * @return AporteVoluntario the static model class
	 */
	public static function model($className=__CLASS__)
	{
		return parent::model($className);
	}


        protected function beforeSave() {

            #Monto en Bs
            if($this->scenario=='carga_masiva')
            {
                $this->monto=str_replace('.', '', $this->monto);
                $this->monto=str_replace(',', '.', $this->monto);
                if($this->monto=='')$this->monto=NULL;
            }



		return parent::beforeSave();
	}

    protected function afterSave()
    {
        VariacionesAporteVoluntario::model()->duplicar($this);
    }

    public function afterFind(){

            $data = EstatusAporteVoluntario::model()->find('id_aporte_voluntario=:id AND actual=TRUE',array(':id'=> $this->id));
            if($data){
    //echo "<pre>";print_r($data);exit;
                $this->nombre_estatus = EstatusAporte::model()->findByPk($data->id_status_av)->nombre_estatus;
                $this->estatus = $data->id_status_av;
                $this->fecha_status = $data->fecha_registro;

                $f_sol = EstatusAporteVoluntario::model()->find('id_aporte_voluntario=:id AND id_status_av =1',array(':id'=>  $this->id));

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

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

                }else{

                    $this->fecha_solicita = '';
                }
            }

        return parent::afterFind();
    }

    public function aplicarComisionAdministrativa()
    {
        if (SeguimientoConfAporteVoluntario::has($this->id_txt_integrado)) {
            $conf = SeguimientoConfAporteVoluntario::getConf($this->id_txt_integrado);
        } else {
            $conf = ConfAporteVoluntario::getConf();
        }

        $this->porcentajeComision = ConfAporteVoluntario::getPorcentaje();

        switch ($this->opcion_retiro) {
            case 1:
                $this->comisionCapitalizacion($conf);
                break;
            case 2:
                $this->comisionRetiro($conf);
                break;
            case 3:
                $this->comisionAporteDistribuido($conf);
                break;
        }
    }

    public function comisionCapitalizacion($conf)
    {
        if (! $conf->aplica_capitalizacion) {
            $this->monto_retirado = 0;
            $this->monto_comision_retira = 0;
            $this->monto_comision_capitaliza = 0;
            $this->monto = $this->monto_cargado;
            $this->monto_capitalizado = $this->monto;
            return;
        }

        $this->monto_retirado = 0;
        $this->monto_comision_retira = 0;
        $this->monto_comision_capitaliza = $this->porcentajeComision * $this->monto_cargado;
        $this->monto = $this->monto_cargado - $this->monto_comision_capitaliza;
        $this->monto_capitalizado = $this->monto;
    }

    public function capitalizacion()
    {
        $this->monto_retirado = 0;
        $this->monto_comision_retira = 0;
        $this->monto_comision_capitaliza = 0;
        $this->monto = $this->monto_cargado;
        $this->monto_capitalizado = $this->monto_cargado;
    }

    public function comisionRetiro($conf)
    {
        if (! $conf->aplica_retiro) {
            $this->monto_retirado = $this->monto_cargado;
            $this->monto_capitalizado = 0;
            $this->monto_comision_capitaliza = 0;
            $this->monto_comision_retira = 0;
            $this->monto = 0;
            return;
        }

        $this->monto_capitalizado = 0;
        $this->monto_comision_capitaliza = 0;
        $this->monto_comision_retira = $this->porcentajeComision * $this->monto_cargado;
        $this->monto_retirado = $this->monto_cargado - $this->monto_comision_retira;
        $this->monto = 0;
    }

    public function comisionAporteDistribuido($conf)
    {
        if (! $conf->aplica_retiro) {
            $this->monto_comision_retira = 0;
            return;
        }

        if (! $conf->aplica_capitalizacion) {
            $this->monto_comision_capitaliza = 0;
            return;
        }

        $this->monto_comision_capitaliza = $this->porcentajeComision * $this->monto_capitalizado;
        $this->monto_comision_retira     = $this->porcentajeComision * $this->monto_retirado;
        $this->monto_retirado            = $this->monto_retirado - $this->monto_comision_retira;
        $this->monto_capitalizado        = $this->monto_capitalizado - $this->monto_comision_capitaliza;
        $this->monto                     = $this->monto_capitalizado;
    }

    public function editarAporteExtra()
    {
        return GestionAporteVoluntario::model()->checkPeriodo($this->id_txt_integrado);
    }

    public function confAporteExtra($key = null)
    {
        if (SeguimientoConfAporteVoluntario::has($this->id_txt_integrado)) {
            $conf = SeguimientoConfAporteVoluntario::getConf($this->id_txt_integrado);
        } else {
            $conf = ConfAporteVoluntario::getConf();
        }

        switch ($key) {
            case 1:
                return $conf->aplica_capitalizacion;
            case 2:
                return $conf->aplica_retiro;
            default:
                return ConfAporteVoluntario::getPorcentaje();
        }
    }

    public function comisionAporteExtra()
    {
        return ConfAporteVoluntario::getPorcentaje() * 100;
    }

    public function nuevosModificar($id)
    {
        return static::model()->countBySql("
            SELECT count(*) FROM retenciones.aporte_voluntario r_av
            INNER JOIN retenciones.gestion_aporte_voluntario r_gav ON
                r_av.id_txt_integrado=r_gav.id_datos_txt_integrado
                AND r_gav.estatus=1
            inner join retenciones.estatus_txt_integrado r_eti on
                r_av.id_txt_integrado=r_eti.id_datos_txt_integrado
                and r_eti.id_estatus_txt=1
                and r_eti.actual is true
            WHERE id_asociado={$id}
                AND blnborrado is false
                AND aprobado is false;");
    }

    public function editar()
    {
        return $this->id_asociado == Asociado::get(Yii::app()->user->id)
            && $this->idTxtIntegrado->getEstatusBase() == 1
            && $this->idTxtIntegrado->hasPeriod();
    }

    public function canEdit()
    {
        return $this->idTxtIntegrado->getEstatusBase() == 1;
    }

    public function actualizarCuentaBanco()
    {
        if ($this->opcion_retiro == 1) {
            $this->cuenta_destino = null;
            $this->id_banco_asociado = null;

            return true;
        }

        if (! empty($this->cuenta_destino)) {
            $cuenta = AsociadoCuentaBanco::getCuentaById($this->cuenta_destino);
            $this->id_banco_asociado = $cuenta->id_banco;
            $this->cuenta_destino = $cuenta->cuenta_bancaria;

            return true;
        }

        $cuenta = AsociadoCuentaBanco::getCuentaPrincipal($this->id_asociado);

        if (is_null($cuenta)) {
            return false;
        }

        $this->id_banco_asociado = $cuenta->id_banco;
        $this->cuenta_destino = $cuenta->cuenta_bancaria;

        return true;
    }

    /**
     * Optiene el estatus del aporte voluntario con formato.
     *
     * @return string
     */
    public function getEstatus()
    {
        $modelEstatus = EstatusAporteVoluntario::model()->find('id_aporte_voluntario=:id AND actual IS TRUE', array(':id' => $this->id));
        if (! $modelEstatus) {
            return 'Sin Estatus';
        }

        switch ($modelEstatus->id_status_av) {
            case 1:
                $color = '#0040FF';
                break;
            case 2:
                $color = '#088A85';
                break;
            case 3:
                $color = '#088A08';
                break;
            case 4:
                $color = '#8A0808';
                break;
            case 5:
                $color = '#088A08';
                break;
            case 6:
                $color = '#8A0808';
                break;
            case 7:
                $color = '#8A0808';
                break;
        }

        return  "<span style=\"color: {$color}\">{$modelEstatus->idStatusAv->nombre_estatus}</span>";
    }

    public static function resumen($id)
    {
        return Yii::app()->db->createCommand('
            SELECT
              ( SELECT count(*)
               FROM retenciones.aporte_voluntario
               WHERE id_txt_integrado=:id
                 AND opcion_retiro=1 ) AS capitalizan,
              ( SELECT coalesce(sum(monto_retirado), 0)
               FROM retenciones.aporte_voluntario
               WHERE id_txt_integrado=:id
                 AND opcion_retiro=1 ) AS monto_capitalizan,
              ( SELECT count(*)
               FROM retenciones.aporte_voluntario
               WHERE id_txt_integrado=:id
                 AND opcion_retiro=2 ) AS retiros,
              ( SELECT coalesce(sum(monto_retirado), 0)
               FROM retenciones.aporte_voluntario
               WHERE id_txt_integrado=:id
                 AND opcion_retiro=2 ) AS monto_retiro,
              ( SELECT count(*)
               FROM retenciones.aporte_voluntario
               WHERE id_txt_integrado=:id
                 AND opcion_retiro=3 ) AS aporte_dist,
              ( SELECT coalesce(sum(monto_retirado), 0)
               FROM retenciones.aporte_voluntario
               WHERE id_txt_integrado=:id
                 AND opcion_retiro=3 ) AS monto_dist
        ')->bindParam('id', $id)->queryRow();
    }

    public static function detalle($id)
    {
        return Yii::app()->db->createCommand('
            SELECT a.cedula,
                   concat(a.nombre, \' \', a.apellidos) AS asociado,
                   ra.nombre AS tipo_aporte,
                   rto.nombre AS tipo_operacion,
                   av.cuenta_destino,
                   av.monto_cargado,
                   av.monto_retirado,
                   av.monto_comision_retira,
                   av.monto_capitalizado,
                   av.monto_comision_capitaliza,
                   av.fecha_pago,
                   ea.nombre_estatus AS estatus
            FROM retenciones.aporte_voluntario av
            INNER JOIN asociado a ON av.id_asociado=a.idasociado
            INNER JOIN retenciones.aportante ra ON av.id_aportante=ra.id
            INNER JOIN retenciones.tipo_operacion rto ON av.opcion_retiro=rto.id
            INNER JOIN retenciones.estatus_aporte_voluntario eav on eav.id_aporte_voluntario=av.id
                AND eav.actual IS TRUE
            INNER JOIN retenciones.estatus_aporte ea on ea.id=eav.id_status_av
            WHERE id_txt_integrado=:id
        ')->bindParam('id', $id)->queryAll();
    }

    public function aportesNoPagados($idNomina)
    {
        return self::model()->findAll([
            'alias' => 'av',
            'join' => 'INNER JOIN retenciones.estatus_aporte_voluntario eav ON eav.id_aporte_voluntario=av.id
                AND eav.actual IS TRUE
                AND (eav.id_status_av=2 OR eav.id_status_av=5 OR eav.id_status_av=6)',
            'condition' => 'av.id_txt_integrado=:id AND av.blnborrado IS FALSE',
            'params' => ['id' => $idNomina]
        ]);
    }

    public function hasTxt()
    {
        return Yii::app()->db->createCommand('
            SELECT exists(
                SELECT 1
                FROM "retenciones"."datos_txt_integrado_pagos_masivos_seguimiento" "t"
                WHERE id_datos_txt_integrado=:id AND actual IS TRUE
            ) as res
        ')->bindValue('id', $this->id_txt_integrado)->queryRow()['res'];
    }

    public static function capitalizarRezagados($idNomina)
    {
        $rezagados = self::model()->findAll([
            'alias' => 'av',
            'join' => 'INNER JOIN retenciones.estatus_aporte_voluntario eav ON eav.id_aporte_voluntario=av.id
                AND eav.actual IS TRUE
                AND eav.id_status_av=6',
            'condition' => 'av.id_txt_integrado=:id AND av.blnborrado IS FALSE',
            'params' => ['id' => $idNomina]
        ]);

        array_map(function ($rezagado) {
            $rezagado->opcion_retiro = 1;
            $rezagado->save();
        }, $rezagados);
    }

    public function getTotalAporte($id){
        $sql = "SELECT 
   COALESCE(j.aporte_extra_socio, 0::numeric)-COALESCE(monto_retiro, 0::numeric) AS monto_capitalizado,
   COALESCE(monto_retiro, 0::numeric) AS monto_retiro
   FROM asociado a
     LEFT JOIN ( SELECT av_socio.id_asociado,
            sum(av_socio.aporte_extra_socio) AS aporte_extra_socio
           FROM ( SELECT aporte.id_asociado,
                    sum(aporte.monto) AS aporte_extra_socio
                   FROM retenciones.aporte_voluntario aporte
                     JOIN retenciones.datos_txt_integrado txt ON aporte.id_txt_integrado = txt.id
                     JOIN retenciones.estatus_txt_integrado estatus ON txt.id = estatus.id_datos_txt_integrado
                  WHERE estatus.id_estatus_txt = 5 AND aporte.id_aportante = 1 and id_tipo_aporte_voluntario=1
                  GROUP BY aporte.id_asociado
                UNION
                 SELECT aporte.id_asociado,
                    sum(aporte.monto) AS aporte_extra_socio
                   FROM retenciones.aporte_voluntario aporte
                     JOIN retenciones.estatus_aporte_voluntario estatus_av ON aporte.id = estatus_av.id_aporte_voluntario
                  WHERE estatus_av.id_status_av = 2 AND aporte.id_aportante = 1 and id_tipo_aporte_voluntario=1
                  GROUP BY aporte.id_asociado) av_socio
          GROUP BY av_socio.id_asociado) j ON a.idasociado = j.id_asociado
	LEFT JOIN (
              SELECT sum(monto) AS monto_retiro, id_asociado as idasor FROM retenciones.aporte_voluntario as avr
              JOIN retenciones.estatus_aporte_voluntario gav ON avr.id = gav.id_aporte_voluntario
              WHERE id_tipo_aporte_voluntario = 2 AND actual = TRUE AND id_status_av in (1,2,5)
              GROUP BY id_asociado
              )AS aporte_retiro ON aporte_retiro.idasor = a.idasociado
          
     WHERE a.idasociado=".(int)$id."";

        return Yii::app()->db->createCommand($sql)->queryRow();

    }

    public function denegar()
    {
        return EstatusAporteVoluntario::create([
            'id_aporte_voluntario' => $this->id,
            'id_status_av' => 7,
            'observaciones' => $this->observacion,
        ]);
    }
}
