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; } } }
/** * Usar una accion grupal * * @static * @param $usuario * @param $id_accion * @param $id_equipo * @param $res : recursos del jugador * @param $habilidad * @return int id de la nueva accion grupal */ public static function usarGrupal($usuario, $id_accion, $id_equipo, $res, $habilidad) { $id_usuario = $usuario->id_usuario; /* Se deberia obtener la accion grupal mediante su PK (id_accion_grupal) Como $id_accion equivale $id_habilidad por como se redirige desde acciones/index para obtener la accion grupal debo buscar por id_equipo y id_habilidad NOTA: no se contempla la posibilidad de en un mismo equipo haya varias acciones iguales pero con distinto creador (aunque dicha posibilidad existe) ya que debe arreglarse la redireccion */ $res['dinero'] -= $habilidad['dinero']; $res['animo'] -= $habilidad['animo']; $res['influencias'] -= $habilidad['influencias']; $res['influencias_bloqueadas'] += $habilidad['influencias']; //sumarselos al crear nueva accion grupal $accion_grupal = new AccionesGrupales(); $accion_grupal->setAttributes(array('usuarios_id_usuario' => $id_usuario, 'habilidades_id_habilidad' => $id_accion, 'equipos_id_equipo' => $id_equipo, 'influencias_acc' => $habilidad['influencias'], 'animo_acc' => $habilidad['animo'], 'dinero_acc' => $habilidad['dinero'], 'jugadores_acc' => 1, 'finalizacion' => $habilidad['cooldown_fin'] + time(), 'completada' => 0)); //guardar en los modelos $res->save(); $accion_grupal->save(); //Crear participación del creador $participacion = new Participaciones(); $participacion->acciones_grupales_id_accion_grupal = $accion_grupal->id_accion_grupal; $participacion->usuarios_id_usuario = $id_usuario; $participacion->dinero_aportado = $habilidad['dinero']; $participacion->influencias_aportadas = $habilidad['influencias']; $participacion->animo_aportado = $habilidad['animo']; if (!$participacion->save()) { Yii::app()->user->setFlash('error', 'Participación no creada. (AccionesController,actionUsar.'); throw new Exception("Participación no creada. (AccionesController,actionUsar)"); } //Enviamos la notificación correspondiente $notificacion = new Notificaciones(); $notificacion->fecha = time(); $notificacion->mensaje = Usuarios::model()->findByPk($id_usuario)->nick . " ha abierto la acción " . Habilidades::model()->findByPk($id_accion)->nombre; $notificacion->imagen = "images/iconos/notificaciones/nueva_grupal.png"; $notificacion->save(); //Enviamos la notificación a la afición $componentes = Usuarios::model()->findAllByAttributes(array('equipos_id_equipo' => $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(); } // EXP: sumar experencia al usuario $usuario->sumarExp(Usuarios::MEDIA_EXP); return $accion_grupal['id_accion_grupal']; }
/** * 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; } }