<?php

class VariacionesAporteVoluntario 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();
	/**
	 * @return string the associated database table name
	 */
	public function tableName()
	{
		return 'retenciones.variaciones_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,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'),
//             array('id_asociado, id_banco_destino, cuenta_destino, referencia, fecha_pago, fecha_registro, id_aportante, id_txt_integrado, blnborrado', 'safe'),
// 			array('monto', 'match',
// 					'pattern' => '/^[0-9]\d{0,2}(\.[0-9]\d{2,2})*(\,\d{1,2})?$/',
// 					//'pattern' => '/^[0-9]\d{0,20}(\.[0-9]{0,2})?$/',
// 					'message' => 'El valor del campo debe tener un formato 1.000,00',
// 					'on'=>'individual',
// 			),
// //			array('monto', 'match',
// //					'pattern' => '/^(\d)*(\,\d{1,2})?$/',
// //					//'pattern' => '/^[0-9]\d{0,20}(\.[0-9]{0,2})?$/',
// //					'message' => 'El valor del campo debe tener un formato 1000,00',
// //					'on'=>'carga_masiva',
// //			),
//                         array( 'acedula','validaAsociado','on'=>(self::getConf('NO DEFINIDOS')=='SI')?'carga_masiva_guardado':'carga_masiva'),
//                         // The following rule is used by search().
// 			// @todo Please remove those attributes that should not be searched.
// 			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', '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'),
			'idAsociado' => array(self::BELONGS_TO, 'Asociado', 'id_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'),
		);
	}

	/**
	 * @return array customized attribute labels (name=>label)
	 */
	public function attributeLabels()
	{
		return array(
			'id' => 'ID',
			'id_asociado' => 'Id Asociado',
			'id_banco_destino' => 'Banco de Destino',
			'cuenta_destino' => 'Cuenta de Destino',
			'referencia' => 'Referencia',
			'fecha_pago' => 'Fecha del Pago',
			'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',
            'fecha_modificacion' => 'Fecha modificació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='idAsociado';


		$criteria->compare('id',$this->id);
		$criteria->compare('cedula',$this->acedula);
                $criteria->compare('UPPER(nombre||apellidos)',strtoupper($this->anombre),true);
                //$criteria->compare('"idAsociado".apellidos',$this->aapellido,true);
                $criteria->compare('"idAsociado".idunidad',$this->aid_unidad);
                $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


        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');
        }

                /*$from = $to = '';
                if (count($this->fecha_pago_range)>=1) {
                    if (isset($this->fecha_pago_range['from'])) {
                        $from = $this->fecha_pago_range['from'];
                    }
                    if (isset($this->fecha_pago_range['to'])) {
                        $to= $this->fecha_pago_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);
                    }
                }*/

                //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.'\'');
                            //echo "<pre>";print_r($criteria);exit;
                        }

                        //$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));

                        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_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);

        $criteria->addcondition('id_txt_integrado is null');
        // $criteria->order = 'fecha_modificacion desc';

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

		$criteria=new CDbCriteria;
                if($id =='')
                    $id = 0;
                if(isset($_GET['cedula'])){//echo $_GET['cedula'];exit;
                    if(is_numeric($_GET['cedula'])){
                        $id= Asociado::model()->find('cedula=:cedula AND blnborrado= FALSE',array(':cedula'=>$_GET['cedula']))->idasociado;
                    }
                    else {
                        $id = 0;
                    }
                }

        $criteria->with = 'opcionRetiro';
                $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);
		//$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->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);

        if (empty($this->id_txt_integrado)) {

            $criteria->join='INNER JOIN retenciones.estatus_txt_integrado AS txt on txt.id_datos_txt_integrado = t.id_txt_integrado';
            $criteria->addcondition('txt.id_estatus_txt=3 AND txt.actual=TRUE');

        }else{

            $criteria->join='INNER JOIN retenciones.estatus_aporte_voluntario AS aporte on aporte.id_aporte_voluntario = t.id';
            $criteria->addcondition('aporte.id_status_av=2 AND aporte.actual=TRUE');
        }

            //$criteria->addcondition('aprobado=true');

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



        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);
        $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->compare('blnborrado',$this->blnborrado);
        $criteria->addcondition("id_aporte_voluntario={$id}");

		return new CActiveDataProvider($this, array(
			'criteria'=>$criteria,
            'sort' => array(
                'defaultOrder' => 'fecha_modificacion DESC',
            )
		));
	}


                /**
         * 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=='individual' || $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 afterFind() {

            //$this->monto=number_format($this->monto,2,",", ".");

		return parent::beforeSave();
	}*/

    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()
    {
        $conf = ConfAporteVoluntario::model()->findByPk(1);

        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) {
            return false;
        }

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

    public function comisionRetiro($conf)
    {
        if (! $conf->aplica_retiro) {
            return false;
        }

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

    public function comisionAporteDistribuido($conf)
    {
        $this->monto_comision_capitaliza = $conf->porcentaje_comision * $this->monto_capitalizado;
        $this->monto_comision_retira     = $conf->porcentaje_comision * $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 duplicar($av)
    {
        $model = new VariacionesAporteVoluntario();

        $datos = $av->attributes;
        $model->id_aporte_voluntario = $datos['id'];
        unset($datos['id']);
        $model->setAttributes($datos, false);
        $model->usuario_modificacion = Yii::app()->user->id;
        $model->insert();
    }
}
