_nombreCompleto)) { return $this->_nombreCompleto; } $this->_nombreCompleto = $this->nombre . ' ' . $this->apellidos; return $this->_nombreCompleto; } public function setNombreCompleto($value) { $this->_nombreCompleto = $value; } /** * Devuelve la lista de géneros de un candidato. * @return array lista de géneros permitidos */ public function getOpcionesGenero() { return array( self::GENERO_HOMBRE => 'Hombre', self::GENERO_MUJER => 'Mujer' ); } /** * Returns the static model of the specified AR class. * @param string $className active record class name. * @return Candidato 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 'tbl_candidatos'; } /** * @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('nombre, email', 'required'), array('email', 'unique'), array('email', 'email'), array('id_estado', 'numerical', 'integerOnly' => true), array('id_estado', 'default', 'value' => Candidato::darIdEstadoInicial()), array('ficheroFotografia', 'file', 'types' => 'jpg', 'maxSize' => 1024 * 1024 * 1, // 1MB como máximo 'tooLarge' => Yii::t('profind', 'La imagen es demasiado pesada. Elija otra fotografía más pequeña.'), 'wrongType' => Yii::t('profind', 'Sólo se permiten imágenes en formato JPG.'), 'allowEmpty' => 'true', ), array('salario_minimo, salario_maximo', 'numerical', 'allowEmpty' => 'true'), array('salario_minimo', 'default', 'value' => Yii::app()->params['salarios_candidatos']['salario_minimo']), array('salario_maximo', 'default', 'value' => Yii::app()->params['salarios_candidatos']['salario_maximo']), array('n_identificacion, nombre, apellidos, email, telefono_fijo, telefono_movil, sexo, lugar_nacimiento, localidad, carnet_conducir, procedencia, disponibilidad_incorporacion, disponibilidad_entrevistas, disponibilidad_guardias, disponibilidad_viajar, disponibilidad_proyectos_internacionales', 'length', 'max' => 255), array('fecha_nacimiento, observaciones', 'safe'), array('fecha_nacimiento', 'date', 'format' => 'dd/MM/yyyy'), // The following rule is used by search(). // Please remove those attributes that should not be searched. array('id, id_estado, estado, descripcionEstado, nombre, apellidos, nombreCompleto, n_identificacion, email, telefono_fijo, telefono_movil, sexo, fecha_nacimiento, lugar_nacimiento, localidad, carnet_conducir, vehiculo_propio, observaciones, salario_minimo, salario_maximo, procedencia, disponibilidad_incorporacion, disponibilidad_entrevistas, disponibilidad_guardias, disponibilidad_viajar, disponibilidad_proyectos_internacionales', 'safe', 'on' => 'search') ); } /** * @return array relational rules. */ public function relations() { return array( 'estado' => array(self::BELONGS_TO, 'EstadoCandidato', 'id_estado'), 'idiomas' => array(self::HAS_MANY, 'CandidatoIdioma', 'candidato_id'), 'idiomasCount' => array(self::STAT, 'CandidatoIdioma', 'candidato_id'), 'titulaciones' => array(self::HAS_MANY, 'CandidatoTitulacion', 'candidato_id'), 'titulacionesCount' => array(self::STAT, 'CandidatoTitulacion', 'candidato_id'), 'areasFuncionales' => array(self::HAS_MANY, 'CandidatoAreaFuncional', 'id_candidato'), 'areasFuncionalesCount' => array(self::STAT, 'CandidatoAreaFuncional', 'id_candidato'), 'capacidadesProfesionales' => array(self::HAS_MANY, 'CandidatoCapacidadProfesional', 'id_candidato'), 'capacidadesProfesionalesCount' => array(self::STAT, 'CandidatoTitulacion', 'id_candidato'), ); } public function scopes() { return array( 'disponibles' => array( 'condition' => 'id_estado = 1', ), 'no_disponibles' => array( 'condition' => 'id_estado = 2', ), ); } /** * @brief Busca el ID del estado inicial de un candidato. * @return integer */ public static function darIdEstadoInicial() { $estado = EstadoCandidato::model()->predeterminado()->find(); if ($estado === null) { Yii::log('No se ha encontrado un estado inicial para el candidato', CLogger::LEVEL_ERROR, 'application.controller.CandidatoController'); throw new CHttpException(500, Yii::t('profind', 'Error interno. No se ha encontrado un estado inicial para el candidato')); } return $estado->id; } /** * @return array customized attribute labels (name=>label) */ public function attributeLabels() { return array( 'id' => 'ID', 'id_estado' => 'Estado', 'descripcionEstado' => 'Estado', 'n_identificacion' => 'DNI/Pasaporte', 'nombre' => 'Nombre', 'apellidos' => 'Apellidos', 'sexo' => 'Sexo', 'localidad' => 'Localidad', 'email' => 'Email', 'telefono_fijo' => 'Teléfono fijo', 'telefono_movil' => 'Teléfono móvil', 'fecha_nacimiento' => 'Fecha de nacimiento', 'lugar_nacimiento' => 'Lugar de nacimiento', 'carnet_conducir' => 'Carnet de conducir', 'vehiculo_propio' => 'Vehículo propio', 'procedencia' => 'Procedencia', 'observaciones' => 'Observaciones', 'salario_minimo' => 'Salario mínimo', 'salario_maximo' => 'Salario máximo', 'disponibilidad_incorporacion' => 'Disponibilidad de incorportación', 'disponibilidad_entrevistas' => 'Disponibilidad para entrevistas', 'disponibilidad_guardias' => 'Disponibilidad para guardias', 'disponibilidad_viajar' => 'Disponibilidad para viajar', 'disponibilidad_proyectos_internacionales' => 'Disponibilidad para proyectos internacionales', 'observaciones' => 'Observaciones', 'modified_time' => 'Modificación', ); } /** * 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() { // Warning: Please modify the following code to remove attributes that // should not be searched. $criteria = new CDbCriteria; $criteria->with = array('estado'); $criteria->together = true; $criteria->compare('t.id', $this->id); $criteria->compare('t.id_estado', $this->id_estado); $criteria->compare('estado.descripcion', $this->descripcionEstado, true); $criteria->compare('t.n_identificacion', $this->n_identificacion, true); $criteria->compare('t.nombre', $this->nombre, true); $criteria->compare('t.apellidos', $this->apellidos, true); $criteria->compare( 'concat(t.nombre, " ", t.apellidos)', $this->_nombreCompleto, true ); $criteria->compare('t.sexo', $this->sexo, true); $criteria->compare('t.localidad', $this->localidad, true); $criteria->compare( 'concat(t.nombre, " ", t.apellidos)', $this->_nombreCompleto, true ); $criteria->compare('t.email', $this->email, true); $criteria->compare('t.telefono_fijo', $this->telefono_fijo, true); $criteria->compare('t.telefono_movil', $this->telefono_movil, true); $criteria->compare('t.fecha_nacimiento', $this->fecha_nacimiento, true); $criteria->compare('t.lugar_nacimiento', $this->lugar_nacimiento, true); $criteria->compare('t.carnet_conducir', $this->carnet_conducir, true); $criteria->compare('t.vehiculo_propio', $this->vehiculo_propio); $criteria->compare('t.observaciones', $this->observaciones, true); $criteria->compare('t.salario_minimo', $this->salario_minimo); $criteria->compare('t.salario_maximo', $this->salario_maximo); $criteria->compare('t.procedencia', $this->procedencia, true); $criteria->compare('t.disponibilidad_incorporacion', $this->disponibilidad_incorporacion, true); $criteria->compare('t.disponibilidad_entrevistas', $this->disponibilidad_entrevistas, true); $criteria->compare('t.disponibilidad_guardias', $this->disponibilidad_guardias, true); $criteria->compare('t.disponibilidad_viajar', $this->disponibilidad_viajar, true); $criteria->compare('t.disponibilidad_proyectos_internacionales', $this->disponibilidad_proyectos_internacionales, true); $criteria->compare('t.created_time', $this->created_time, true); $criteria->compare('t.modified_time', $this->modified_time, true); $criteria->compare('t.deleted_time', $this->deleted_time, true); $sort = new CSort(); $sort->modelClass = 'Candidato'; $sort->attributes = array( '*', 'defaultOrder' => 'id', 'descripcionEstado' => array( 'asc' => 'estado.descripcion', 'desc' => 'estado.descripcion desc', ), 'nombreCompleto' => array( 'asc' => 'concat(t.nombre, " ", t.apellidos)', 'desc' => 'concat(t.nombre, " ", t.apellidos) desc', ), ); return new CActiveDataProvider($this, array( 'criteria' => $criteria, 'sort' => $sort, )); } protected function beforeSave() { if ($this->isNewRecord) $this->created_time = date("Y-m-d H:i:s"); /*if (($this->id_estado === self::ESTADO_BORRADO) && ($this->deleted_time === NULL)) $this->deleted_time = date("Y-m-d H:i:s");*/ return parent::beforeSave(); } protected function afterFind() { parent::afterFind(); $this->fotografia = new FotografiaPerfil(); $this->fotografia->modelo = $this; } protected function afterConstruct() { parent::afterConstruct(); $this->fotografia = new FotografiaPerfil(); $this->fotografia->modelo = $this; } protected function afterSave() { parent::afterSave(); if ($this->isNewRecord) $this->createUploadDir(); } protected function afterDelete() { parent::afterDelete(); $this->deleteUploadDir(); } /** * @brief Devuelve el nombre del fichero por defecto cuando no se tiene imagen * @return string ruta */ public function getImagenDefault() { return 'candidate_photo.jpg'; } /** * @brief Devuelve la ruta con los ficheros del usuario. * Incluye el separador de directorios al final de la ruta. * @return string ruta */ public function getUploadPath() { return Yii::getPathOfAlias('application.uploads.candidatos') . DIRECTORY_SEPARATOR . $this->id . DIRECTORY_SEPARATOR; } /** * @brief Crea un directorio para almacenar ficheros del usuario * @return boolean */ private function createUploadDir() { $upload = $this->getUploadPath(); if (!is_dir($upload)) { return mkdir($upload); } else return false; } /** * @brief Elimina el directorio del usuario y todos sus ficheros * @return boolean */ private function deleteUploadDir() { $upload = $this->getUploadPath(); if (is_dir($upload)) return GHelper::recursiveRemoveDirectory($upload); else return false; } } ?>