<?php

/**
 * This is the model class for table "asociado".
 *
 * The followings are the available columns in table 'asociado':
 *
 * @property int    $idasociado
 * @property int    $cedula
 * @property string $nombre
 * @property string $apellidos
 * @property string $lugarnacimiento
 * @property string $fechanacimiento
 * @property int    $estadocivil
 * @property int    $cargafamiliar
 * @property int    $vivienda
 * @property int    $vehiculo
 * @property int    $asegurado
 * @property string $dirhabitacion
 * @property string $correoelectronico
 * @property int    $tlfhabitacion
 * @property int    $celular
 * @property int    $lugartrabajo
 * @property int    $estado
 * @property string $ciudad
 * @property string $cargo
 * @property int    $tlfoficina
 * @property int    $oficina
 * @property string $fechaingreso
 * @property float  $sueldo
 * @property int    $tipoinscripcion
 * @property int    $tipovivienda
 */
class Asociado extends CActiveRecord
{
    public $adjunto = null;
    public $fecha_registro_range = [];
    public $activar;
    public $foto;
    public $mes;
    public $desde;
    public $hasta;
    public $consulta;
    public $tiene_aporte;
    public $id_banco;
    public $numero_cuenta;
    public $nombre_apellido;
    public $empresa;
    public $nombre_unidad;
    public $nombre_estatus;
    public $tiene_aportes;
    public $idlugartrabajo;
    public $planilla;

    /**
     * Returns the static model of the specified AR class.
     *
     * @param string $className active record class name
     *
     * @return Asociado the static model class
     */
    public static function model($className = __CLASS__)
    {
        return parent::model($className);
    }

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

    /**
     * @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 [
            ['nombre,sexo,nacionalidad, id_tipo_persona, apellidos, cedula, celular, dirhabitacion, lugartrabajo,
                cargo,fechanacimiento, fechaingreso, correoelectronico,oficina,idunidad,estado,estadocivil,porcentaje', 'required', 'on' => 'asociado'],
            ['nombre, apellidos,nacionalidad, id_tipo_persona, cedula,fechaingreso,oficina,idunidad', 'required', 'on' => 'administrador'],
            ['foto', 'required', 'on' => 'foto_perfil'],
            ['id_estatus, fecha_estatus', 'required', 'on' => 'CambioEstatus'],
            ['cedula, estadocivil, cargafamiliar, vivienda, vehiculo, asegurado, estado, oficina, tipoinscripcion, tipovivienda', 'numerical', 'integerOnly' => true],
            ['sueldo', 'numerical'],
            ['foto', 'file', 'types' => 'jpg, gif, png', 'allowEmpty' => true],
            ['nombre, apellidos, lugarnacimiento, marca_vehiculo, modelo_vehiculo', 'length', 'max' => 100],
            ['correoelectronico', 'length', 'max' => 60],
            ['cuenta_bancaria', 'numerical', 'integerOnly' => true],
            ['cuenta_bancaria', 'length', 'max' => 20, 'min' => 20],
            ['cedula', 'length', 'max' => 9],
            ['nombre, apellidos,', 'filter', 'filter' => 'strtoupper'],
            ['nombre, apellidos,', 'filter', 'filter' => 'trim'],
            ['correoelectronico', 'filter', 'filter' => 'strtolower'],
            ['correoelectronico', 'filter', 'filter' => 'trim'],
            ['mes', 'required', 'on' => 'esc_periodo'],
            ['desde,hasta', 'required', 'on' => 'esc_fecha'],
            ['porcentaje_retiro', 'valPorcentajeRequerido'],
            ['porcentaje_retiro', 'numerical', 'min' => 0.001, 'max' => 100.00, 'tooSmall' => 'El porcentaje de retiro no puede ser 0', 'tooBig' => 'El porcentaje de retiro no puede ser mayor de 100.00'],
            ['cedula', 'verificarUsuario', 'on' => ['createPlanillaAdministrador', 'administrador']],
            ['correoelectronico', 'email', 'message' => 'El email no es correcto'],
            [['id_tipo_persona', 'cedula', 'nombre_apellido', 'id_banco', 'numero_cuenta', 'correoelectronico'], 'required', 'on' => 'definicion_no_asociados'],
            [['numero_cuenta'], 'length', 'max' => 20],
            [['numero_cuenta'], 'length', 'max' => 20, 'on' => 'definicion_no_asociados'],
            [['correoelectronico'], 'email', 'on' => 'definicion_no_asociados'],
            [['numero_cuenta'], 'numeroCuenta', 'on' => 'definicion_no_asociados'],
            // Carga de planilla desde los aportes diferidos
            ['cedula,nombre, apellidos,fechaingreso,porcentaje,idunidad,oficina', 'required', 'on' => 'planilla_cmao'],
            ['fechaingreso', 'date', 'format' => 'dd/MM/yyyy', 'on' => 'planilla_cmao'],
            ['cedula', 'unique', 'criteria' => ['condition' => 'blnborrado=FALSE and id_estatus in (1,3,4,5)'], 'message' => 'El Asociado tiene una planilla activa en la caja de ahorros', 'on' => 'planilla_cmao'],
            ['id_unidad_trabajo', 'safe'],
            ['activo_aportes,fechanacimiento, dirhabitacion,porcentaje, lugartrabajo,ciudad, cargo, fechaingreso,
                oficina,tlfoficina,tlfhabitacion, celular, aniocarro, idunidad, blnborrado,cuenta_bancaria,clvcreado_por,
                activar,id_estatus,idtipotrabajador,aporte_voluntario,retira_aporte_voluntario,porcentaje_retiro,
                planilla_firmada, planilla, fecha_inscripcion_actualizada', 'safe'],
            ['correoelectronico', 'unique', 'allowEmpty' => false,
                'criteria' => ['condition' => 'id_estatus = 1'],
                'message' => 'Este correo electrónico está siendo usado por otro asociado, registre otro correo!',
                'on' => 'planillaReingreso',
            ],
            [
                'planilla',
                'file',
                'maxSize' => 1024 * 1024 * 2,
                'tooLarge' => 'El archivo debe tener un tamaño de 2MB',
                'on' => 'carga_planilla_firmada',
            ],
            // The following rule is used by search().
            // Please remove those attributes that should not be searched.
            ['adjunto', 'safe'],
            ['adjunto', 'file', 'types' => 'csv,pdf,jpg,png', 'maxSize' => 5242880, 'allowEmpty' => true, 'wrongType' => 'Solo se permiten archivos de imagenes y PDF.', 'tooLarge' => 'El archivo es demasiado grande! 5MB es el limite'],
            ['tiene_aporte,id_estatus,sexo,nacionalidad,blnborrado,idasociado,activo_aportes, fecha_registro_range,
                cedula, porcentaje , nombre, apellidos, lugarnacimiento, fechanacimiento, estadocivil, cargafamiliar,
                vivienda, vehiculo, asegurado, dirhabitacion, correoelectronico, tlfhabitacion, celular,clvcreado_por,
                lugartrabajo, estado, ciudad, cargo, tlfoficina,oficina, fechaingreso,fecha_registro_range,activar, sueldo, tipoinscripcion,
                adjunto, tipovivienda, aniocarro, idunidad,actualizado,cuenta_bancaria', 'safe', 'on' => 'search'],
        ];
    }

    public function numeroCuenta()
    {
        if ($this->hasErrors('id_banco') || $this->hasErrors('numero_cuenta')) {
            return false;
        }

        $codigo = $this->codigoBancoSeleccionado();
        if ($codigo != substr($this->numero_cuenta, 0, 4)) {
            $this->addError('numero_cuenta', "El codigo del banco seleccionado <strong>{$codigo}</strong>, no concuerda con el numero de cuenta introducido.");
        }
    }

    public function codigoBancoSeleccionado()
    {
        return Yii::app()->db->createCommand('
            SELECT codigo
            FROM banco
            WHERE idbanco=:id_banco AND blnborrado IS FALSE
        ')->bindValue('id_banco', $this->id_banco)->queryRow()['codigo'];
    }

    /**
     * @return array relational rules
     */
    public function relations()
    {
        return [
            'lugartrabajo0' => [self::BELONGS_TO, 'LugarTrabajo', 'oficina'],
            'estado0' => [self::BELONGS_TO, 'EstadoCivil', 'estadocivil'],
            'carga0' => [self::BELONGS_TO, 'CargaFamiliar', 'cargafamiliar'],
            'tipovivienda0' => [self::BELONGS_TO, 'TipoVivienda', 'tipovivienda'],
            'vivienda0' => [self::BELONGS_TO, 'Sino', 'vivienda'],
            'vehiculo0' => [self::BELONGS_TO, 'Sino', 'vehiculo'],
            'asegurado0' => [self::BELONGS_TO, 'Sino', 'asegurado'],
            'tipoinsc0' => [self::BELONGS_TO, 'TipoInscripcion', 'tipoinscripcion'],
            'aportes' => [self::BELONGS_TO, 'Porcentaje', 'porcentaje'],
            'tEstado' => [self::BELONGS_TO, 'TEstado', 'estado'],
            'unidad' => [self::BELONGS_TO, 'Unidad', 'idunidad'],
            'idEstatus' => [self::BELONGS_TO, 'EstatusAsociado', 'id_estatus'],
            'dividendo' => [self::HAS_MANY, 'AsociadoDividendos', 'idasociado'],
            'trabajador' => [self::HAS_MANY, 'AportesTotal', 'idtrabajador'],
            'idBeneficiario' => [self::HAS_MANY, 'Beneficiario', 'idasociado'],
            'idUsuario' => [self::BELONGS_TO, 'CrugeUserI', 'id_usuario'],
            'asociadoEstatuses' => [self::HAS_MANY, 'AsociadoEstatus', 'idasociado'],
            'cuentas' => [self::HAS_MANY, 'AsociadoCuentaBanco', 'idasociado', 'condition' => 'blnborrado IS FALSE'],
            'cuentaPrincipal' => [self::HAS_ONE, 'AsociadoCuentaBanco', 'idasociado', 'condition' => 'cuenta_principal IS TRUE AND blnborrado IS FALSE'],
            'tipoTrabajador' => [self::BELONGS_TO, 'TipoTrabajador', 'idtipotrabajador'],
        ];
    }

    /**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels()
    {
        return [
            'idasociado' => 'Idasociado',
            'idperfil' => 'Perfil',
            'cedula' => 'Cédula',
            'nombre' => 'Nombre',
            'apellidos' => 'Apellidos',
            'lugarnacimiento' => 'Lugar de nacimiento',
            'sexo' => 'Género',
            'fechanacimiento' => 'Fecha de nacimiento',
            'estadocivil' => 'Estado civil',
            'cargafamiliar' => 'Carga familiar',
            'vivienda' => '¿Posee vivienda?',
            'vehiculo' => '¿Posee vehículo?',
            'asegurado' => 'Asegurado',
            'dirhabitacion' => 'Dirección de habitación',
            'correoelectronico' => 'Correo electrónico',
            'tlfhabitacion' => 'Teléfono de habitación',
            'celular' => 'Celular',
            'lugartrabajo' => 'Ubicación administrativa',
            'estado' => 'Estado',
            'ciudad' => 'Ciudad',
            'cargo' => 'Cargo',
            'tlfoficina' => 'Teléfono de oficina',
            'oficina' => 'Oficina',
            'fechaingreso' => 'Fecha de inscripción',
            'sueldo' => 'Sueldo',
            'tipoinscripcion' => 'Tipo de inscripción',
            'tipovivienda' => 'Condición de la vivienda',
            'aniocarro' => 'Año del vehículo',
            'tipovivienda0.descripcion' => 'Tipo de vivienda',
            'tipoinsc0.descripcion' => 'Tipo de inscripción',
            'estado0.descripcion' => 'Estado Civil',
            'vivienda0.descripcion' => 'Vivienda',
            'vehiculo0.descripcion' => 'Vehículo',
            'asegurado0.descripcion' => 'Asegurado',
            'edo.DescripcionEstado' => 'Estado',
            'idunidad' => 'Unidad',
            'actualizado' => 'Actualizado',
            'cuenta_bancaria' => 'Num. cuenta bancaria',
            'idtipotrabajador' => 'Tipo de trabajador',
            'aporte_voluntario' => '¿Retirar aportes especiales?',
            'porcentaje_retiro' => 'Porcentaje de retiro',
            'retira_aporte_voluntario' => 'Retira aporte extra del patrono',
            'consulta' => '',
            'id_estatus' => 'Estatus del asociado',
            'fecha_estatus' => 'Fecha de la condición',
            'id_unidad_trabajo' => 'Unidad de trabajo',
            'id_tipo_persona' => 'Nacionalidad',
            'numero_cuenta' => 'Número de cuenta',
            'id_banco' => 'Banco',
            'nombre_apellido' => 'Nombre y apellido',
            'planilla' => 'Adjuntar planilla firmada',
        ];
    }

    /**
     * Retrieves a list of models based on the current search/filter conditions.
     *
     * @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') && ! Yii::app()->user->checkAccess('usuario_administrador')) {
            $this->cedula = CrugeUserI::model()->findByPk(Yii::app()->user->id)->cedula;
        }

        if (! is_numeric($this->cedula)) {
            $this->cedula = null;
        }

        $criteria->select = 't.idasociado,
                             lt.idlugartrabajo,
                             t.oficina,
                             lt.descripcion as empresa,
                             u.idunidad,
                             u.descripcion as nombre_unidad,
                             t.cedula,
                             t.nombre,
                             t.apellidos,
                             t.planilla_firmada,
                             fechaingreso,
                             id_estatus,
                             ea.nombre_estatus,
                             (select exists(
                                select 1
                                FROM retenciones.estatus_txt_integrado eti
                                LEFT JOIN retenciones.datos_txt_integrado dti ON (eti.id_datos_txt_integrado=dti.id)
                                LEFT JOIN retenciones.aporte_ordinario ao ON (ao.id_txt=dti.id)
                                WHERE (ao.id_asociado=t.idasociado AND id_estatus_txt = 5)
                             )) as tiene_aportes';
        $criteria->join = 'left join lugar_trabajo lt on lt.idlugartrabajo=t.oficina
                           left join unidad u on u.idunidad=t.idunidad
                           left join asociado_estatus ae on ae.idasociado=t.idasociado and actual is true
                            left join estatus_asociado ea on ea.id=ae.id_estatus_asociado';
        $criteria->compare('t.idasociado', $this->idasociado);
        $criteria->compare('t.cedula', $this->cedula);
        $criteria->compare('UPPER(t.nombre)', strtoupper($this->nombre), true);
        $criteria->compare('UPPER(t.apellidos)', strtoupper($this->apellidos), true);
        $criteria->compare('t.lugarnacimiento', $this->lugarnacimiento, true);
        $criteria->compare('t.fechanacimiento', $this->fechanacimiento, true);
        $criteria->compare('t.estadocivil', $this->estadocivil);
        $criteria->compare('t.cargafamiliar', $this->cargafamiliar);
        $criteria->compare('t.vivienda', $this->vivienda);
        $criteria->compare('t.vehiculo', $this->vehiculo);
        $criteria->compare('t.asegurado', $this->asegurado);
        $criteria->compare('porcentaje', $this->porcentaje);
        $criteria->compare('dirhabitacion', $this->dirhabitacion, true);
        $criteria->compare('correoelectronico', $this->correoelectronico, true);
        $criteria->compare('tlfhabitacion', $this->tlfhabitacion);
        $criteria->compare('celular', $this->celular, true);
        $criteria->compare('lugartrabajo', $this->lugartrabajo);
        $criteria->compare('estado', $this->estado);
        $criteria->compare('ciudad', $this->ciudad, true);
        $criteria->compare('cargo', $this->cargo, true);
        $criteria->compare('tlfoficina', $this->tlfoficina);
        $criteria->compare('oficina', $this->oficina);
        $criteria->compare('fechaingreso', $this->fechaingreso);
        $criteria->compare('sueldo', $this->sueldo);
        $criteria->compare('tipoinscripcion', $this->tipoinscripcion);
        $criteria->compare('tipovivienda', $this->tipovivienda);
        $criteria->compare('t.idunidad', $this->idunidad);
        $criteria->compare('actualizado', $this->actualizado);
        $criteria->compare('cuenta_bancaria', $this->cuenta_bancaria, true);
        $criteria->compare('t.id_estatus', $this->id_estatus);

        if (isset($this->tiene_aporte) && $this->tiene_aporte == 1) {
            $criteria->addCondition('(select exists(
                                select 1
                                FROM retenciones.estatus_txt_integrado eti
                                LEFT JOIN retenciones.datos_txt_integrado dti ON (eti.id_datos_txt_integrado=dti.id)
                                LEFT JOIN retenciones.aporte_ordinario ao ON (ao.id_txt=dti.id)
                                WHERE (ao.id_asociado=t.idasociado AND id_estatus_txt = 5)
                             )) = true');
        } elseif (isset($this->tiene_aporte) && $this->tiene_aporte == 2) {
            $criteria->addCondition('(select exists(
                                select 1
                                FROM retenciones.estatus_txt_integrado eti
                                LEFT JOIN retenciones.datos_txt_integrado dti ON (eti.id_datos_txt_integrado=dti.id)
                                LEFT JOIN retenciones.aporte_ordinario ao ON (ao.id_txt=dti.id)
                                WHERE (ao.id_asociado=t.idasociado AND id_estatus_txt = 5)
                             )) = false');
        }

        $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.fechaingreso', ">= ${from}", false);
                $criteria->compare('t.fechaingreso', "<= ${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.fechaingreso', "${creation_time}", false);
            }
        }
        $criteria->order = 't.fechaingreso DESC, t.id_estatus';

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

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

    public function searchAdmin()
    {
        // Warning: Please modify the following code to remove attributes that
        // should not be searched.
        $criteria = new CDbCriteria();
        /* $user=Usuario::model()->findByPk(Yii::app()->user->id);
        $idunidad=$user['username'];
        $uni=Unidad::model()->findAll("codigo='$idunidad' and blnborrado=false");*/
        $user = UnidadUsuario::model()->findAll('idusuario='.Yii::app()->user->id);
        $idunidad = $user[0]['idunidad'];
        //$filtro="idunidad=" . $uni[0]['idunidad'] ." and t.blnborrado=false ";
        $criteria->select = 't.*';
        $criteria->condition = 't.idasociado=(select max(b.idasociado) from asociado b where  b.cedula = t.cedula and t.blnborrado=false) ';
        //$criteria->condition="idunidad=" . $uni[0]['idunidad'] ." and  blnborrado=false";
        $criteria->condition = 'blnborrado=false';
        $sort = new CSort();
        //$sort->defaultOrder='cedula DESC';
        $criteria->compare('idasociado', $this->idasociado);
        $criteria->compare('cedula', $this->cedula);
        $criteria->compare('nombre', $this->nombre, true);
        $criteria->compare('apellidos', $this->apellidos, true);
        $criteria->compare('lugarnacimiento', $this->lugarnacimiento, true);
        $criteria->compare('fechanacimiento', $this->fechanacimiento, true);
        $criteria->compare('estadocivil', $this->estadocivil);
        $criteria->compare('cargafamiliar', $this->cargafamiliar);
        $criteria->compare('vivienda', $this->vivienda);
        $criteria->compare('vehiculo', $this->vehiculo);
        $criteria->compare('asegurado', $this->asegurado);
        $criteria->compare('porcentaje', $this->porcentaje);
        $criteria->compare('dirhabitacion', $this->dirhabitacion, true);
        $criteria->compare('correoelectronico', $this->correoelectronico, true);
        $criteria->compare('tlfhabitacion', $this->tlfhabitacion);
        $criteria->compare('celular', $this->celular, true);
        $criteria->compare('lugartrabajo', $this->lugartrabajo);
        $criteria->compare('estado', $this->estado);
        $criteria->compare('ciudad', $this->ciudad, true);
        $criteria->compare('cargo', $this->cargo, true);
        $criteria->compare('tlfoficina', $this->tlfoficina);
        $criteria->compare('oficina', $this->oficina);
        $criteria->compare('fechaingreso', $this->fechaingreso);
        $criteria->compare('sueldo', $this->sueldo);
        $criteria->compare('tipoinscripcion', $this->tipoinscripcion);
        $criteria->compare('tipovivienda', $this->tipovivienda);
        $criteria->compare('blnborrado', $this->blnborrado);
        $criteria->compare('idunidad', $this->idunidad);
        $criteria->compare('actualizado', $this->actualizado);
        $criteria->compare('cuenta_bancaria', $this->cuenta_bancaria, true);

        //fecha_vigencia_range
        $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('fechaingreso', ">= ${from}", false);
                $criteria->compare('fechaingreso', "<= ${to}", false);
            } else {
                if ($from != '') {
                    $creation_time = $from;
                }
                if ($to != '') {
                    $creation_time = $to;
                }
                $creation_time = date('d-m-Y', strtotime($creation_time));
                $criteria->compare('fechaingreso', "${creation_time}", false);
            }
        }
        $_SESSION['datos_filtrados'] = new CActiveDataProvider($this, [
            'criteria' => $criteria,
            'sort' => [
                'defaultOrder' => 'fecha_registro ASC', ],
            'pagination' => false,
        ]);

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

    public function getDropdown()
    {
        $values = [
            0 => 'Seleccione',
            //1 => 'Visualizar',
            2 => 'Actualizar',
            /*4 => 'Imprimir Planilla',*/
            3 => 'Cargar Beneficiario',
            5 => 'Ver sus Aportes',
            6 => 'Desactivar Aportante',
        ];

        return CHtml::dropDownlist('acc', 'acc', $values, [
            'class' => 'values',
            'data-id' => $this->idasociado,
            'onChange' => 'ValidarRuta('.$this->idasociado.')',
        ]);
    }

    public function behaviors()
    {
        return [
            // Classname => path to Class
            'ActiveRecordLogableBehavior' => 'application.behaviors.ActiveRecordLogableBehavior',
        ];
    }

    public function mostraraportes($idtrabajador)
    {
        $model = EstatusTxtIntegrado::model()->with('idTxtIntegrado.aporteOrdinarios')->find('id_asociado=:id_asociado AND id_estatus_txt = 5', [':id_asociado' => $idtrabajador]);
        if ($model) {
            echo 'Tiene  aportes';
        } else {
            echo  'No Tiene aportes';
        }
    }

    /**
     * Establece un color segun el estatus.
     *
     * @return string
     */
    public function colorEstatus()
    {
        if ($this->id_estatus == 1) {
            return 'success';
        }
        if ($this->id_estatus == 2) {
            return 'error';
        }
        if ($this->id_estatus == 3) {
            return 'warning';
        }

        return 'info';
    }

    public function verificarUsuario()
    {
        if (! $this->hasErrors('cedula')) {
            $model = self::model()->find('cedula=:cedula and blnborrado=false and id_estatus in(1,3,4,5)', [':cedula' => $this->cedula]);
            if ($model) {
                if ($this->isNewRecord) {
                    $this->addError('cedula', 'Esta cedula ya esta registrada');
                } elseif ($this->idasociado != $model->idasociado) {
                    $this->addError('cedula', 'Esta cedula ya esta registrada');
                }
            }
        }
    }

    public function utltimoAporte($id)
    {
        $model = AporteOrdinario::model()->find([
            'condition' => 'id_asociado=:id and blnborrado=false AND id_tipo_nomina in(1,2,3) and aporte_asociado > 0',
            'join' => 'inner join retenciones.estatus_txt_integrado eti on id_txt=eti.id_datos_txt_integrado and eti.actual is true and eti.id_estatus_txt in (3,5,6)',
            'order' => 'fecha_aporte desc',
            'params' => [
                ':id' => $id,
            ],
        ]);
        if ($model) {
            return number_format($model->aporte_asociado, 2, ',', '.');
        }
        echo '00,0';
    }

    public function utltimoSueldo($id)
    {
        // $sueldo = '';
        $model = AporteOrdinario::model()->find([
            'select' => 'sueldo_base',
            'condition' => 'id_asociado=:id and blnborrado=false AND id_tipo_nomina in(1,2,3) and sueldo_base > 0',
            'join' => 'inner join retenciones.estatus_txt_integrado eti on id_txt=eti.id_datos_txt_integrado and eti.actual is true and eti.id_estatus_txt in (3,5,6)',
            'order' => 'fecha_aporte desc',
            'params' => [
                ':id' => $id,
            ],
        ]);

        if ($model) {
            // if ($model->idTipoNomina->codigo_nomina == 'M') {
            //     $sueldo = $model->sueldo_base * 1;
            // } elseif ($model->idTipoNomina->codigo_nomina == 'Q') {
            //     $sueldo = $model->sueldo_base * 2;
            // } else {
            //     $sueldo = $model->sueldo_base * 4;
            // }

            return number_format($model->sueldo_base, 2, ',', '.');
        }
        echo '00,0';
    }

    public function utltimoSueldoPorcentajeAporte($id)
    {
        // $sueldo = '';
        $model = AporteOrdinario::model()->find([
            'condition' => 'id_asociado=:id and blnborrado=false AND id_tipo_nomina in(1,2,3) and sueldo_base > 0',
            'join' => 'inner join retenciones.estatus_txt_integrado eti on id_txt=eti.id_datos_txt_integrado and eti.actual is true and eti.id_estatus_txt in (3,5,6)',
            'order' => 'fecha_aporte desc',
            'params' => [
                ':id' => $id,
            ],
        ]);
        if ($model) {
            // $modelPorcentajeAporte = PorcentajeDescuentoAsociadoPatrono::model()->find('idasociado=:idasociado AND actual = true', array(':idasociado' => $model->id_asociado));
            // if ($modelPorcentajeAporte) {
            //     $porcentaje = $modelPorcentajeAporte->idPorcentajeAsociado->descripcion;
            // } else {
            //     $porcentaje = 10;
            // }

            // $sueldo = $model->aporte_asociado * 100 / $porcentaje;

            // if ($model->id_tipo_nomina == 2) {
            //     //Quincenal
            //     $sueldo *= 2;
            // } elseif ($model->id_tipo_nomina == 3) {
            //     //Semanal
            //     $sueldo *= 4;
            // }

            return $model->sueldo_base;
        }

        return 0;
    }

    public function ultimaCuota($id)
    {
        $data = CreditoPagos::model()->find('idcredito=:id and blnborrado=false and pagada=TRUE order by id desc', [':id' => $id]);
        if ($data) {
            echo $data->numero_cuota;
        } else {
            echo '0';
        }
    }

    public function numeroUlitmaCuota($id)
    {
        $data = CreditoPagos::model()->find('idcredito=:id and blnborrado=false and pagada=TRUE order by id desc', [':id' => $id]);
        if ($data) {
            echo $data->saldo_restante;
        } else {
            echo '0';
        }
    }

    public function getTipoNomina()
    {
        $modelTipoNomina = AporteOrdinario::model()->find('id_asociado=:id_asociado and blnborrado=false AND id_tipo_nomina IN (1,2,3) ORDER BY fecha_aporte desc', [':id_asociado' => $this->idasociado]);
        if ($modelTipoNomina) {
            return $modelTipoNomina->idTipoNomina->nombre_nomina;
        }

        return null;
    }

    public function getIdTipoNomina()
    {
        $modelTipoNomina = AporteOrdinario::model()->find('id_asociado=:id_asociado and blnborrado=false AND id_tipo_nomina IN (1,2,3) ORDER BY fecha_aporte desc', [':id_asociado' => $this->idasociado]);
        if ($modelTipoNomina) {
            return $modelTipoNomina->id_tipo_nomina;
        }

        return null;
    }

    // public function beforeSave(){
    //
    //   return parent::beforeSave();
    // }
    public function diferenciaDias($opcion = [])
    {
        $desde = (array_key_exists('desde', $opcion)) ? $opcion['desde'] : date('Y-m-d');
        $hasta = (array_key_exists('hasta', $opcion)) ? $opcion['hasta'] : date('Y-m-d');

        $from = new DateTime($desde);
        $to = new DateTime($hasta);
        $interval = $to->diff($from, true);

        return (($interval->y >= 1) ? ($interval->y.(($interval->y == 1) ? ' año, ' : ' años, ')) : ' ').
           (($interval->m >= 1) ? ($interval->m.(($interval->m == 1) ? ' mes, ' : ' meses, ')) : ' ').
           (($interval->d >= 1) ? ($interval->d.(($interval->d == 1) ? ' día ' : ' días ')) : ' ');
    }

    public function validacionTiempoAsociado()
    {
        $tiempo = 0;
        $fechainicial = new DateTime($this->fechaingreso);
        $fechafinal = new DateTime(date('Y-m-d'));

        $diferencia = $fechainicial->diff($fechafinal);
        $tiempo = ($diferencia->y * 12) + $diferencia->m;

        return $tiempo;
    }

    public function valPorcentajeRequerido()
    {
        if ($this->retira_aporte_voluntario == 1) {
            if ($this->porcentaje_retiro == null) {
                $this->addError('porcentaje_retiro', 'Porcentaje de retiro no puede ser nulo');
            }
        }
    }

    public function afterFind()
    {
        if ($this->fechanacimiento != '') {
            $this->fechanacimiento = date('d-m-Y', strtotime($this->fechanacimiento));
        }

        if ($this->fechaingreso != '') {
            $this->fechaingreso = date('d-m-Y', strtotime($this->fechaingreso));
        }

        if ($this->fecha_registro != '') {
            $this->fecha_registro = date('d-m-Y', strtotime($this->fecha_registro));
        }

        // $model = AsociadoEstatus::model()->find('idasociado=:idasociado AND actual = true',[':idasociado'=>$this->idasociado]);
        // if($model){
        // 	$this->id_estatus = $model->id_estatus_asociado;
        // 	$this->fecha_estatus = $model->fecha_registro;
        // }

        return parent::afterFind();
    }

    public function beforeSave()
    {
        foreach ($this->attributes as $key => $value) {
            if (! $this->getMetadata()->columns[$key]->isPrimaryKey) {
                if ($this->getMetadata()->columns[$key]->dbType != 'string' && $value == '') {
                    if ($this->getMetadata()->columns[$key]->dbType == 'boolean') {
                        $this[$this->getMetadata()->columns[$key]->name] = false;
                    } else {
                        $this[$this->getMetadata()->columns[$key]->name] = null;
                    }
                }
            }
        }

        if ($this->blnborrado == '') {
            $this->blnborrado = 0;
        }

        return parent::beforeSave();
    }

    public static function get($id)
    {
        $cedula = CrugeUserI::model()->findByPk($id)->cedula;
        $asociado = Asociado::model()->find('cedula=:cedula AND blnborrado = false AND id_estatus in(1,4) ORDER BY idasociado desc', [':cedula' => $cedula]);
        if (is_null($asociado)) {
            return false;
        }

        return $asociado->idasociado;
    }

    public function randomString($length = 16)
    {
        $str = '';
        $characters = array_merge(range('A', 'Z'), range('a', 'z'), range('0', '9'));
        $max = count($characters) - 1;
        for ($i = 0; $i < $length; $i++) {
            $rand = mt_rand(0, $max);
            $str .= $characters[$rand];
        }

        return $str;
    }

    public function getFotoPerfil()
    {
        return $this->foto
            ? $this->foto
            : Yii::app()->request->baseUrl.'/images/fotos_perfil_asociado/foto_perfil.jpg';
    }

    public function actualizarFotoPerfil()
    {
        $imagen = CUploadedFile::getInstance($this, 'foto');
        $this->foto = $imagen;

        if (is_null($imagen)) {
            return [
                'error' => true,
                'mensaje' => 'No se pudo actualizar la foto de perfil.',
            ];
        }

        $ruta = vsprintf('%s%s.%s', [
            'images/fotos_perfil_asociado/',
            $this->randomString(),
            $imagen->getExtensionName(),
        ]);

        if (! $imagen->saveAs($ruta)) {
            return [
                'error' => true,
                'mensaje' => 'No se pudo actualizar la foto de perfil.',
            ];
        }

        $this->foto = $ruta;
        $this->save();

        return [
            'error' => false,
        ];
    }

    public function nombre()
    {
        return $this->ucFirstStrToLower([
            'nombre' => $this->nombre,
            'apellido' => $this->apellidos,
        ]);
    }

    public function nombreCompleto()
    {
        return $this->ucFirstStrToLower([
            'nombre' => $this->nombre,
            'apellido' => $this->apellidos,
            'cedula' => "Céd: {$this->cedula}",
        ]);
    }

    private function ucFirstStrToLower($datos)
    {
        $a = (new Warp($datos))->flatMap(function ($item) {
            return explode(' ', $item);
        });

        $a = (new Warp($a))->map(function ($item) {
            return ucfirst(mb_strtolower($item));
        });

        return implode(' ', $a);
    }

    public function setNacionalidad()
    {
        if ($this->id_tipo_persona == null) {
            return;
        }

        $nacionalidad = TipoPersona::model()->findByPk($this->id_tipo_persona);
        $this->nacionalidad = $nacionalidad->descripcion;
    }

    public function informacionParaReembolso()
    {
        $cuentaBanco = $this->cuentaPrincipal;

        if (! $cuentaBanco) {
            throw new Exception('El asociado no tiene cuenta de banco principal registrada.');
        }

        return [
            'nombre' => $this->nombre(),
            'id_tipo_persona' => $this->id_tipo_persona,
            'cedula' => $this->cedula,
            'id_banco' => $cuentaBanco->id_banco,
            'numero_cuenta' => $cuentaBanco->cuenta_bancaria,
        ];
    }

    public function hasSignedForm()
    {
        $empresa = Empresa::model()->find();

        if (! $empresa->cargar_planilla_firmada) {
            return true;
        }

        if (! $this->isAssociate()) {
            return true;
        }

        // Si ha actualizado al información de la planilla
        if ($this->actualizado == 0) {
            return true;
        }

        return $this->planilla_actualizada;
    }

    private function isAssociate()
    {
        if (Yii::app()->user->checkAccess('usuario_administrador')) {
            return false;
        }

        return Yii::app()->user->checkAccess('usuario_asociado') &&
            ! Yii::app()->user->checkAccess('usuario_administrador');
    }

    public function isPlanillaImagen()
    {
        return in_array($this->getExtensionFromPlanilla(), ['jpg', 'gif', 'png', 'jpeg']);
    }

    public function getExtensionFromPlanilla()
    {
        $planilla = explode('.', $this->planilla_firmada);

        return array_pop($planilla);
    }

    /**
     * Determina usando la configuración de empresa si es la primera actualización de la planilla del asociado.
     */
    public function primeraActualizacionDePlanilla()
    {
        // El rol del usuario debe ser 'usuario_asociado'
        return Yii::app()->user->checkAccess('usuario_asociado') &&
            // La planilla no debe estar actualizada
            $this->actualizado === 0 &&
            // La fecha de inscripcion no debe estar previamente actualizada
            ! $this->fecha_inscripcion_actualizada &&
            // La configuración para actualizar la fecha de inscripción al actualizar la planilla la primera vez debe
            // estar activada
            Empresa::config('actualizar_fecha_inscripcion') === true;
    }
}
