Beispiel #1
0
 public function eliminaGrupales($id_equipo)
 {
     $grupales = AccionesGrupales::model()->findAllByAttributes(array('equipos_id_equipo' => $id_equipo, 'completada' => 1));
     foreach ($grupales as $gp) {
         Participaciones::model()->deleteAllByAttributes(array('acciones_grupales_id_accion_grupal' => $gp->id_accion_grupal));
         AccionesGrupales::model()->deleteByPk($gp->id_accion_grupal);
     }
 }
 /**
  * Devuelve los recursos de las acciones grupales a los participantes
  *
  * Selecciona las acciones grupales finalizadas sin éxito y devuelve los recursos a sus
  * participantes y creador.
  *
  * @route JugadorNum12/scripts/finalizaGrupales
  *
  * @throws \Exception excepcion interna
  * @return void
  */
 public function actionFinalizaGrupales()
 {
     //Traer acciones y Helper
     Yii::import('application.components.Acciones.*');
     $tiempo = time();
     $busqueda = new CDbCriteria();
     $busqueda->addCondition(':bTiempo >= finalizacion');
     $busqueda->addCondition('completada = :bCompletada');
     $busqueda->params = array(':bTiempo' => $tiempo, ':bCompletada' => 0);
     $grupales = AccionesGrupales::model()->findAll($busqueda);
     //Iterar sobre las acciones grupales resultantes de la búsqueda
     foreach ($grupales as $gp) {
         $transaction = Yii::app()->db->beginTransaction();
         try {
             //Tomar participaciones
             $participantes = Participaciones::model()->findAllByAttributes(array('acciones_grupales_id_accion_grupal' => $gp->id_accion_grupal));
             //Recorro todos los participantes devolviendoles sus recursos.
             //Esto incluye el creador de la acción.
             foreach ($participantes as $participante) {
                 //Cojo el dinero,influencia y animo aportado por el usuario
                 $dinero = $participante->dinero_aportado;
                 $influencia = $participante->influencias_aportadas;
                 $animo = $participante->animo_aportado;
                 //Utilizo el helper para ingresarle al usuario los recursos
                 Recursos::aumentar_recursos($participante->usuarios_id_usuario, 'dinero', $dinero);
                 Recursos::aumentar_recursos($participante->usuarios_id_usuario, 'animo', $animo);
                 Recursos::aumentar_recursos($participante->usuarios_id_usuario, 'influencias', $influencia);
                 //Eliminar ese modelo
                 Participaciones::model()->deleteAllByAttributes(array('acciones_grupales_id_accion_grupal' => $gp->id_accion_grupal, 'usuarios_id_usuario' => $participante->usuarios_id_usuario));
             }
             //Borro esa accion grupal iniciada por el usuario que quiere cambiar de equipo
             AccionesGrupales::model()->deleteByPk($gp->id_accion_grupal);
             //Finalizar transacción con éxito
             $transaction->commit();
         } catch (Exception $ex) {
             //Rollback de la transacción en caso de error
             $transaction->rollback();
             throw $ex;
         }
     }
 }
 /** 
  * Funcion que agrega una participacion a una accion grupal
  *
  *  -  actualiza los recursos del usuario
  *  -  suma exp al jugador en funcion de los recursos aportados
  *  -  actualiza los recursos de la accion
  *  -  agrega la participacion (o actualiza una ya existente)
  *  -  si se completa la accion, la ejecuta
  *
  * Comprobaciones de seguridad realizadas:
  *  1. la participacion es para el equipo del usuario
  *  2. la accion no ha terminado
  *  3. el jugador tiene suficientes recursos
  *  4. la participacion no es mayor que los recursos restantes de la accion
  *  5. error al actualizar la participacion en la base de datos
  *  6. la participacion es vacia (ignorarla)
  *
  * @static
  * @param $id_accion
  * @param $recursosAportados
  * @param $accion
  * @param $habilidad
  * @param $participacion
  * @param $nuevo_participante
  *
  * @throws \Exception 'No puedes participar en esta accion'
  * @throws \Exception 'La accion ya ha acabado'
  * @throws \Exception 'No se puede obtener el modelo de recursos'
  * @throws \Exception 'No tienes suficientes recursos.'
  * @throws \Exception 'Error en la BBDD.'
  * @throws \Exception 'El usuario se ha saltado una validación.'
  * @throws \Exception 'No has aportado nada a la acción.'
  * @return void
  */
 public static function participar($id_accion, $recursosAportados, $accion, $habilidad, $participacion, $nuevo_participante)
 {
     // 1) Comprobacion: la accion es del equipo del user
     if ($accion['equipos_id_equipo'] != Yii::app()->user->usAfic) {
         Yii::app()->user->setFlash('equipo', 'No puedes participar en esta acción. No es de tu equipo');
         throw new Exception('No puedes participar en esta acción.');
     }
     // 2) Comprobacion: la accion no ha terminado
     if ($accion['completada'] != 0) {
         Yii::app()->user->setFlash('acabada', 'La acción ya ha acabado.');
         throw new Exception('La acción ya ha acabado.');
     }
     // id_usuario y recursos
     $id_user = Yii::app()->user->usIdent;
     $recursosUsuario = Recursos::model()->findByAttributes(array('usuarios_id_usuario' => $id_user));
     if ($recursosUsuario === null) {
         //Comprobación de seguridad
         Yii::app()->user->setFlash('recursos', 'No se puede obtener el modelo de recursos. (actionParticipar,AccionesController).');
         throw new Exception('No se puede obtener el modelo de recursos.');
     }
     $dineroUsuario = $recursosUsuario['dinero'];
     $influenciasUsuario = $recursosUsuario['influencias'];
     $animoUsuario = $recursosUsuario['animo'];
     $dineroAportado = $recursosAportados['dinero_nuevo'];
     $animoAportado = $recursosAportados['animo_nuevo'];
     $influenciasAportadas = $recursosAportados['influencia_nueva'];
     // Se actualiza la participacion
     $participacion->setAttributes(array('dinero_nuevo' => $dineroAportado, 'animo_nuevo' => $animoAportado, 'influencia_nueva' => $influenciasAportadas));
     // 3) Comprobacion: el usuario tiene suficientes recursos
     if ($dineroAportado > $dineroUsuario || $animoAportado > $animoUsuario || $influenciasAportadas > $influenciasUsuario) {
         //No tiene suficientes recursos
         Yii::app()->user->setFlash('recursos', 'No tienes suficientes recursos.');
         throw new Exception('No tienes suficientes recursos.');
     }
     // 4) Comprobacion: los recursos aportados no sobrepasan los que faltan para terminar la acción
     $dineroAportado = min($dineroAportado, $habilidad['dinero_max'] - $accion['dinero_acc']);
     $animoAportado = min($animoAportado, $habilidad['animo_max'] - $accion['animo_acc']);
     $influenciasAportadas = min($influenciasAportadas, $habilidad['influencias_max'] - $accion['influencias_acc']);
     // 5) Comprobacion: error al actualizar la participacion en la base de datos
     if ($dineroAportado < 0 || $animoAportado < 0 || $influenciasAportadas < 0) {
         if ($habilidad['dinero_max'] < $accion['dinero_acc']) {
             Yii::log('[DATABASE_ERROR] La accion ' . $id_accion . ' más dinero del maximo (' . $accion['dinero_acc'] . '/' . $habilidad['dinero_max'] . ').', 'error');
             Yii::app()->user->setFlash('base_datos', 'Error en la base de datos. Pongase en contacto con un administrador.');
             throw new Exception('Error en la BBDD.');
         } elseif ($habilidad['animo_max'] < $accion['animo_acc']) {
             Yii::log('[DATABASE_ERROR] La accion ' . $id_accion . ' más animo del maximo (' . $accion['animo_acc'] . '/' . $habilidad['animo_max'] . ').', 'error');
             Yii::app()->user->setFlash('base_datos', 'Error en la base de datos. Pongase en contacto con un administrador.');
             throw new Exception('Error en la BBDD.');
         } elseif ($habilidad['influencias_max'] < $accion['influencias_acc']) {
             Yii::log('[DATABASE_ERROR] La accion ' . $id_accion . ' más influencia del maximo (' . $accion['influencias_acc'] . '/' . $habilidad['influencias_max'] . ').', 'error');
             Yii::app()->user->setFlash('base_datos', 'Error en la base de datos. Pongase en contacto con un administrador.');
             throw new Exception('Error en la BBDD.');
         }
         Yii::log('[MALICIOUS_REQUEST] El usuario ' . $id_user . ' se ha saltado una validación de seguridad, intentando robar recursos de la accion ' . $id_accion, 'warning');
         Yii::app()->user->setFlash('aviso', 'Se ha registrado un intento de ataque al sistema. De no ser así, póngase en contacto con el administrador. Ten cuidado o acabarás baneado.');
         throw new Exception('El usuario se ha saltado una validación.');
     }
     //6 ) Comprobacion: la participacion es vacia (ignorarla)
     if ($dineroAportado == 0 && $animoAportado == 0 && $influenciasAportadas == 0) {
         Yii::app()->user->setFlash('aporte', 'No has aportado nada a la acción.');
         throw new Exception('No has aportado nada a la acción.');
     }
     // Actualizar los recursos del user
     $recursosUsuario['dinero'] = $dineroUsuario - $dineroAportado;
     $recursosUsuario['animo'] = $animoUsuario - $animoAportado;
     $recursosUsuario['influencias'] = $influenciasUsuario - $influenciasAportadas;
     $recursosUsuario['influencias_bloqueadas'] += $influenciasAportadas;
     $recursosUsuario->save();
     // Actualizar la experiencia acumulada del usuario
     $usuario = Usuarios::model()->findByPk($id_user);
     if ($usuario === null) {
         //Comprobación de seguridad
         Yii::log('[DATABASE_ERROR] La accion ' . $id_accion . ' No se encuentra el usuario (' . $id_user . ').', 'error');
         Yii::app()->user->setFlash('base_datos', 'Error en la base de datos. Pongase en contacto con un administrador.');
         throw new Exception('Error en la BBDD.');
     }
     $exp_ganada = (int) ($dineroAportado * Usuarios::MOD_EXP_DINERO + $animoAportado * Usuarios::MOD_EXP_ANIMO + $influenciasAportadas * Usuarios::MOD_EXP_INFLUENCIAS);
     $usuario->sumarExp($exp_ganada);
     // Actualizar la acciones_grupales
     $accion['dinero_acc'] += $dineroAportado;
     $accion['influencias_acc'] += $influenciasAportadas;
     $accion['animo_acc'] += $animoAportado;
     if ($nuevo_participante) {
         $accion['jugadores_acc'] += 1;
     }
     if ($accion['dinero_acc'] == $habilidad['dinero_max'] && $accion['influencias_acc'] == $habilidad['influencias_max'] && $accion['animo_acc'] == $habilidad['animo_max']) {
         $accion['completada'] = 1;
     }
     // Actualizar la participación
     if ($nuevo_participante) {
         $participacion['dinero_aportado'] = $dineroAportado;
         $participacion['influencias_aportadas'] = $influenciasAportadas;
         $participacion['animo_aportado'] = $animoAportado;
         $participacion->save();
     } else {
         $n = $participacion->updateAll(array('dinero_aportado' => $participacion['dinero_aportado'] + $dineroAportado, 'influencias_aportadas' => $participacion['influencias_aportadas'] + $influenciasAportadas, 'animo_aportado' => $participacion['animo_aportado'] + $animoAportado), "acciones_grupales_id_accion_grupal=:id_accion && usuarios_id_usuario=:id_user", array(':id_accion' => $id_accion, ':id_user' => $id_user));
         if ($n != 1) {
             //Si salta esto es que había más de una participación del mismo usuario en la acción
             Yii::log('[DATABASE_ERROR] El usuario ' . $id_user . ' tiene ' . $n . ' participaciones en la acción ' . $id_accion, 'error');
             Yii::app()->user->setFlash('base_datos', 'Error en la base de datos. Pongase en contacto con un administrador.');
             throw new Exception('Error en la BBDD.');
         }
     }
     // 1) Si la accion esta completada con esa aportacion
     //  - se ejecuta la accion
     //  - bonificacion de experencia a los participantes de la accion
     // 2) Se guardas los cambios en la accion
     if ($accion['completada'] == 1) {
         //Si se ha completado creamos una notificación
         $notificacion = new Notificaciones();
         $notificacion->fecha = time();
         $notificacion->mensaje = Usuarios::model()->findByPk($id_user)->nick . " ha completado la acción " . Habilidades::model()->findByPk($habilidad->id_habilidad)->nombre;
         $notificacion->imagen = "images/iconos/notificaciones/completa_grupal.png";
         $notificacion->save();
         //Enviamos la notificación a la afición
         $componentes = Usuarios::model()->findAllByAttributes(array('equipos_id_equipo' => Usuarios::model()->findByPk($id_user)->equipos_id_equipo));
         foreach ($componentes as $componente) {
             $usrnotif = new Usrnotif();
             $usrnotif->notificaciones_id_notificacion = $notificacion->id_notificacion;
             $usrnotif->usuarios_id_usuario = $componente->id_usuario;
             $usrnotif->save();
         }
         Yii::import('application.components.Acciones.*');
         $nombreHabilidad = $habilidad->codigo;
         //Llamar al singleton correspondiente y ejecutar dicha acción
         $nombreHabilidad::getInstance()->ejecutar($id_accion);
         // actualizar la exp de todos los participantes
         $participantes = $accion->participaciones;
         $u;
         foreach ($participantes as $p) {
             $u = Usuarios::model()->findByPk($p->usuarios_id_usuario);
             $u->sumarExp(Usuarios::MUCHA_EXP);
         }
     }
     $accion->save();
     if ($accion['completada'] == 1) {
         Yii::app()->user->setFlash('completada', '¡Enhorabuena, has completado la acción¡');
     } else {
         //si se ha aportado algo creamos notivicación
         $participaciones = Participaciones::model()->findAllByAttributes(array('acciones_grupales_id_accion_grupal' => $id_accion));
         //Si soy el unico en participar no creamos la notificacion
         if (count($participaciones) > 1) {
             $notificacion = new Notificaciones();
             $notificacion->fecha = time();
             $notificacion->mensaje = Usuarios::model()->findByPk($id_user)->nick . " ha participado en la acción " . Habilidades::model()->findByPk($habilidad->id_habilidad)->nombre;
             $notificacion->imagen = "images/iconos/notificaciones/participacion_grupal.png";
             $notificacion->save();
             //enviamos notificaciones a los participantes de la acción
             foreach ($participaciones as $participacion) {
                 if ($participacion->usuarios_id_usuario != $id_user) {
                     $usrnotif = new Usrnotif();
                     $usrnotif->notificaciones_id_notificacion = $notificacion->id_notificacion;
                     $usrnotif->usuarios_id_usuario = $participacion->usuarios_id_usuario;
                     //$habilidad->id_habilidad;//
                     $usrnotif->save();
                 }
             }
         }
         Yii::app()->user->setFlash('aporte', 'Tu equipo agradece tu generosa contribución.');
     }
 }
 /**
  * Permite participar en una accion grupal abierta por tu aficion.
  *
  * Muestra el formulario que define que recursos va a aportar a la accion que se recogen por $_POST 
  *
  * > El id del jugador se recoge de la variable de sesion
  * 
  * @param int $id_accion   id de la accion en la que se va a participar
  *
  * @route jugadorNum12/acciones/participar/{$id}
  * @redirect jugadorNum12/accion/participar/{$id_accion}
  * 
  * @throws \Exception      accion inexistente
  * @throws \Exception      habilidad inexistente
  * @throws \Excepcion      la accion no permite mas participantes
  * @throws \Excepcion      fallo en la transaccion
  *  
  * @return void
  */
 public function actionParticipar($id_accion)
 {
     // TODO: pasar logica al modelo
     /* Actualizar datos de usuario (recuros,individuales y grupales) */
     Usuarios::model()->actualizaDatos(Yii::app()->user->usIdent);
     /* Fin de actualización */
     // Saco el usuario
     $usuario = Yii::app()->user->usIdent;
     // Cojo la acción de la tabla acciones_grupales
     $accionGrupal = AccionesGrupales::model()->with('habilidades')->with('participaciones')->with('usuarios')->findByPk($id_accion);
     // Saco el propietario de la acción
     $propietarioAccion = $accionGrupal['usuarios_id_usuario'];
     //Iniciamos la transacción
     $transaccion = Yii::app()->db->beginTransaction();
     try {
         //Recojo los datos de la acción
         $accion = AccionesGrupales::model()->findByPK($id_accion);
         if ($accion === null) {
             Yii::app()->user->setFlash('accion', 'Acción inexistente.');
             throw new Exception('Acción inexistente.');
         }
         //Recojo los datos de la habilidad
         $habilidad = Habilidades::model()->findByPk($accion['habilidades_id_habilidad']);
         if ($habilidad == null) {
             Yii::app()->user->setFlash('habilidad', 'Habilidad inexistente.');
             throw new Exception('La habilidad no existe.');
         }
         //Saco el usuario que quiere participar en la acción
         $id_user = Yii::app()->user->usIdent;
         //Compuebo si el jugador ya ha participado en la acción
         $participacion = Participaciones::model()->findByAttributes(array('acciones_grupales_id_accion_grupal' => $id_accion, 'usuarios_id_usuario' => $id_user));
         $nuevo_participante = $participacion === null;
         if ($nuevo_participante) {
             //Compruebo que no se sobrepase el límite de jugadores
             if ($accion['jugadores_acc'] >= $habilidad['participantes_max']) {
                 Yii::app()->user->setFlash('participantes', 'La acción no permite más participantes.');
                 //$this-> redirect(array('acciones/index'));
                 throw new Exception('La acción no permite más participantes.');
             }
             //Saco el modelo que le voy a pasar a la vista
             $participacion = new Participaciones();
             $participacion['acciones_grupales_id_accion_grupal'] = $id_accion;
             $participacion['usuarios_id_usuario'] = $id_user;
         }
         $participacion->setScenario('participar');
         // Comprobar si hay recursos a aportar
         if (!isset($_POST['Participaciones'])) {
             $transaccion->rollback();
             //Petición GET: Muestro el formulario
             $this->render('participar', array('habilidad' => $habilidad, 'participacion' => $participacion, 'accion' => $accion, 'accionGrupal' => $accionGrupal, 'usuario' => $usuario, 'propietarioAccion' => $propietarioAccion));
             return;
         }
         //Petición POST
         $recursosAportados = $_POST['Participaciones'];
         // Llamar a función del modelo AccionesGrupales para participar en la misma
         AccionesGrupales::participar($id_accion, $recursosAportados, $accion, $habilidad, $participacion, $nuevo_participante);
         $transaccion->commit();
         $this->redirect(array('acciones/participar', 'id_accion' => $id_accion));
     } catch (Exception $exc) {
         $transaccion->rollback();
         $this->redirect(array('usuarios/index'));
         throw $exc;
     }
 }