diff --git a/www/protected/components/Controller.php b/www/protected/components/Controller.php
index ee7d14d..c87b3e9 100644
--- a/www/protected/components/Controller.php
+++ b/www/protected/components/Controller.php
@@ -1,23 +1,44 @@
end();
+ }
+ }
+
}
\ No newline at end of file
diff --git a/www/protected/components/IdentificacionUsuario.php b/www/protected/components/IdentificacionUsuario.php
index 79f8241..7c0d822 100644
--- a/www/protected/components/IdentificacionUsuario.php
+++ b/www/protected/components/IdentificacionUsuario.php
@@ -1,8 +1,10 @@
findByAttributes(array('email' => $this->email));
@@ -50,8 +52,8 @@ class IdentificacionUsuario extends CBaseUserIdentity {
$this->errorCode = self::ERROR_ESTADO_NOACTIVO;
else if($usuario->estado == Usuario::ESTADO_BORRADO)
$this->errorCode = self::ERROR_ESTADO_BORRADO;
- else if($usuario->estado == Usuario::ESTADO_DENEGADO)
- $this->errorCode = self::ERROR_ESTADO_DENEGADO;
+ else if($usuario->estado == Usuario::ESTADO_BLOQUEADO)
+ $this->errorCode = self::ERROR_ESTADO_BLOQUEADO;
else {
// Si el usuario tiene cifrada la contraseña con md5()
// pasarla al nuevo método.
@@ -67,23 +69,18 @@ class IdentificacionUsuario extends CBaseUserIdentity {
}
/**
- * Returns the unique identifier for the identity.
- * The default implementation simply returns {@link username}.
- * This method is required by {@link IUserIdentity}.
- * @return string the unique identifier for the identity.
+ * @brief Devuelve el identificador único para la identidad del usuario
+ * @return string.
*/
public function getId() {
return $this->_id;
}
/**
- * Returns the display name for the identity.
- * The default implementation simply returns {@link username}.
- * This method is required by {@link IUserIdentity}.
- * @return string the display name for the identity.
+ * @brief Devuelve el email del usuario que está en sesión.
+ * @return string
*/
public function getName() {
return $this->email;
}
-
}
\ No newline at end of file
diff --git a/www/protected/components/UsuarioWeb.php b/www/protected/components/UsuarioWeb.php
index 54905ff..36e2bbf 100644
--- a/www/protected/components/UsuarioWeb.php
+++ b/www/protected/components/UsuarioWeb.php
@@ -1,9 +1,19 @@
_model === null) && ($this->loadUser()))
Usuario::model()->updateByPk($this->id, array(
@@ -12,31 +22,62 @@ class UsuarioWeb extends CWebUser {
return true;
}
+ /**
+ * @brief ID de la empresa del usuario que está en sesión.
+ * @return integer
+ */
public function getId_empresa() {
$usuario = $this->loadUser($this->id);
return $usuario->id_empresa;
}
-
+
+ /**
+ * @brief Comprueba si el usuario que está en sesión es coordinador o no.
+ * @return boolean
+ */
public function getEsCoordinador() {
$usuario = $this->loadUser();
return ($usuario->tipo == Usuario::TIPO_USUARIO_COORDINADOR);
}
-
+
+ /**
+ * @brief Comprueba si el usuario que está en sesión tiene/puede tener
+ * un equipo de agentes.
+ * @return boolean
+ */
public function getTieneEquipo() {
$subscripcion = $this->loadSubscripcion();
- return ($subscripcion->producto->n_agentes > 0);
+ Yii::log(CVarDumper::dumpAsString($subscripcion), CLogger::LEVEL_ERROR);
+
+ if ($subscripcion)
+ return ($subscripcion->producto->n_agentes > 0);
+ else
+ return false;
}
+ /**
+ * @brief Devuelve la subscripción del usuario que está en sesión.
+ * @return Subscripcion
+ */
public function getSubscripcion() {
return $this->loadSubscripcion();
}
-
+
+ /**
+ * @brief Devuelve el nombre del usuario que está en sesión.
+ * Si el usuario ha rellenado su nombre y apellidos, devuelve el nombre
+ * completo. Si no, devuelve la dirección e-mail del usuario.
+ * @return string
+ */
public function getName() {
$usuario = $this->loadUser();
- return ($usuario->nombre) ? $usuario->nombreCompleto : parent::getName();
+ return ($usuario && $usuario->nombre) ? $usuario->nombreCompleto : parent::getName();
}
- // Load user model.
+ /**
+ * @brief Devuelve el usuario que ha hecho sesión.
+ * @return Usuario
+ */
protected function loadUser() {
if ($this->_model === null) {
$this->_model = Usuario::model()->findByPk($this->id);
@@ -44,7 +85,10 @@ class UsuarioWeb extends CWebUser {
return $this->_model;
}
- // Carga la subscripción activa
+ /**
+ * @brief Devuelve la subscripción activa del usuario que ha hecho sesión.
+ * @return Subscripcion
+ */
protected function loadSubscripcion() {
return Subscripcion::model()->activa()->findByAttributes(array('id_usuario' => $this->id));
}
diff --git a/www/protected/config/main.php b/www/protected/config/main.php
index 5c23d90..183d274 100644
--- a/www/protected/config/main.php
+++ b/www/protected/config/main.php
@@ -20,7 +20,14 @@ $config = array(
// autoloading model and component classes
'import' => array(
+ // Modelos
'application.models.*',
+ 'application.models.formularios.*',
+
+ // Helpers
+ 'application.helpers.*',
+
+ // Componentes y extensiones
'application.components.*',
'application.extensions.yii-mail.YiiMailMessage',
'application.extensions.PasswordHash.PasswordHash',
diff --git a/www/protected/config/mode_development.php b/www/protected/config/mode_development.php
index 435aef0..e64fe6b 100644
--- a/www/protected/config/mode_development.php
+++ b/www/protected/config/mode_development.php
@@ -85,12 +85,14 @@ $configSpecific = array(
// Save log messages on file
array(
'class' => 'CFileLogRoute',
- 'levels' => 'error, warning',
+ 'levels' => 'error, warning, trace',
+ //'categories' => '*',
),
// Show log messages on web pages
array(
'class' => 'CWebLogRoute',
- 'levels' => 'error, warning',
+ 'levels' => 'error, warning, trace',
+ //'categories' => 'application.*',
'showInFireBug' => true,
),
),
diff --git a/www/protected/controllers/EmpresaController.php b/www/protected/controllers/EmpresaController.php
index bdf621e..1cb2bc7 100644
--- a/www/protected/controllers/EmpresaController.php
+++ b/www/protected/controllers/EmpresaController.php
@@ -56,7 +56,7 @@ class EmpresaController extends Controller {
$empresa = $this->loadModel($id);
// Uncomment the following line if AJAX validation is needed
- // $this->performAjaxValidation($model);
+ // $this->performAjaxValidation($model, 'empresa-form');
if (isset($_POST['Empresa'])) {
$empresa->attributes = $_POST['Empresa'];
@@ -128,16 +128,4 @@ class EmpresaController extends Controller {
return $empresa;
}
-
- /**
- * Performs the AJAX validation.
- * @param CModel the model to be validated
- */
- protected function performAjaxValidation($model) {
- if (isset($_POST['ajax']) && $_POST['ajax'] === 'empresa-form') {
- echo CActiveForm::validate($model);
- Yii::app()->end();
- }
- }
-
}
diff --git a/www/protected/controllers/EquipoController.php b/www/protected/controllers/EquipoController.php
index 5016f34..06ee80e 100644
--- a/www/protected/controllers/EquipoController.php
+++ b/www/protected/controllers/EquipoController.php
@@ -19,9 +19,9 @@ class EquipoController extends Controller {
public function accessRules() {
return array(
array('allow',
- 'actions' => array('index', 'delete'),
+ 'actions' => array('index', 'deleteMember'),
'users' => array('@'),
- 'expression' => 'Yii::app()->user->esCoordinador',
+ 'expression' => 'Yii::app()->user->esCoordinador',
),
array('deny', // deny all users
'users' => array('*'),
@@ -33,6 +33,7 @@ class EquipoController extends Controller {
$invitacion = new FormularioInvitarAgente;
if (isset($_POST['FormularioInvitarAgente'])) {
+ Yii::trace('Dar de alta un nuevo agente', 'application.controllers.EquipoController');
$invitacion->attributes = $_POST['FormularioInvitarAgente'];
if ($invitacion->validate()) {
@@ -46,7 +47,7 @@ class EquipoController extends Controller {
$nuevo_usuario->clave_seguridad = $nuevo_usuario->encryptSecureKey(microtime() . $nuevo_usuario->password);
if ($nuevo_usuario->save()) {
- $this->enviarMailRegistroAgente($nuevo_usuario);
+ EMail::enviarBienvenidaAgente($nuevo_usuario->email, $nuevo_usuario->clave_seguridad);
Yii::app()->user->setFlash('success', Yii::t('profind', 'Se ha enviado la invitación a la dirección') . ' ' . $invitacion->email);
$invitacion = new FormularioInvitarAgente;
} else {
@@ -59,50 +60,38 @@ class EquipoController extends Controller {
}
$agentes = Usuario::model()->equipo()->findAll();
-
+
if (count($agentes) >= Yii::app()->user->subscripcion->producto->n_agentes)
$invitacion = NULL;
-
+
$this->render('index', array(
'agentes' => $agentes,
'invitacion' => $invitacion,
));
}
-
- public function actionDelete($id) {
- $agente = $this->loadModel($id);
- if ($agente) $agente->delete();
-
- // if AJAX request (triggered by deletion via admin grid view), we should not redirect the browser
- if(!isset($_GET['ajax']))
- $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('index'));
- }
/**
- * Envía un mail de registro a un usuario
- * con una URL de confirmación.
- * @param Usuario $usuario Usuario al que se le enviará el mail de registro
+ * @brief Elimina a un miembro (agente) del equipo.
+ * También envía un email al agente informándole.
*/
- private function enviarMailRegistroAgente($usuario) {
- Yii::import('ext.yii-mail.YiiMailMessage');
-
- $url_activacion = Yii::app()->params['frontpage'] . '?' . 'key=' . $usuario->clave_seguridad . '&email=' . urlencode($usuario->email) . '&x=1';
-
- $mensaje = new YiiMailMessage;
- $mensaje->from = Yii::app()->params['email_remitente'];
- $mensaje->setTo($usuario->email);
- $mensaje->subject = Yii::t('profind', 'Complete su registro de agente en PROFIND');
- $mensaje->view = 'registro_agente';
- $mensaje->setBody(array(
- 'url' => $url_activacion,
- 'email' => $usuario->email
- ), 'text/html'
- );
-
- Yii::app()->mail->send($mensaje);
+ public function actionDeleteMember($id) {
+ $agente = $this->loadModel($id);
+ if ($agente) {
+ try {
+ Yii::trace('Eliminando el agente', 'application.controllers.EquipoController');
+ $agente->delete();
+ EMail::enviarConfirmacionCancelacion($agente->email);
+ Yii::app()->user->setFlash('success', Yii::t('profind', 'Se ha eliminado el agente'));
+ } catch (Exception $e) {
+ Yii::trace($e->getMessage(), 'application.controllers.UsuarioController');
+ Yii::app()->user->setFlash('error', Yii::t('profind', 'Se ha producido un error al eliminar el agente'));
+ Yii::app()->user->setFlash('error', CHtml::errorSummary($agente));
+ }
+ }
+ if (!isset($_GET['ajax']))
+ $this->redirect(isset($_POST['returnUrl']) ? $_POST['returnUrl'] : array('index'));
}
-
-
+
/**
* Returns the data model based on the primary key given in the GET variable.
* If the data model is not found, an HTTP exception will be raised.
@@ -115,15 +104,4 @@ class EquipoController extends Controller {
return $model;
}
- /**
- * Performs the AJAX validation.
- * @param CModel the model to be validated
- */
- protected function performAjaxValidation($model) {
- if (isset($_POST['ajax']) && $_POST['ajax'] === 'usuario-form') {
- echo CActiveForm::validate($model);
- Yii::app()->end();
- }
- }
-
}
diff --git a/www/protected/controllers/RegistroUsuarioController.php b/www/protected/controllers/RegistroUsuarioController.php
deleted file mode 100644
index d72dd8b..0000000
--- a/www/protected/controllers/RegistroUsuarioController.php
+++ /dev/null
@@ -1,327 +0,0 @@
- array('registrar', 'registrarAgente', 'activar', 'cancelar'),
- 'users' => array('*')
- ),
- array('deny'),
- );
- }
-
- /**
- * Realiza el registro de un usuario a partir de los datos introducidos
- * en el formulario de la página de entrada.
- * También envía un email al usuario para que confirme su cuenta.
- */
- public function actionRegistrar() {
- $formulario = new FormularioRegistro;
- $resultado = array();
-
- // if it is ajax validation request
- if (isset($_POST['ajax']) && $_POST['ajax'] === 'registro-form') {
-
- $formulario->email = $_POST['FormularioRegistro_email'];
- $formulario->password = $_POST['FormularioRegistro_password'];
- $formulario->password2 = $_POST['FormularioRegistro_password2'];
-
- if (!$formulario->validate()) {
- foreach ($formulario->getErrors() as $campo => $error) {
- $resultado[$campo] = $error;
- }
- echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
- Yii::app()->end();
- }
-
- $nuevo_usuario = new Usuario('registrar');
- $nuevo_usuario->tipo = Usuario::TIPO_USUARIO_COORDINADOR;
- $nuevo_usuario->email = $formulario->email;
- $nuevo_usuario->password = $nuevo_usuario->encryptPassword($formulario->password);
- $nuevo_usuario->estado = Usuario::ESTADO_NOACTIVO;
- $nuevo_usuario->clave_seguridad = $nuevo_usuario->encryptSecureKey(microtime() . $nuevo_usuario->password);
-
- if (!$nuevo_usuario->save()) {
- foreach ($nuevo_usuario->getErrors() as $campo => $error) {
- $resultado[$campo] = $error;
- }
- echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
- Yii::app()->end();
- }
-
- // Crear la empresa
- $nueva_empresa = new Empresa('registrar');
- if (!$nueva_empresa->save()) {
- foreach ($nueva_empresa->getErrors() as $campo => $error) {
- $resultado[$campo] = $error;
- }
- echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
- Yii::app()->end();
- }
- $nuevo_usuario->id_empresa = $nueva_empresa->id;
- if (!$nuevo_usuario->save()) {
- foreach ($nuevo_usuario->getErrors() as $campo => $error) {
- $resultado[$campo] = $error;
- }
- echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
- Yii::app()->end();
- }
-
- // Crear la subscripción
- $nueva_subscripcion = new Subscripcion('registrar');
- $nueva_subscripcion->estado = Subscripcion::ESTADO_ACTIVO;
- $nueva_subscripcion->id_usuario = $nuevo_usuario->id;
- $nueva_subscripcion->id_producto = 1;
- if (!$nueva_subscripcion->save()) {
- foreach ($nueva_subscripcion->getErrors() as $campo => $error) {
- $resultado[$campo] = $error;
- }
- echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
- Yii::app()->end();
- }
-
- if ($this->enviarMailRegistro($nuevo_usuario)) {
- $resultado['status'] = '200';
- $resultado['titulo'] = Yii::t('profind', 'Gracias por registrarse en PRODIND');
- $resultado['texto'] = Yii::t('profind', 'Su cuenta ha sido creada. En unos momentos recibirá un email con un enlace para completar su registro.');
- } else {
- $resultado['status'] = '200';
- $resultado['titulo'] = Yii::t('profind', 'Error en el registro');
- $resultado['texto'] = Yii::t('profind', 'No se ha podido enviar el correo de registro a la dirección indicada.');
- }
- echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
- Yii::app()->end();
-
- }
-
- $this->redirect(Yii::app()->params['frontpage']);
- }
-
- public function actionRegistrarAgente() {
- $formulario = new FormularioRegistroAgente;
- $resultado = array();
-
- if (isset($_POST['ajax']) && $_POST['ajax'] === 'activar-agente-form-ext') {
- $formulario->key = $_POST['FormularioActivarAgente_key'];
- $formulario->email = $_POST['FormularioActivarAgente_email'];
- $formulario->password = $_POST['FormularioActivarAgente_password'];
- $formulario->passwordRepetida = $_POST['FormularioActivarAgente_password_repetida'];
-
- if ($formulario->validate()) {
- $usuario = Usuario::model()->findByAttributes(array('email' => $formulario->email));
- $usuario->estado = Usuario::ESTADO_ACTIVO;
- $usuario->save();
-
- if ($this->_cambiarPassword($usuario->id, $formulario->password)) {
- $this->enviarMailConfirmacionActivacion($usuario);
- $resultado['status'] = '200';
- $resultado['titulo'] = Yii::t('profind', 'Cuenta de agente activada');
- $resultado['texto'] = Yii::t('profind', 'Se ha activado su cuenta y se ha establecido su nueva password en PROFIND.');
- echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
- Yii::app()->end();
- } else {
- foreach ($formulario->getErrors() as $campo => $error) {
- $resultado[$campo] = $error;
- }
- echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
- Yii::app()->end();
- }
- } else {
- foreach ($formulario->getErrors() as $campo => $error) {
- $resultado[$campo] = $error;
- }
- echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
- Yii::app()->end();
- }
- }
-
- $this->redirect(Yii::app()->params['frontpage']);
- }
-
- private function _cambiarPassword($id, $nueva_password) {
- $usuario = Usuario::model()->findByPk($id);
- if (!isset($usuario))
- throw new CHttpException(404, Yii::t('profind', 'La página solicitada no existe.'));
-
- $usuario->password = $usuario->encryptPassword($nueva_password);
- $usuario->clave_seguridad = $usuario->encryptSecureKey(microtime() . $usuario->password);
- if ($usuario->save()) {
- return true;
- } else
- return false;
- }
-
- /**
- * Activa la cuenta del usuario a partir de la URL de activación
- * que se le ha enviado a través de un email.
- */
- public function actionActivar() {
- $email = $_GET['email'];
- $clave_seguridad = $_GET['key'];
-
- if ($email && $clave_seguridad) {
- $usuario = Usuario::model()->findByAttributes(array('email' => $email));
-
- // Comprobamos si se ha encontrado un usuario con ese email
- if (!isset($usuario)) {
- $this->render('//site/error', array(
- 'titulo' => Yii::t('profind', 'Error de activación'),
- 'mensaje' => Yii::t('profind', 'No se puede activar la cuenta.
La URL de activación es incorrecta.'),
- ));
- } elseif ($usuario->estado == Usuario::ESTADO_ACTIVO) {
- $this->render('//site/error', array(
- 'titulo' => Yii::t('profind', 'Cuenta ya activada'),
- 'mensaje' => Yii::t('profind', 'No se ha realizado ningún cambio.
La cuenta ya estaba activada.'),
- ));
- } elseif ($usuario->estado == Usuario::ESTADO_DENEGADO) {
- $this->render('//site/error', array(
- 'titulo' => Yii::t('profind', 'Cuenta bloqueada'),
- 'mensaje' => Yii::t('profind', 'La cuenta ha sido bloqueada.
Contacte con el administrador del sitio para obtener más información.'),
- ));
- } elseif (isset($usuario->clave_seguridad) && ($usuario->clave_seguridad == $clave_seguridad)) {
- // Hay que activar el usuario
- $usuario->estado = Usuario::ESTADO_ACTIVO;
- $usuario->clave_seguridad = $usuario->encryptSecureKey(microtime() . $usuario->password);
- $usuario->save();
-
- $this->enviarMailConfirmacionActivacion($usuario);
-
- $this->layout = '//layouts/mensaje';
- $this->render('confirmacion_usuario', array());
- } else {
- $this->render('//site/error', array(
- 'titulo' => Yii::t('profind', 'Error de activación'),
- 'mensaje' => Yii::t('profind', 'No se puede activar la cuenta.
La URL de activación es incorrecta.'),
- ));
- }
- } else {
- $this->render('//site/error', array(
- 'titulo' => Yii::t('profind', 'Error de activación'),
- 'mensaje' => Yii::t('profind', 'No se puede activar la cuenta.
La URL de activación es incorrecta.'),
- ));
- }
- }
-
- public function actionCancelar() {
- $email = $_GET['email'];
- $clave_seguridad = $_GET['key'];
-
- if ($email && $clave_seguridad) {
- $usuario = Usuario::model()->findByAttributes(array('email' => $email));
-
- // Comprobamos si se ha encontrado un usuario con ese email
- if (!isset($usuario)) {
- $this->render('//site/error', array(
- 'titulo' => Yii::t('profind', 'Error de cancelación'),
- 'mensaje' => Yii::t('profind', 'No se puede cancelar la cuenta.
La URL de cancelación es incorrecta.'),
- ));
- } elseif ($usuario->estado == Usuario::ESTADO_NOACTIVO) {
- $this->render('//site/error', array(
- 'titulo' => Yii::t('profind', 'Cuenta no confirmada'),
- 'mensaje' => Yii::t('profind', 'No se ha realizado ningún cambio.
La cuenta no está confirmada.'),
- ));
- } elseif ($usuario->estado == Usuario::ESTADO_BORRADO) {
- $this->render('//site/error', array(
- 'titulo' => Yii::t('profind', 'Cuenta ya cancelada'),
- 'mensaje' => Yii::t('profind', 'No se ha realizado ningún cambio.
La cuenta ya estaba cancelada.'),
- ));
- } elseif ($usuario->estado == Usuario::ESTADO_DENEGADO) {
- $this->render('//site/error', array(
- 'titulo' => Yii::t('profind', 'Cuenta bloqueada'),
- 'mensaje' => Yii::t('profind', 'La cuenta ha sido bloqueada.
Contacte con el administrador del sitio para obtener más información.'),
- ));
- } elseif (isset($usuario->clave_seguridad) && ($usuario->clave_seguridad == $clave_seguridad)) {
- // Hay que desactivar el usuario
- $usuario->estado = Usuario::ESTADO_NOACTIVO;
- $usuario->clave_seguridad = $usuario->encryptSecureKey(microtime() . $usuario->password);
- $usuario->save();
-
- $this->enviarMailConfirmacionCancelacion($usuario);
-
- $this->layout = '//layouts/mensaje';
- $this->render('confirmacion_cancelacion_usuario', array());
- } else {
- $this->render('//site/error', array(
- 'titulo' => Yii::t('profind', 'Error de cancelación'),
- 'mensaje' => Yii::t('profind', 'No se puede cancelar la cuenta.
La URL de cancelación es incorrecta.'),
- ));
- }
- } else {
- $this->render('//site/error', array(
- 'titulo' => Yii::t('profind', 'Error de cancelación'),
- 'mensaje' => Yii::t('profind', 'No se puede cancelar la cuenta.
La URL de cancelación es incorrecta.'),
- ));
- }
- }
-
- /**
- * Envía un mail de registro a un usuario
- * con una URL de confirmación.
- * @param Usuario $usuario Usuario al que se le enviará el mail de registro
- */
- private function enviarMailRegistro($usuario) {
- Yii::import('ext.yii-mail.YiiMailMessage');
-
- $url_activacion = $this->createAbsoluteUrl('registroUsuario/activar', array("key" => $usuario->clave_seguridad, "email" => $usuario->email));
- $mensaje = new YiiMailMessage;
-
- $mensaje->from = Yii::app()->params['email_remitente'];
- $mensaje->setTo($usuario->email);
- $mensaje->subject = Yii::t('profind', 'Complete su registro en PROFIND');
- $mensaje->view = 'registro_usuario';
- $mensaje->setBody(array(
- 'url' => $url_activacion,
- 'email' => $usuario->email
- ), 'text/html'
- );
-
- return Yii::app()->mail->send($mensaje);
- }
-
- /**
- * Envía un mail de confirmación de su cuenta al usuario.
- * @param Usuario $usuario Usuario al que se le enviará el mail de registro
- */
- private function enviarMailConfirmacionActivacion($usuario) {
- Yii::import('ext.yii-mail.YiiMailMessage');
-
- $mensaje = new YiiMailMessage;
-
- $mensaje->from = Yii::app()->params['email_remitente'];
- $mensaje->setTo($usuario->email);
- $mensaje->subject = Yii::t('profind', 'Gracias por registrarse en PROFIND.');
- $mensaje->view = 'confirmacion_usuario';
- $mensaje->setBody(array(
- 'email' => $usuario->email
- ), 'text/html'
- );
-
- return Yii::app()->mail->send($mensaje);
- }
-
- private function enviarMailConfirmacionCancelacion($usuario) {
- Yii::import('ext.yii-mail.YiiMailMessage');
-
- $mensaje = new YiiMailMessage;
-
- $mensaje->from = Yii::app()->params['email_remitente'];
- $mensaje->setTo($usuario->email);
- $mensaje->subject = Yii::t('profind', 'Confirmación de cancelación de su cuenta en PROFIND');
- $mensaje->view = 'confirmacion_cancelacion_usuario';
- $mensaje->setBody(array('email' => $usuario->email), 'text/html');
-
- return Yii::app()->mail->send($mensaje);
- }
-}
\ No newline at end of file
diff --git a/www/protected/controllers/SeguridadUsuarioController.php b/www/protected/controllers/SeguridadUsuarioController.php
index f37ce7c..c750b9b 100644
--- a/www/protected/controllers/SeguridadUsuarioController.php
+++ b/www/protected/controllers/SeguridadUsuarioController.php
@@ -4,42 +4,6 @@ class SeguridadUsuarioController extends Controller {
public $defaultAction = 'recuperar';
- /**
- * Realiza la recuperación de la contraseña de un usuario.
- * Este método es llamado por AJAX desde la página de entrada.
- *
- */
- public function actionRecuperar() {
- $formulario = new FormularioRecuperarPassword;
- $resultado = array();
-
- // if it is ajax validation request
- if (isset($_POST['ajax']) && $_POST['ajax'] === 'recuperar-form') {
-
- $formulario->email = $_POST['FormularioRecuperar_email'];
-
- if (!$formulario->validate()) {
- foreach ($formulario->getErrors() as $campo => $error) {
- $resultado[$campo] = $error;
- }
- echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
- Yii::app()->end();
- }
-
- $usuario = Usuario::model()->findByAttributes(array('email' => $formulario->email));
- if ($usuario) {
- $this->enviarMailRecuperacion($usuario);
-
- $resultado['status'] = '200';
- $resultado['titulo'] = Yii::t('profind', 'Recuperación de su cuenta en PROFIND');
- $resultado['texto'] = Yii::t('profind', 'En unos momentos recibirá un un correo con los pasos necesarios para recuperar su cuenta en PROFIND.');
- echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
- Yii::app()->end();
- }
- }
-
- $this->redirect(Yii::app()->params['frontpage']);
- }
/**
* Cambiar la contraseña del usuario desde la página de entrada.
@@ -135,51 +99,5 @@ class SeguridadUsuarioController extends Controller {
return false;
}
- /**
- * Envía un mail de recuperación de password a un usuario con una URL.
- * @param Usuario $usuario Usuario al que se le enviará el mail de recuperación
- */
- private function enviarMailRecuperacion($usuario) {
- Yii::import('ext.yii-mail.YiiMailMessage');
-
- $url_modificacion = Yii::app()->params['frontpage'] . '?' . 'key=' . $usuario->clave_seguridad . '&email=' . urlencode($usuario->email);
-
- $mensaje = new YiiMailMessage;
- $mensaje->from = Yii::app()->params['email_remitente'];
- $mensaje->setTo($usuario->email);
- $mensaje->subject = Yii::t('profind', 'Recuperación de su cuenta en PROFIND');
- $mensaje->view = 'recuperacion_password_usuario';
- $mensaje->setBody(array(
- 'url' => $url_modificacion,
- 'email' => $usuario->email
- ), 'text/html'
- );
-
- Yii::app()->mail->send($mensaje);
- }
-
- /**
- * Envía un mail confirmando el cambio de password a un usuario.
- * También se envio una URL de recuperacion por si fuera un cambio no permitido.
- * @param Usuario $usuario Usuario al que se le enviará el mail de notificación
- */
- private function enviarMailNotificacionCambioPassword($usuario) {
- Yii::import('ext.yii-mail.YiiMailMessage');
-
- $url_modificacion = Yii::app()->params['frontpage'] . '?' . 'key=' . $usuario->clave_seguridad . '&email=' . urlencode($usuario->email);
-
- $mensaje = new YiiMailMessage;
- $mensaje->from = Yii::app()->params['email_remitente'];
- $mensaje->setTo($usuario->email);
- $mensaje->subject = Yii::t('profind', 'Se ha modificado su password en PROFIND');
- $mensaje->view = 'notificacion_cambio_password_usuario';
- $mensaje->setBody(array(
- 'url' => $url_modificacion,
- 'email' => $usuario->email
- ), 'text/html'
- );
-
- Yii::app()->mail->send($mensaje);
- }
}
\ No newline at end of file
diff --git a/www/protected/controllers/SiteController.php b/www/protected/controllers/SiteController.php
index bafd760..5ecfa1f 100644
--- a/www/protected/controllers/SiteController.php
+++ b/www/protected/controllers/SiteController.php
@@ -44,7 +44,7 @@ class SiteController extends Controller {
}
/**
- * Displays the login page
+ * Validate login data
*/
public function actionLogin() {
$formulario = new FormularioLogin;
diff --git a/www/protected/controllers/UsuarioController.php b/www/protected/controllers/UsuarioController.php
index 7b77bd8..937a1d5 100644
--- a/www/protected/controllers/UsuarioController.php
+++ b/www/protected/controllers/UsuarioController.php
@@ -1,5 +1,12 @@
array('modificar', 'delete'),
+ array('allow',
+ 'actions' => array(
+ 'activar', 'cancelar', 'establecerPassword',
+ 'recuperar', 'registrar', 'registrarAgente',
+ ),
+ 'users' => array('*'),
+ ),
+ array('allow',
+ 'actions' => array(
+ 'cambiarPassword' ,'delete', 'modificar'
+ ),
'users' => array('@'),
),
- array('deny', // deny all users
+ array('deny',
'users' => array('*'),
),
);
}
/**
- * Actualiza un usuario.
- * If update is successful, the browser will be redirected to the 'view' page.
- * @param integer $id the ID of the model to be updated
+ * @brief Realiza el registro de un usuario.
+ * - Coordinador => a través de la página de entrada (formulario)
+ * - Agente => a través del formulario de añadir agente en el equipo (AJAX)
+ */
+ public function actionRegistrar() {
+ // ¿Coordinador o agente?
+ if (isset($_POST['ajax']) && $_POST['ajax'] === 'registro-coordinador-form-entrada') {
+ $this->_registrarCoordinador();
+ } elseif (isset($_POST['FormularioRegistrarAgente'])) {
+ $this->_registrarAgente();
+ } else
+ $this->redirect(Yii::app()->params['frontpage']);
+ }
+
+ /**
+ * @brief Realiza la activación de un usuario (coordinadores y agentes).
+ * - Coordinador => a través del enlace recibido por email
+ * - Agente => a través del formulario de la página de entrada (AJAX)
+ */
+ public function actionActivar() {
+ // ¿Coordinador o agente?
+ if (isset($_POST['ajax']) && $_POST['ajax'] === 'activar-agente-form-entrada') {
+ $this->_activarAgente();
+ } elseif (isset($_GET['email']) && isset($_GET['key'])) {
+ $this->_activarCoordinador();
+ } else
+ $this->redirect(Yii::app()->params['frontpage']);
+ }
+
+ /**
+ * @brief Realiza la recuperación de la contraseña de un usuario.
+ * Este método es llamado por AJAX desde la página de entrada.
+ */
+ public function actionRecuperar() {
+ Yii::trace('Recuperar la cuenta del usuario', 'application.controllers.UsuarioController');
+ $formulario = new FormularioEntradaRecuperarPassword;
+
+ if (isset($_POST['ajax']) && $_POST['ajax'] === 'recuperar-form-entrada') {
+ $formulario->email = $_POST['FormularioRecuperar_email'];
+
+ if (!$formulario->validate())
+ $this->performAjaxValidationMessage($formulario);
+
+ $usuario = Usuario::model()->findByAttributes(array('email' => $formulario->email));
+ if ($usuario) {
+ if (EMail::enviarRecuperacion($usuario->email, $usuario->clave_seguridad)) {
+ Yii::trace('Correo para recuperar la cuenta enviado', 'application.controllers.UsuarioController');
+ $this->performAjaxStatusMessage('success',
+ Yii::t('profind', 'Recuperación de su cuenta en PROFIND'),
+ Yii::t('profind', 'En unos momentos recibirá un un correo con los pasos necesarios para recuperar su cuenta en PROFIND.')
+ );
+ } else {
+ Yii::trace('Error al enviar el correo para recuperar la cuenta', 'application.controllers.UsuarioController');
+ $this->performAjaxStatusMessage('success',
+ Yii::t('profind', 'Recuperación de su cuenta en PROFIND'),
+ Yii::t('profind', 'No se ha podido enviar el correo para recuperar su cuenta a la dirección indicada.')
+ );
+ }
+ } else {
+ Yii::trace('No se encontrado un usuario con el email indicado', 'application.controllers.UsuarioController');
+ $this->performAjaxStatusMessage('failure',
+ Yii::t('profind', 'Recuperación de su cuenta en PROFIND'),
+ Yii::t('profind', 'No se encontrado un usuario con el email indicado.')
+ );
+ }
+ }
+ $this->redirect(Yii::app()->params['frontpage']);
+ }
+
+ /**
+ * @brief Cambia la contraseña de un usuario (coordinador / agente).
+ * Esta acción se llama desde la ficha de un usuario.
+ * Envia un email de notificación al usuario.
+ * @param integer ID del usuario
+ */
+ public function actionCambiarPassword($id) {
+ Yii::trace('Cambiar la password del usuario', 'application.controllers.UsuarioController');
+
+ if ($id != Yii::app()->user->id)
+ throw new CHttpException(404, Yii::t('profind', 'La página solicitada no existe.'));
+
+ $formulario = new FormularioCambiarPassword;
+ $this->performAjaxValidation($formulario, 'cambiar-password-form');
+
+ if (isset($_POST['FormularioCambiarPassword'])) {
+ $formulario->attributes = $_POST['FormularioCambiarPassword'];
+
+ if ($formulario->validate()) {
+ $usuario = $this->loadModel($id);
+ if ($this->_cambiarPassword($usuario, $formulario->password)) {
+ Yii::trace('Se ha modificado la password', 'application.controllers.UsuarioController');
+
+ EMail::enviarNotificacionCambioPassword($usuario->email, $usuario->clave_seguridad);
+
+ Yii::app()->user->setFlash('success', Yii::t('profind', 'Se ha modificado la contraseña'));
+ $this->redirect(array('usuario/modificar', 'id' => $id));
+ }
+ }
+ Yii::app()->user->setFlash('error', Yii::t('profind', 'No se ha podido modificar la contraseña'));
+ Yii::app()->user->setFlash('error', CHtml::errorSummary($formulario));
+ }
+ $this->render('cambiar_password', array('formulario' => $formulario));
+ }
+
+ /**
+ * @brief Establece la contraseña del usuario desde la página de entrada.
+ * Este método es llamado por AJAX desde la página de entrada cuando se
+ * olvida la contraseña.
+ * Envia un email de notificación al usuario informando del cambio.
+ */
+ public function actionEstablecerPassword() {
+ Yii::trace('Estableciendo password para el usuario', 'application.controllers.UsuarioController');
+
+ $formulario = new FormularioEntradaCambiarPassword;
+
+ if (isset($_POST['ajax']) && $_POST['ajax'] === 'cambiar-password-form-entrada') {
+ $formulario->key = $_POST['FormularioCambiarPassword_key'];
+ $formulario->email = $_POST['FormularioCambiarPassword_email'];
+ $formulario->password = $_POST['FormularioCambiarPassword_password'];
+ $formulario->passwordRepetida = $_POST['FormularioCambiarPassword_password_repetida'];
+
+ if (!$formulario->validate())
+ $this->performAjaxValidationMessage($formulario);
+
+ $usuario = Usuario::model()->findByAttributes(array('email' => $formulario->email));
+
+ if ($this->_cambiarPassword($usuario, $formulario->password)) {
+ Yii::trace('Se ha modificado la password', 'application.controllers.UsuarioController');
+ if (EMail::enviarNotificacionCambioPassword($usuario->email, $usuario->clave_seguridad)) {
+ $this->performAjaxStatusMessage('success',
+ Yii::t('profind', 'Password modificada'),
+ Yii::t('profind', 'Se ha modificado su password en PROFIND.')
+ );
+ } else {
+ Yii::trace('Error al enviar el correo para informar del cambio', 'application.controllers.UsuarioController');
+ $this->performAjaxStatusMessage('success',
+ Yii::t('profind', 'Password modificada'),
+ Yii::t('profind', 'Se ha modificado su password en PROFIND pero no se ha podido enviar el correo informando del cambio.')
+ );
+ }
+ } else {
+ Yii::trace('Error al cambiar la password del usuario', 'application.controllers.UsuarioController');
+ $this->performAjaxStatusMessage('success',
+ Yii::t('profind', 'Recuperar password'),
+ Yii::t('profind', 'No se ha podido restablecer la password de su cuenta. Inténtelo más tarde o contacto con PROFIND.')
+ );
+ }
+ }
+ $this->redirect(Yii::app()->params['frontpage']);
+ }
+
+
+ /**
+ * @brief Realiza el registro de un usuario a partir de los datos introducidos
+ * en el formulario de la página de entrada.
+ * También envía un email al usuario para que confirme su cuenta.
+ */
+ protected function _registrarCoordinador() {
+ Yii::trace('Registrando coordinador', 'application.controllers.UsuarioController');
+
+ $formulario = new FormularioRegistroCoordinador;
+ $resultado = array();
+
+ $formulario->email = $_POST['FormularioRegistro_email'];
+ $formulario->password = $_POST['FormularioRegistro_password'];
+ $formulario->password2 = $_POST['FormularioRegistro_password2'];
+
+ if (!$formulario->validate())
+ $this->performAjaxValidationMessage($formulario);
+
+ // Crear el usuario
+ $nuevo_usuario = new Usuario('registrar');
+ $nuevo_usuario->tipo = Usuario::TIPO_USUARIO_COORDINADOR;
+ $nuevo_usuario->email = $formulario->email;
+ $nuevo_usuario->password = $nuevo_usuario->encryptPassword($formulario->password);
+ $nuevo_usuario->estado = Usuario::ESTADO_NOACTIVO;
+ $nuevo_usuario->clave_seguridad = $nuevo_usuario->encryptSecureKey(microtime() . $nuevo_usuario->password);
+
+ // Crear la subscripción
+ $nueva_subscripcion = new Subscripcion('registrar');
+ $nueva_subscripcion->estado = Subscripcion::ESTADO_ACTIVO;
+ $nueva_subscripcion->id_producto = $this->_darIdProductoBasico();
+
+ // Crear la empresa
+ $nueva_empresa = new Empresa('registrar');
+
+ // Guardar los datos
+ $transaccion = Yii::app()->db->beginTransaction();
+ try {
+ Yii::trace('Guardando la nueva empresa', 'application.controllers.UsuarioController');
+ if (!$nueva_empresa->save())
+ throw new CException('Error al guardar la empresa');
+
+ Yii::trace('Guardando el nuevo usuario', 'application.controllers.UsuarioController');
+ $nuevo_usuario->id_empresa = $nueva_empresa->id;
+ if (!$nuevo_usuario->save())
+ throw new CException('Error al guardar el usuario');
+
+ Yii::trace('Guardando la nueva subscripción', 'application.controllers.UsuarioController');
+ $nueva_subscripcion->id_usuario = $nuevo_usuario->id;
+ if (!$nueva_subscripcion->save())
+ throw new CException('Error al guardar la subscripción');
+
+ $transaccion->commit();
+ Yii::trace('Nuevo coordinador dado de alta', 'application.controllers.UsuarioController');
+ } catch (Exception $e) {
+ Yii::trace($e->getMessage(), 'application.controllers.UsuarioController');
+
+ $transaccion->rollBack();
+ $errores = array_merge($nuevo_usuario->getErrors(), $nueva_empresa->getErrors(), $nueva_subscripcion->getErrors());
+ foreach ($errores as $campo => $mensaje) $resultado[$campo] = $mensaje;
+ Yii::trace(CVarDumper::dumpAsString($resultado), 'application.controllers.UsuarioController');
+
+ echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
+ Yii::app()->end();
+ }
+
+ if (EMail::enviarBienvenidaCoordinador($nuevo_usuario->email, $nuevo_usuario->clave_seguridad)) {
+ Yii::trace('Correo para activar el coordinador enviado', 'application.controllers.UsuarioController');
+ $this->performAjaxStatusMessage('success',
+ Yii::t('profind', 'Gracias por registrarse en PRODIND'),
+ Yii::t('profind', 'Su cuenta ha sido creada. En unos momentos recibirá un email con un enlace para completar su registro.')
+ );
+ } else {
+ Yii::trace('Error al enviar el correo para activar el coordinador', 'application.controllers.UsuarioController');
+ $this->performAjaxStatusMessage('success',
+ Yii::t('profind', 'Gracias por registrarse en PRODIND'),
+ Yii::t('profind', 'Su cuenta ha sido creada pero no se ha podido enviar el correo de registro a la dirección indicada.')
+ );
+ }
+ }
+
+ /**
+ * @brief Activa la cuenta del coordinador a partir de la URL de activación
+ * que se le ha enviado a través del email generado en el proceso de
+ * registrar un coordinador.
+ */
+ protected function _activarCoordinador() {
+ Yii::trace('Activando coordinador', 'application.controllers.UsuarioController');
+
+ $email = $_GET['email'];
+ $clave_seguridad = $_GET['key'];
+
+ if ($email && $clave_seguridad) {
+ $usuario = Usuario::model()->findByAttributes(array('email' => $email));
+
+ // Comprobamos si se ha encontrado un usuario con ese email
+ if (!isset($usuario)) {
+ Yii::trace('No existe el email', 'application.controllers.UsuarioController');
+ $this->render('//site/error', array(
+ 'titulo' => Yii::t('profind', 'Error de activación'),
+ 'mensaje' => Yii::t('profind', 'No se puede activar la cuenta.
La URL de activación es incorrecta.'),
+ ));
+ } elseif ($usuario->estado == Usuario::ESTADO_ACTIVO) {
+ Yii::trace('El usuario ya está activo', 'application.controllers.UsuarioController');
+ $this->render('//site/error', array(
+ 'titulo' => Yii::t('profind', 'Cuenta ya activada'),
+ 'mensaje' => Yii::t('profind', 'No se ha realizado ningún cambio.
La cuenta ya estaba activada.'),
+ ));
+ } elseif ($usuario->estado == Usuario::ESTADO_BLOQUEADO) {
+ Yii::trace('El usuario está bloqueado', 'application.controllers.UsuarioController');
+ $this->render('//site/error', array(
+ 'titulo' => Yii::t('profind', 'Cuenta bloqueada'),
+ 'mensaje' => Yii::t('profind', 'La cuenta ha sido bloqueada.
Contacte con el administrador del sitio para obtener más información.'),
+ ));
+ } elseif (isset($usuario->clave_seguridad) && ($usuario->clave_seguridad == $clave_seguridad)) {
+ Yii::trace('Guardando el usuario', 'application.controllers.UsuarioController');
+ // Hay que activar el usuario
+ $usuario->estado = Usuario::ESTADO_ACTIVO;
+ $usuario->clave_seguridad = $usuario->encryptSecureKey(microtime() . $usuario->password);
+ $usuario->save();
+
+ EMail::enviarConfirmacionActivacion($usuario->email);
+
+ $this->layout = '//layouts/mensaje';
+ $this->render('confirmacion_usuario', array());
+
+ Yii::trace('Coordinador activado', 'application.controllers.UsuarioController');
+ } else {
+ Yii::trace('Clave de seguridad no válida', 'application.controllers.UsuarioController');
+ $this->render('//site/error', array(
+ 'titulo' => Yii::t('profind', 'Error de activación'),
+ 'mensaje' => Yii::t('profind', 'No se puede activar la cuenta.
El enlace de activación es incorrecto.'),
+ ));
+ }
+ } else {
+ Yii::trace('URL de activación no válida', 'application.controllers.UsuarioController');
+ $this->render('//site/error', array(
+ 'titulo' => Yii::t('profind', 'Error de activación'),
+ 'mensaje' => Yii::t('profind', 'No se puede activar la cuenta.
El enlace de activación es incorrecto.'),
+ ));
+ }
+ }
+
+ public function actionRegistrarAgente() {
+ $formulario = new FormularioRegistroAgente;
+ $resultado = array();
+
+ if (isset($_POST['ajax']) && $_POST['ajax'] === 'activar-agente-form-entrada') {
+ $formulario->key = $_POST['FormularioActivarAgente_key'];
+ $formulario->email = $_POST['FormularioActivarAgente_email'];
+ $formulario->password = $_POST['FormularioActivarAgente_password'];
+ $formulario->passwordRepetida = $_POST['FormularioActivarAgente_password_repetida'];
+
+ if (!$formulario->validate())
+ $this->performAjaxValidationMessage($formulario);
+
+ $usuario = Usuario::model()->findByAttributes(array('email' => $formulario->email));
+ $usuario->estado = Usuario::ESTADO_ACTIVO;
+ $usuario->save();
+
+ if ($this->_cambiarPassword($usuario, $formulario->password)) {
+ EMail::enviarConfirmacionActivacion($usuario->email);
+ $this->performAjaxStatusMessage('success',
+ Yii::t('profind', 'Cuenta de agente activada'),
+ Yii::t('profind', 'Se ha activado su cuenta y se ha establecido su nueva password en PROFIND.')
+ );
+ } else {
+ foreach ($formulario->getErrors() as $campo => $error) {
+ $resultado[$campo] = $error;
+ }
+ echo function_exists('json_encode') ? json_encode($resultado) : CJSON::encode($resultado);
+ Yii::app()->end();
+ }
+ }
+
+ $this->redirect(Yii::app()->params['frontpage']);
+ }
+
+ protected function _cambiarPassword($usuario, $nueva_password) {
+ $usuario->password = $usuario->encryptPassword($nueva_password);
+ $usuario->clave_seguridad = $usuario->encryptSecureKey(microtime() . $usuario->password);
+ return $usuario->save();
+ }
+
+ public function actionCancelar() {
+ $email = $_GET['email'];
+ $clave_seguridad = $_GET['key'];
+
+ if ($email && $clave_seguridad) {
+ $usuario = Usuario::model()->findByAttributes(array('email' => $email));
+
+ // Comprobamos si se ha encontrado un usuario con ese email
+ if (!isset($usuario)) {
+ $this->render('//site/error', array(
+ 'titulo' => Yii::t('profind', 'Error de cancelación'),
+ 'mensaje' => Yii::t('profind', 'No se puede cancelar la cuenta.
La URL de cancelación es incorrecta.'),
+ ));
+ } elseif ($usuario->estado == Usuario::ESTADO_NOACTIVO) {
+ $this->render('//site/error', array(
+ 'titulo' => Yii::t('profind', 'Cuenta no confirmada'),
+ 'mensaje' => Yii::t('profind', 'No se ha realizado ningún cambio.
La cuenta no está confirmada.'),
+ ));
+ } elseif ($usuario->estado == Usuario::ESTADO_BORRADO) {
+ $this->render('//site/error', array(
+ 'titulo' => Yii::t('profind', 'Cuenta ya cancelada'),
+ 'mensaje' => Yii::t('profind', 'No se ha realizado ningún cambio.
La cuenta ya estaba cancelada.'),
+ ));
+ } elseif ($usuario->estado == Usuario::ESTADO_BLOQUEADO) {
+ $this->render('//site/error', array(
+ 'titulo' => Yii::t('profind', 'Cuenta bloqueada'),
+ 'mensaje' => Yii::t('profind', 'La cuenta ha sido bloqueada.
Contacte con el administrador del sitio para obtener más información.'),
+ ));
+ } elseif (isset($usuario->clave_seguridad) && ($usuario->clave_seguridad == $clave_seguridad)) {
+ // Hay que desactivar el usuario
+ $usuario->estado = Usuario::ESTADO_NOACTIVO;
+ $usuario->clave_seguridad = $usuario->encryptSecureKey(microtime() . $usuario->password);
+ $usuario->save();
+
+ EMail::enviarConfirmacionCancelacion($usuario->email);
+
+ $this->layout = '//layouts/mensaje';
+ $this->render('confirmacion_cancelacion_usuario', array());
+ } else {
+ $this->render('//site/error', array(
+ 'titulo' => Yii::t('profind', 'Error de cancelación'),
+ 'mensaje' => Yii::t('profind', 'No se puede cancelar la cuenta.
La URL de cancelación es incorrecta.'),
+ ));
+ }
+ } else {
+ $this->render('//site/error', array(
+ 'titulo' => Yii::t('profind', 'Error de cancelación'),
+ 'mensaje' => Yii::t('profind', 'No se puede cancelar la cuenta.
La URL de cancelación es incorrecta.'),
+ ));
+ }
+ }
+
+ /**
+ * @brief Busca el ID del producto básico que se utilizará para la subscripción
+ * de los coordinadores nuevos.
+ * @return integer
+ */
+ protected function _darIdProductoBasico() {
+ $producto = Producto::model()->productoInicial()->find();
+ if ($producto === null) {
+ Yii::log('No se ha encontrado un producto básico', CLogger::LEVEL_ERROR, 'application.controller.UsuarioController');
+ throw new CHttpException(500, Yii::t('profind', 'Error interno.'));
+ }
+ return $producto->id;
+ }
+
+ /**
+ * @brief Muestra el formulario de modificación de un usuario y realiza los
+ * cambios.
+ * @param integer $id el ID del usuario a modificar
+ * @param string $provider nombre de la red social a utilizar para rellenar los datos del usuario
*/
public function actionModificar($id, $provider = '') {
if ($id != Yii::app()->user->id)
@@ -60,10 +479,6 @@ class UsuarioController extends Controller {
$usuario->attributes = $_POST['Usuario'];
$ficheroFotografia = CUploadedFile::getInstance($usuario, 'ficheroFotografia');
- Yii::log(CVarDumper::dumpAsString($_POST['Usuario']), CLogger::LEVEL_ERROR);
- Yii::log(CVarDumper::dumpAsString($usuario->attributes), CLogger::LEVEL_ERROR);
- Yii::log(CVarDumper::dumpAsString($ficheroFotografia), CLogger::LEVEL_ERROR);
-
$quitarFotografia = Yii::app()->request->getParam('quitar_fotografia', '0');
if ($usuario->save()) {
@@ -83,6 +498,10 @@ class UsuarioController extends Controller {
));
}
+ /**
+ * @brief Elimina un usuario.
+ * @param integer $id el ID del usuario a eliminar
+ */
public function actionDelete($id) {
if ($id != Yii::app()->user->id)
throw new CHttpException(404, Yii::t('profind', 'La página solicitada no existe.'));
@@ -102,6 +521,12 @@ class UsuarioController extends Controller {
$this->redirect($this->createUrl('modificar', array('id' => $id)));
}
+ /**
+ * @brief Devuelve los datos de un usuario utilizando la red social que
+ * indique el parámetro $provider.
+ * @param integer $id el ID del usuario a modificar
+ * @param string $provider nombre de la red social a utilizar para rellenar los datos del usuario
+ */
public function loadModelwithSocialData($id, $provider) {
$usuario = $this->loadModel($id);
@@ -133,9 +558,9 @@ class UsuarioController extends Controller {
}
/**
- * Returns the data model based on the primary key given in the GET variable.
- * If the data model is not found, an HTTP exception will be raised.
- * @param integer the ID of the model to be loaded
+ * @brief Devuelve los datos del usuario.
+ * Si el usuario no existe, se lanza una excepción HTTP 404
+ * @param integer $id el ID del usuario a recuperar
*/
public function loadModel($id) {
$model = Usuario::model()->findByPk($id);
@@ -146,35 +571,41 @@ class UsuarioController extends Controller {
}
/**
- * Performs the AJAX validation.
- * @param CModel the model to be validated
+ * @brief Genera un mensaje de estado en formato JSON que se utilizará
+ * para mostrar información al usuario en la página de entrada.
+ * @param string $status 'success' o 'failure'
+ * @param string $title título de la ventana modal con mensaje
*/
- protected function performAjaxValidation($model) {
- if (isset($_POST['ajax']) && $_POST['ajax'] === 'usuario-form') {
- echo CActiveForm::validate($model);
- Yii::app()->end();
- }
- }
+ protected function performAjaxStatusMessage($status, $title, $content) {
+ Yii::trace('Generando respuesta JSON con mensaje de estado', 'application.controllers.UsuarioController');
+ $result = array();
+ $result['status'] = $status;
+ $result['titulo'] = $title;
+ $result['texto'] = $content;
+ Yii::trace(CVarDumper::dumpAsString($result), 'application.controllers.UsuarioController');
+ echo function_exists('json_encode') ? json_encode($result) : CJSON::encode($result);
+ Yii::app()->end();
+ }
+
/**
- * Envía un mail de registro a un usuario
- * con una URL de confirmación.
- * @param Usuario $usuario Usuario al que se le enviará el mail de registro
+ * @brief Genera un mensaje en formato JSON con los errores de validación de
+ * uno o más modelos. El mensaje se mostrará al usuario en la página de entrada.
+ * @param mixed $models una instancia de un modelo o un array de instancias.
*/
- private function enviarMailSolicitudBaja($usuario) {
- Yii::import('ext.yii-mail.YiiMailMessage');
-
- $url_cancelacion = $this->createAbsoluteUrl('registroUsuario/cancelar', array("key" => $usuario->clave_seguridad, "email" => $usuario->email));
- $mensaje = new YiiMailMessage;
-
- $mensaje->from = Yii::app()->params['email_remitente'];
- $mensaje->setTo($usuario->email);
- $mensaje->subject = Yii::t('profind', 'Solicitud de cancelación de su cuenta en PROFIND');
- $mensaje->view = 'solicitud_cancelacion_usuario';
- $mensaje->setBody(array('url' => $url_cancelacion), 'text/html');
-
- return Yii::app()->mail->send($mensaje);
+ protected function performAjaxValidationMessage($models) {
+ Yii::trace('Generando respuesta JSON con errores de validación', 'application.controllers.UsuarioController');
+
+ $result = array();
+ if(!is_array($models))
+ $models=array($models);
+
+ foreach($models as $model)
+ foreach($model->getErrors() as $attribute => $errors)
+ $result[$attribute] = $errors;
+
+ Yii::trace(CVarDumper::dumpAsString($result), 'application.controllers.UsuarioController');
+ echo function_exists('json_encode') ? json_encode($result) : CJSON::encode($result);
+ Yii::app()->end();
}
-
-
}
diff --git a/www/protected/helpers/EMail.php b/www/protected/helpers/EMail.php
new file mode 100644
index 0000000..e4cb318
--- /dev/null
+++ b/www/protected/helpers/EMail.php
@@ -0,0 +1,141 @@
+from = Yii::app()->params['email_remitente'];
+ $mensaje->setTo($to);
+ $mensaje->subject = $subject;
+ $mensaje->view = $view;
+ $mensaje->setBody($body, 'text/html');
+ return (Yii::app()->mail->send($mensaje) > 0);
+ }
+
+ /**
+ * @brief Envía un correo de confirmación de cuenta.
+ * @param string $destino dirección de destino
+ * @return boolean
+ */
+ public static function enviarConfirmacionActivacion($destino) {
+ Yii::trace('Enviando correo para confirmar activación', 'application.helpers.EMail');
+ return self::_enviar($destino,
+ Yii::t('profind', 'Gracias por registrarse en PROFIND.'),
+ 'confirmacion_usuario',
+ array('email' => $destino));
+ }
+
+ /**
+ * @brief Envía un correo informando de la cancelación de cuenta
+ * @param string $destino dirección de destino
+ * @return boolean
+ */
+ public static function enviarConfirmacionCancelacion($destino) {
+ Yii::trace('Enviando correo para confirmar cancelación', 'application.helpers.EMail');
+ return self::_enviar($destino,
+ Yii::t('profind', 'Confirmación de cancelación de su cuenta en PROFIND'),
+ 'confirmacion_cancelacion_usuario',
+ array('email' => $destino));
+ }
+
+ /**
+ * @brief Envía un correo de recuperación de password con una URL de verificación.
+ * @param string $destino dirección de destino
+ * @param string $key clave de seguridad necesaria para construir la URL de recuperación
+ * @return boolean
+ */
+ public static function enviarRecuperacion($destino, $key) {
+ Yii::trace('Enviando correo con URL para recuperar la contraseña', 'application.helpers.EMail');
+ $url_recuperacion = Yii::app()->params['frontpage'] . '?' . 'key=' . $key . '&email=' . urlencode($destino);
+ return self::_enviar($destino,
+ Yii::t('profind', 'Recuperación de su cuenta en PROFIND'),
+ 'recuperacion_password_usuario',
+ array('email' => $destino, 'url' => $url_recuperacion));
+ }
+
+ /**
+ * @brief Envía un correo confirmando el cambio de password.
+ * También se envia una URL de recuperación por si fuera un cambio no permitido.
+ * @param string $destino dirección de destino
+ * @param string $key clave de seguridad necesaria para construir la URL de recuperación
+ * @return boolean
+ */
+ public static function enviarNotificacionCambioPassword($destino, $key) {
+ Yii::trace('Enviando correo confirmando el cambio de contraseña', 'application.helpers.EMail');
+ $url_recuperacion = Yii::app()->params['frontpage'] . '?' . 'key=' . $key . '&email=' . urlencode($destino);
+ return self::_enviar($destino,
+ Yii::t('profind', 'Se ha modificado su password en PROFIND'),
+ 'notificacion_cambio_password_usuario',
+ array('email' => $destino, 'url' => $url_recuperacion));
+ }
+
+ /**
+ * @brief Envía un correo de registro de agente con una URL para confirmar la cuenta.
+ * @param string $destino dirección de destino
+ * @param string $key clave de seguridad necesaria para construir la URL de confirmación
+ * @return boolean
+ */
+ public static function enviarBienvenidaAgente($destino, $key) {
+ Yii::trace('Enviando correo de bienvenida a agente', 'application.helpers.EMail');
+ $url_activacion = Yii::app()->params['frontpage'] . '?' . 'key=' . $key . '&email=' . urlencode($destino) . '&x=1';
+ return self::_enviar($destino,
+ Yii::t('profind', 'Complete su registro de agente en PROFIND'),
+ 'registro_agente',
+ array('email' => $destino, 'url' => $url_activacion));
+ }
+
+ /**
+ * @brief Envía un correo de registro de coordinador con una URL para confirmar la cuenta.
+ * @param string $destino dirección de destino
+ * @param string $key clave de seguridad necesaria para construir la URL de confirmación
+ * @return boolean
+ */
+ public static function enviarBienvenidaCoordinador($destino, $key) {
+ Yii::trace('Enviando correo de bienvenida a coordinador', 'application.helpers.EMail');
+ $url_activacion = Yii::app()->createAbsoluteUrl('usuario/activar', array("key" => $key, "email" => $destino));
+ return self::_enviar($destino,
+ Yii::t('profind', 'Complete su registro en PROFIND'),
+ 'registro_usuario',
+ array('email' => $destino, 'url' => $url_activacion));
+ }
+
+ /**
+ * @brief Envía un mail de registro a un usuario (coordinador/agente) con
+ * una URL de confirmación de baja.
+ * @param string $destino dirección de destino
+ * @param string $key clave de seguridad necesaria para construir la URL de confirmación
+ * @return boolean
+ */
+
+ public static function enviarSolicitudBaja($destino, $key) {
+ Yii::trace('Enviando correo con URL para realizar la baja de la cuenta', 'application.helpers.EMail');
+
+ $url_cancelacion = $this->createAbsoluteUrl('usuario/cancelar', array("key" => $key, "email" => $destino));
+ return self::_enviar($destino,
+ Yii::t('profind', 'Solicitud de cancelación de su cuenta en PROFIND'),
+ 'solicitud_cancelacion_usuario',
+ array('email' => $destino, 'url' => $url_cancelacion));
+ }
+}
+?>
diff --git a/www/protected/helpers/GHelper.php b/www/protected/helpers/GHelper.php
new file mode 100644
index 0000000..6617317
--- /dev/null
+++ b/www/protected/helpers/GHelper.php
@@ -0,0 +1,48 @@
+
diff --git a/www/protected/helpers/recursive_remove_directory.php b/www/protected/helpers/recursive_remove_directory.php
deleted file mode 100644
index daa4410..0000000
--- a/www/protected/helpers/recursive_remove_directory.php
+++ /dev/null
@@ -1,46 +0,0 @@
-
\ No newline at end of file
diff --git a/www/protected/migrations/m120927_143321_tbl_productos.php b/www/protected/migrations/m120927_143321_tbl_productos.php
index 83919b2..7ea827e 100644
--- a/www/protected/migrations/m120927_143321_tbl_productos.php
+++ b/www/protected/migrations/m120927_143321_tbl_productos.php
@@ -13,17 +13,23 @@ class m120927_143321_tbl_productos extends CDbMigration
$this->createTable('tbl_subscripciones', array(
'id' => 'pk',
- 'id_usuario' => 'integer',
- 'id_producto' => 'integer',
+ 'id_usuario' => 'integer NOT NULL',
+ 'id_producto' => 'integer NOT NULL',
'estado' => 'string',
'fecha_inicio' => 'datetime',
'fecha_fin' => 'datetime',
));
+
+ $this->addForeignKey('fk_subscripciones_1', 'tbl_subscripciones', 'id_usuario', 'tbl_usuarios', 'id', 'CASCADE', 'CASCADE');
+ $this->addForeignKey('fk_subscripciones_2', 'tbl_subscripciones', 'id_producto', 'tbl_productos', 'id', 'CASCADE', 'CASCADE');
}
public function safeDown()
{
- $this->dropTable('tbl_productos');
+ $this->dropForeignKey('fk_subscripciones_2', 'tbl_subscripciones');
+ $this->dropForeignKey('fk_subscripciones_1', 'tbl_subscripciones');
+
$this->dropTable('tbl_subscripciones');
+ $this->dropTable('tbl_productos');
}
}
\ No newline at end of file
diff --git a/www/protected/models/Empresa.php b/www/protected/models/Empresa.php
index f55b741..05401f8 100644
--- a/www/protected/models/Empresa.php
+++ b/www/protected/models/Empresa.php
@@ -173,10 +173,8 @@ class Empresa extends CActiveRecord {
private function deleteUploadDir() {
$upload = $this->getUploadPath();
- if(is_dir($upload)) {
- require_once( Yii::getPathOfAlias('application.helpers') . DIRECTORY_SEPARATOR . 'recursive_remove_directory.php');
- return recursive_remove_directory($upload);
- }
+ if(is_dir($upload))
+ return GHelper::recursiveRemoveDirectory($upload);
else return false;
}
diff --git a/www/protected/models/FormularioRegistroAgente.php b/www/protected/models/FormularioRegistroAgente.php
deleted file mode 100644
index 3d49155..0000000
--- a/www/protected/models/FormularioRegistroAgente.php
+++ /dev/null
@@ -1,8 +0,0 @@
- array(
+ 'condition' => 'id = 1',
+ 'limit' => 1,
+ ),
+ );
+ }
+
/**
* @return array relational rules.
*/
diff --git a/www/protected/models/Usuario.php b/www/protected/models/Usuario.php
index 5ca9c3e..eb3b6da 100644
--- a/www/protected/models/Usuario.php
+++ b/www/protected/models/Usuario.php
@@ -31,7 +31,7 @@ class Usuario extends CActiveRecord {
const ESTADO_NOACTIVO = 0;
const ESTADO_ACTIVO = 1;
const ESTADO_BORRADO = 2;
- const ESTADO_DENEGADO = 3;
+ const ESTADO_BLOQUEADO = 3;
const TIPO_USUARIO_COORDINADOR = 'C';
const TIPO_USUARIO_AGENTE = 'A';
@@ -228,10 +228,8 @@ class Usuario extends CActiveRecord {
private function deleteUploadDir() {
$upload = $this->getUploadPath();
- if(is_dir($upload)) {
- require_once( Yii::getPathOfAlias('application.helpers') . DIRECTORY_SEPARATOR . 'recursive_remove_directory.php');
- return recursive_remove_directory($upload);
- }
+ if(is_dir($upload))
+ return GHelper::recursiveRemoveDirectory($upload);
else return false;
}
diff --git a/www/protected/models/FormularioCambiarPassword.php b/www/protected/models/formularios/FormularioCambiarPassword.php
similarity index 77%
rename from www/protected/models/FormularioCambiarPassword.php
rename to www/protected/models/formularios/FormularioCambiarPassword.php
index f19c1b3..793776c 100644
--- a/www/protected/models/FormularioCambiarPassword.php
+++ b/www/protected/models/formularios/FormularioCambiarPassword.php
@@ -27,7 +27,11 @@ class FormularioCambiarPassword extends CFormModel {
public function comprobarPasswordAnterior($attribute, $params) {
if (!$this->hasErrors()) {
$usuario = Usuario::model()->findByPk(Yii::app()->user->id);
- if ($usuario->password != Usuario::model()->encryptPassword($this->passwordAnterior))
+ $ph = new PasswordHash(
+ Yii::app()->params['phpass']['iteration_count_log2'],
+ Yii::app()->params['phpass']['portable_hashes']
+ );
+ if (!$ph->checkPassword($this->passwordAnterior, $usuario->password))
$this->addError($this->passwordAnterior, Yii::t('profind', 'La contraseña anterior no es correcta.'));
}
}
diff --git a/www/protected/models/FormularioExtCambiarPassword.php b/www/protected/models/formularios/FormularioEntradaCambiarPassword.php
similarity index 93%
rename from www/protected/models/FormularioExtCambiarPassword.php
rename to www/protected/models/formularios/FormularioEntradaCambiarPassword.php
index e2e571f..afcc2e6 100644
--- a/www/protected/models/FormularioExtCambiarPassword.php
+++ b/www/protected/models/formularios/FormularioEntradaCambiarPassword.php
@@ -3,7 +3,7 @@
/**
*
*/
-class FormularioExtCambiarPassword extends CFormModel {
+class FormularioEntradaCambiarPassword extends CFormModel {
public $key;
public $email;
diff --git a/www/protected/models/FormularioRecuperarPassword.php b/www/protected/models/formularios/FormularioEntradaRecuperarPassword.php
similarity index 84%
rename from www/protected/models/FormularioRecuperarPassword.php
rename to www/protected/models/formularios/FormularioEntradaRecuperarPassword.php
index 4feb2ce..e388175 100644
--- a/www/protected/models/FormularioRecuperarPassword.php
+++ b/www/protected/models/formularios/FormularioEntradaRecuperarPassword.php
@@ -3,13 +3,10 @@
/**
*
*/
-class FormularioRecuperarPassword extends CFormModel {
+class FormularioEntradaRecuperarPassword extends CFormModel {
public $email;
- /**
- *
- */
public function rules() {
return array(
array('email', 'required'),
@@ -18,9 +15,6 @@ class FormularioRecuperarPassword extends CFormModel {
);
}
- /**
- *
- */
public function existeEmailUsuario($attribute, $params) {
if (!$this->hasErrors()) {
$usuario = Usuario::model()->findByAttributes(array('email' => $this->email));
diff --git a/www/protected/models/FormularioInvitarAgente.php b/www/protected/models/formularios/FormularioInvitarAgente.php
similarity index 100%
rename from www/protected/models/FormularioInvitarAgente.php
rename to www/protected/models/formularios/FormularioInvitarAgente.php
diff --git a/www/protected/models/FormularioLogin.php b/www/protected/models/formularios/FormularioLogin.php
similarity index 100%
rename from www/protected/models/FormularioLogin.php
rename to www/protected/models/formularios/FormularioLogin.php
diff --git a/www/protected/models/formularios/FormularioRegistroAgente.php b/www/protected/models/formularios/FormularioRegistroAgente.php
new file mode 100644
index 0000000..a21898e
--- /dev/null
+++ b/www/protected/models/formularios/FormularioRegistroAgente.php
@@ -0,0 +1,8 @@
+
+clientScript->registerScript('tooltips', "
+ $('.user_list').tooltip({selector: 'a[rel=tooltip]'});
+ ", CClientScript::POS_END);
+?>
+