/** * Suplantando al usuario * @param string $id user->id */ public function index() { $admin = $_SESSION['user']; if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['id']) && !empty($_POST['impersonate'])) { $impersonator = $_SESSION['user']->id; session_unset(); $_SESSION['user'] = User::get($_POST['id']); $_SESSION['impersonating'] = true; $_SESSION['impersonator'] = $impersonator; unset($_SESSION['admin_menu']); /* * Evento Feed */ // Evento Feed $log = new Feed(); $log->setTarget($_SESSION['user']->id, 'user'); $log->populate('Suplantación usuario (admin)', '/admin/users', \vsprintf('El admin %s ha %s al usuario %s', array(Feed::item('user', $admin->name, $admin->id), Feed::item('relevant', 'Suplantado'), Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id)))); $log->doAdmin('user'); unset($log); throw new Redirection('/dashboard'); } else { Message::Error('Ha ocurrido un error'); throw new Redirection('/dashboard'); } }
public static function process($action = 'list', $id = null, $filters = array()) { $node = isset($_SESSION['admin_node']) ? $_SESSION['admin_node'] : \GOTEO_NODE; // métodos de pago $methods = Model\Invest::methods(); // estados del proyecto $status = Model\Project::status(); // estados de aporte $investStatus = Model\Invest::status(); // listado de proyectos $projects = Model\Invest::projects(false, $node); // usuarios cofinanciadores $users = Model\Invest::users(true); // campañas que tienen aportes $calls = Model\Invest::calls(); // extras $types = array('donative' => 'Solo los donativos', 'anonymous' => 'Solo los anónimos', 'manual' => 'Solo los manuales', 'campaign' => 'Solo con riego'); // detalles del aporte if ($action == 'details') { $invest = Model\Invest::get($id); $project = Model\Project::get($invest->project); $userData = Model\User::get($invest->user); if (!empty($invest->droped)) { $droped = Model\Invest::get($invest->droped); } else { $droped = null; } if ($project->node != $node) { throw new Redirection('/admin/invests'); } return new View('view/admin/index.html.php', array('folder' => 'invests', 'file' => 'details', 'invest' => $invest, 'project' => $project, 'user' => $userData, 'status' => $status, 'investStatus' => $investStatus, 'droped' => $droped, 'calls' => $calls)); } // listado de aportes if ($filters['filtered'] == 'yes') { if (!empty($filters['calls'])) { $filters['types'] = ''; } $list = Model\Invest::getList($filters, $node, 999); } else { $list = array(); } $viewData = array('folder' => 'invests', 'file' => 'list', 'list' => $list, 'filters' => $filters, 'projects' => $projects, 'users' => $users, 'calls' => $calls, 'methods' => $methods, 'types' => $types, 'investStatus' => $investStatus); return new View('view/admin/index.html.php', $viewData); }
public static function getAll($project, $filter = null) { /* * Estos son los filtros */ $filters = array('date' => Text::_('Fecha'), 'user' => Text::_('Usuario'), 'reward' => Text::_('Recompensa'), 'pending' => Text::_('Pendientes'), 'fulfilled' => Text::_('Cumplidos')); $invests = array(); $query = static::query("\n SELECT *\n FROM invest\n WHERE invest.project = ?\n AND invest.status IN ('0', '1', '3', '4')\n ", array($project)); foreach ($query->fetchAll(\PDO::FETCH_CLASS, __CLASS__) as $invest) { // datos del usuario $invest->user = User::get($invest->user); $query = static::query("\n SELECT *\n FROM invest_reward\n INNER JOIN reward\n ON invest_reward.reward = reward.id\n WHERE invest_reward.invest = ?\n ", array($invest->id)); $invest->rewards = $query->fetchAll(\PDO::FETCH_OBJ); $query = static::query("\n SELECT address, zipcode, location, country\n FROM invest_address\n WHERE invest_address.invest = ?\n ", array($invest->id)); $invest->address = $query->fetchObject(); // si no tiene dirección, sacamos la dirección del usuario if (empty($invest->address)) { $usr_address = User::getPersonal($invest->user->id); $invest->address = $usr_address; } $invests[$invest->id] = $invest; } return $invests; }
public static function process($action = 'list', $id = null, $filters = array()) { $errors = array(); // reubicando aporte, if ($action == 'move') { // el aporte original $original = Model\Invest::get($id); $userData = Model\User::getMini($original->user); $projectData = Model\Project::getMini($original->project); //el original tiene que ser de tpv o cash y estar como 'cargo ejecutado' if ($original->method == 'paypal' || $original->status != 1) { Message::Error('No se puede reubicar este aporte!'); throw new Redirection('/admin/accounts'); } // generar aporte manual y caducar el original if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['move'])) { // si falta proyecto, error $projectNew = $_POST['project']; // @TODO a saber si le toca dinero de alguna convocatoria $campaign = null; $invest = new Model\Invest(array('amount' => $original->amount, 'user' => $original->user, 'project' => $projectNew, 'account' => $userData->email, 'method' => 'cash', 'status' => '1', 'invested' => date('Y-m-d'), 'charged' => $original->charged, 'anonymous' => $original->anonymous, 'resign' => $original->resign, 'admin' => $_SESSION['user']->id, 'campaign' => $campaign)); //@TODO si el proyecto seleccionado if ($invest->save($errors)) { //recompensas que le tocan (si no era resign) if (!$original->resign) { // sacar recompensas $rewards = Model\Project\Reward::getAll($projectNew, 'individual'); foreach ($rewards as $rewId => $rewData) { $invest->setReward($rewId); //asignar } } // cambio estado del aporte original a 'Reubicado' (no aparece en cofinanciadores) // si tuviera que aparecer lo marcaríamos como caducado if ($original->setStatus('5')) { // Evento Feed $log = new Feed(); $log->setTarget($projectData->id); $log->populate('Aporte reubicado', '/admin/accounts', \vsprintf("%s ha aportado %s al proyecto %s en nombre de %s", array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('money', $_POST['amount'] . ' €'), Feed::item('project', $projectData->name, $projectData->id), Feed::item('user', $userData->name, $userData->id)))); $log->doAdmin('money'); unset($log); Message::Info('Aporte reubicado correctamente'); throw new Redirection('/admin/accounts'); } else { $errors[] = 'A fallado al cambiar el estado del aporte original (' . $original->id . ')'; } } else { $errors[] = 'Ha fallado algo al reubicar el aporte'; } } $viewData = array('folder' => 'accounts', 'file' => 'move', 'original' => $original, 'user' => $userData, 'project' => $projectData); return new View('view/admin/index.html.php', $viewData); // fin de la historia dereubicar } // cambiando estado del aporte aporte, if ($action == 'update') { // el aporte original $invest = Model\Invest::get($id); if (!$invest instanceof Model\Invest) { Message::Error('No tenemos registro del aporte ' . $id); throw new Redirection('/admin/accounts'); } $status = Model\Invest::status(); $new = isset($_POST['status']) ? $_POST['status'] : null; if ($invest->issue && $_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['update']) && $_POST['resolve'] == 1) { Model\Invest::unsetIssue($id); Model\Invest::setDetail($id, 'issue-solved', 'La incidencia se ha dado por resuelta por el usuario ' . $_SESSION['user']->name); Message::Info('La incidencia se ha dado por resuelta'); } if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['update']) && isset($new) && isset($status[$new])) { if ($new != $invest->status) { if (Model\Invest::query("UPDATE invest SET status=:status WHERE id=:id", array(':id' => $id, ':status' => $new))) { Model\Invest::setDetail($id, 'status-change' . rand(0, 9999), 'El admin ' . $_SESSION['user']->name . ' ha cambiado el estado del apote a ' . $status[$new]); Message::Info('Se ha actualizado el estado del aporte'); } else { Message::Error('Ha fallado al actualizar el estado del aporte'); } } else { Message::Error('No se ha cambiado el estado'); } throw new Redirection('/admin/accounts/details/' . $id); } return new View('view/admin/index.html.php', array('folder' => 'accounts', 'file' => 'update', 'invest' => $invest, 'status' => $status)); // fin de la historia actualizar estado } // resolviendo incidencias if ($action == 'solve') { // el aporte original $invest = Model\Invest::get($id); if (!$invest instanceof Model\Invest) { Message::Error('No tenemos registro del aporte ' . $id); throw new Redirection('/admin/accounts'); } $projectData = Model\Project::getMini($invest->project); $errors = array(); // primero cancelar switch ($invest->method) { case 'paypal': $err = array(); if (Paypal::cancelPreapproval($invest, $err)) { $errors[] = 'Preaproval paypal cancelado.'; $log_text = "El admin %s ha cancelado aporte y preapproval de %s de %s mediante PayPal (id: %s) al proyecto %s del dia %s"; } else { $txt_errors = implode('; ', $err); $errors[] = 'Fallo al cancelar el preapproval en paypal: ' . $txt_errors; $log_text = "El admin %s ha fallado al cancelar el aporte de %s de %s mediante PayPal (id: %s) al proyecto %s del dia %s. <br />Se han dado los siguientes errores: {$txt_errors}"; if ($invest->cancel()) { $errors[] = 'Aporte cancelado'; } else { $errors[] = 'Fallo al cancelar el aporte'; } } break; case 'tpv': $err = array(); if (Tpv::cancelPreapproval($invest, $err)) { $txt_errors = implode('; ', $err); $errors[] = 'Aporte cancelado correctamente. ' . $txt_errors; $log_text = "El admin %s ha anulado el cargo tpv de %s de %s mediante TPV (id: %s) al proyecto %s del dia %s"; } else { $txt_errors = implode('; ', $err); $errors[] = 'Fallo en la operación. ' . $txt_errors; $log_text = "El admin %s ha fallado al solicitar la cancelación del cargo tpv de %s de %s mediante TPV (id: %s) al proyecto %s del dia %s. <br />Se han dado los siguientes errores: {$txt_errors}"; } break; case 'cash': if ($invest->cancel()) { $log_text = "El admin %s ha cancelado aporte manual de %s de %s (id: %s) al proyecto %s del dia %s"; $errors[] = 'Aporte cancelado'; } else { $log_text = "El admin %s ha fallado al cancelar el aporte manual de %s de %s (id: %s) al proyecto %s del dia %s. "; $errors[] = 'Fallo al cancelar el aporte'; } break; } // Evento Feed $log = new Feed(); $log->setTarget($projectData->id); $log->populate('Cargo cancelado manualmente (admin)', '/admin/accounts', \vsprintf($log_text, array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('user', $userData->name, $userData->id), Feed::item('money', $invest->amount . ' €'), Feed::item('system', $invest->id), Feed::item('project', $projectData->name, $projectData->id), Feed::item('system', date('d/m/Y', strtotime($invest->invested)))))); $log->doAdmin(); unset($log); // luego resolver if ($invest->solve($errors)) { // Evento Feed $log = new Feed(); $log->setTarget($projectData->id); $log->populate('Incidencia resuelta (admin)', '/admin/accounts', \vsprintf("El admin %s ha dado por resuelta la incidencia con el botón \"Nos han hecho la transferencia\" para el aporte %s", array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('system', $id, 'accounts/details/' . $id)))); $log->doAdmin('admin'); unset($log); Message::Info('La incidencia se ha dado por resuelta, el aporte se ha pasado a manual y cobrado'); throw new Redirection('/admin/accounts'); } else { // Evento Feed $log = new Feed(); $log->setTarget($projectData->id); $log->populate('Fallo al resolver incidencia (admin)', '/admin/accounts', \vsprintf("Al admin %s le ha fallado el botón \"Nos han hecho la transferencia\" para el aporte %s", array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('system', $id, 'accounts/details/' . $id)))); $log->doAdmin('admin'); unset($log); Message::Error('Ha fallado al resolver la incidencia: ' . implode(',', $errors)); throw new Redirection('/admin/accounts/details/' . $id); } } // aportes manuales, cargamos la lista completa de usuarios, proyectos y campañas if ($action == 'add') { // listado de proyectos en campaña $projects = Model\Project::active(false, true); // usuarios $users = Model\User::getAllMini(); // campañas //@CALLSYS $calls = array(); // generar aporte manual if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['add'])) { $userData = Model\User::getMini($_POST['user']); $projectData = Model\Project::getMini($_POST['project']); $invest = new Model\Invest(array('amount' => $_POST['amount'], 'user' => $userData->id, 'project' => $projectData->id, 'account' => $userData->email, 'method' => 'cash', 'status' => '1', 'invested' => date('Y-m-d'), 'charged' => date('Y-m-d'), 'anonymous' => $_POST['anonymous'], 'resign' => 1, 'admin' => $_SESSION['user']->id)); //@CALLSYS if ($invest->save($errors)) { // Evento Feed $log = new Feed(); $log->setTarget($projectData->id); $log->populate('Aporte manual (admin)', '/admin/accounts', \vsprintf("%s ha aportado %s al proyecto %s en nombre de %s", array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('money', $_POST['amount'] . ' €'), Feed::item('project', $projectData->name, $projectData->id), Feed::item('user', $userData->name, $userData->id)))); $log->doAdmin('money'); unset($log); Model\Invest::setDetail($invest->id, 'admin-created', 'Este aporte ha sido creado manualmente por el admin ' . $_SESSION['user']->name); Message::Info('Aporte manual creado correctamente, seleccionar recompensa y dirección de entrega.'); throw new Redirection('/admin/rewards/edit/' . $invest->id); } else { $errors[] = 'Ha fallado algo al crear el aporte manual'; } } $viewData = array('folder' => 'accounts', 'file' => 'add', 'autocomplete' => true, 'users' => $users, 'projects' => $projects, 'calls' => $calls); return new View('view/admin/index.html.php', $viewData); // fin de la historia } // Informe de la financiación de un proyecto if ($action == 'report') { // estados de aporte $project = Model\Project::get($id); if (!$project instanceof Model\Project) { Message::Error('Instancia de proyecto no valida'); throw new Redirection('/admin/accounts'); } $invests = Model\Invest::getAll($id); $project->investors = Model\Invest::investors($id, false, true); $users = $project->agregateInvestors(); $investStatus = Model\Invest::status(); // Datos para el informe de transacciones correctas $Data = Model\Invest::getReportData($project->id, $project->status, $project->round, $project->passed); return new View('view/admin/index.html.php', array('folder' => 'accounts', 'file' => 'report', 'invests' => $invests, 'project' => $project, 'status' => $status, 'users' => $users, 'investStatus' => $investStatus, 'Data' => $Data)); } // cancelar aporte antes de ejecución, solo aportes no cargados if ($action == 'cancel') { $invest = Model\Invest::get($id); if (!$invest instanceof Model\Invest) { Message::Error('No tenemos objeto para el aporte ' . $id); throw new Redirection('/admin/accounts'); } $project = Model\Project::get($invest->project); $userData = Model\User::get($invest->user); if ($project->status > 3 && $project->status < 6) { $errors[] = 'No debería poderse cancelar un aporte cuando el proyecto ya está financiado. Si es imprescindible, hacerlo desde el panel de paypal o tpv'; break; } switch ($invest->method) { case 'paypal': $err = array(); if (Paypal::cancelPreapproval($invest, $err)) { $errors[] = 'Preaproval paypal cancelado.'; $log_text = "El admin %s ha cancelado aporte y preapproval de %s de %s mediante PayPal (id: %s) al proyecto %s del dia %s"; } else { $txt_errors = implode('; ', $err); $errors[] = 'Fallo al cancelar el preapproval en paypal: ' . $txt_errors; $log_text = "El admin %s ha fallado al cancelar el aporte de %s de %s mediante PayPal (id: %s) al proyecto %s del dia %s. <br />Se han dado los siguientes errores: {$txt_errors}"; if ($invest->cancel()) { $errors[] = 'Aporte cancelado'; } else { $errors[] = 'Fallo al cancelar el aporte'; } } break; case 'tpv': $err = array(); if (Tpv::cancelPreapproval($invest, $err)) { $txt_errors = implode('; ', $err); $errors[] = 'Aporte cancelado correctamente. ' . $txt_errors; $log_text = "El admin %s ha anulado el cargo tpv de %s de %s mediante TPV (id: %s) al proyecto %s del dia %s"; } else { $txt_errors = implode('; ', $err); $errors[] = 'Fallo en la operación. ' . $txt_errors; $log_text = "El admin %s ha fallado al solicitar la cancelación del cargo tpv de %s de %s mediante TPV (id: %s) al proyecto %s del dia %s. <br />Se han dado los siguientes errores: {$txt_errors}"; } break; case 'cash': if ($invest->cancel()) { $log_text = "El admin %s ha cancelado aporte manual de %s de %s (id: %s) al proyecto %s del dia %s"; $errors[] = 'Aporte cancelado'; } else { $log_text = "El admin %s ha fallado al cancelar el aporte manual de %s de %s (id: %s) al proyecto %s del dia %s. "; $errors[] = 'Fallo al cancelar el aporte'; } break; } // Evento Feed $log = new Feed(); $log->setTarget($project->id); $log->populate('Cargo cancelado manualmente (admin)', '/admin/accounts', \vsprintf($log_text, array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('user', $userData->name, $userData->id), Feed::item('money', $invest->amount . ' €'), Feed::item('system', $invest->id), Feed::item('project', $project->name, $project->id), Feed::item('system', date('d/m/Y', strtotime($invest->invested)))))); $log->doAdmin(); Model\Invest::setDetail($invest->id, 'manually-canceled', $log->html); unset($log); } // ejecutar cargo ahora!!, solo aportes no ejecutados // si esta pendiente, ejecutar el cargo ahora (como si fuera final de ronda), deja pendiente el pago secundario if ($action == 'execute' && $invest->status == 0) { $invest = Model\Invest::get($id); if (!$invest instanceof Model\Invest) { Message::Error('No tenemos objeto para el aporte ' . $id); throw new Redirection('/admin/accounts'); } $project = Model\Project::get($invest->project); $userData = Model\User::get($invest->user); switch ($invest->method) { case 'paypal': // a ver si tiene cuenta paypal $projectAccount = Model\Project\Account::get($invest->project); if (empty($projectAccount->paypal)) { // Erroraco! $errors[] = 'El proyecto no tiene cuenta paypal!!, ponersela en la seccion Contrato del dashboard del autor'; $log_text = null; // Evento Feed $log = new Feed(); $log->setTarget($project->id); $log->populate('proyecto sin cuenta paypal (admin)', '/admin/projects', \vsprintf('El proyecto %s aun no ha puesto su %s !!!', array(Feed::item('project', $project->name, $project->id), Feed::item('relevant', 'cuenta PayPal')))); $log->doAdmin('project'); unset($log); break; } $invest->account = $projectAccount->paypal; if (Paypal::pay($invest, $errors)) { $errors[] = 'Cargo paypal correcto'; $log_text = "El admin %s ha ejecutado el cargo a %s por su aporte de %s mediante PayPal (id: %s) al proyecto %s del dia %s"; $invest->status = 1; // si era incidencia la desmarcamos if ($invest->issue) { Model\Invest::unsetIssue($invest->id); Model\Invest::setDetail($invest->id, 'issue-solved', 'La incidencia se ha dado por resuelta al ejecutar el aporte manualmente por el admin ' . $_SESSION['user']->name); } } else { $txt_errors = implode('; ', $errors); $errors[] = 'Fallo al ejecutar cargo paypal: ' . $txt_errors . '<strong>POSIBLE INCIDENCIA NO COMUNICADA Y APORTE NO CANCELADO, HAY QUE TRATARLA MANUALMENTE</strong>'; $log_text = "El admin %s ha fallado al ejecutar el cargo a %s por su aporte de %s mediante PayPal (id: %s) al proyecto %s del dia %s. <br />Se han dado los siguientes errores: {$txt_errors}"; } break; case 'tpv': if (Tpv::pay($invest, $errors)) { $errors[] = 'Cargo sermepa correcto'; $log_text = "El admin %s ha ejecutado el cargo a %s por su aporte de %s mediante TPV (id: %s) al proyecto %s del dia %s"; $invest->status = 1; } else { $txt_errors = implode('; ', $errors); $errors[] = 'Fallo al ejecutar cargo sermepa: ' . $txt_errors; $log_text = "El admin %s ha fallado al ejecutar el cargo a %s por su aporte de %s mediante TPV (id: %s) al proyecto %s del dia %s <br />Se han dado los siguientes errores: {$txt_errors}"; } break; case 'cash': $invest->setStatus('1'); $errors[] = 'Aporte al contado, nada que ejecutar.'; $log_text = "El admin %s ha dado por ejecutado el aporte manual a nombre de %s por la cantidad de %s (id: %s) al proyecto %s del dia %s"; $invest->status = 1; break; } if (!empty($log_text)) { // Evento Feed $log = new Feed(); $log->setTarget($project->id); $log->populate('Cargo ejecutado manualmente (admin)', '/admin/accounts', \vsprintf($log_text, array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('user', $userData->name, $userData->id), Feed::item('money', $invest->amount . ' €'), Feed::item('system', $invest->id), Feed::item('project', $project->name, $project->id), Feed::item('system', date('d/m/Y', strtotime($invest->invested)))))); $log->doAdmin(); Model\Invest::setDetail($invest->id, 'manually-executed', $log->html); unset($log); } } // visor de logs if ($action == 'viewer') { return new View('view/admin/index.html.php', array('folder' => 'accounts', 'file' => 'viewer')); } if ($action == 'resign' && !empty($id) && $_GET['token'] == md5('resign')) { if ($invest->setResign(true)) { Model\Invest::setDetail($invest->id, 'manually-resigned', 'Se ha marcado como donativo independientemente de las recompensas'); throw new Redirection('/admin/accounts/detail/' . $invest->id); } else { $errors[] = 'Ha fallado al marcar donativo'; } } if (!empty($errors)) { Message::Error(implode('<br />', $errors)); } // tipos de aporte $methods = Model\Invest::methods(); // estados del proyecto $status = Model\Project::status(); $procStatus = Model\Project::procStatus(); // estados de aporte $investStatus = Model\Invest::status(); // listado de proyectos $projects = Model\Invest::projects(); // usuarios cofinanciadores $users = Model\Invest::users(true); // campañas que tienen aportes $calls = Model\Invest::calls(); // extras $types = array('donative' => 'Solo los donativos', 'anonymous' => 'Solo los anónimos', 'manual' => 'Solo los manuales', 'campaign' => 'Solo con riego'); // filtros de revisión de proyecto $review = array('collect' => 'Recaudado', 'paypal' => 'Rev. PayPal', 'tpv' => 'Rev. TPV', 'online' => 'Pagos Online'); $issue = array('show' => 'Solamente las incidencias', 'hide' => 'Ocultar las incidencias'); /// detalles de una transaccion if ($action == 'details') { $invest = Model\Invest::get($id); $project = Model\Project::get($invest->project); $userData = Model\User::get($invest->user); return new View('view/admin/index.html.php', array('folder' => 'accounts', 'file' => 'details', 'invest' => $invest, 'project' => $project, 'user' => $userData, 'details' => $details, 'status' => $status, 'investStatus' => $investStatus)); } // listado de aportes if ($filters['filtered'] == 'yes') { $list = Model\Invest::getList($filters, null, 999); } else { $list = array(); } $viewData = array('folder' => 'accounts', 'file' => 'list', 'list' => $list, 'filters' => $filters, 'users' => $users, 'projects' => $projects, 'calls' => $calls, 'review' => $review, 'methods' => $methods, 'types' => $types, 'status' => $status, 'procStatus' => $procStatus, 'issue' => $issue, 'investStatus' => $investStatus); return new View('view/admin/index.html.php', $viewData); }
public static function shareAll($category) { $array = array(); try { $values = array(':interest' => $category); $sql = "SELECT DISTINCT(user_interest.user) as id\n FROM user_interest\n INNER JOIN user\n ON user.id = user_interest.user\n AND (user.hide = 0 OR user.hide IS NULL)\n WHERE user_interest.interest = :interest\n "; $query = static::query($sql, $values); $shares = $query->fetchAll(\PDO::FETCH_ASSOC); foreach ($shares as $share) { // nombre i avatar $user = \Goteo\Model\User::get($share['id']); if (empty($user->avatar)) { $user->avatar = (object) array('id' => 1); } // meritocracia $support = (object) $user->support; // proyectos publicados $query = self::query('SELECT COUNT(id) FROM project WHERE owner = ? AND status > 2', array($share['id'])); $projects = $query->fetchColumn(0); $array[] = (object) array('user' => $share['id'], 'avatar' => $user->avatar, 'name' => $user->name, 'projects' => $projects, 'invests' => $support->invests); } return $array; } catch (\PDOException $e) { throw new \Goteo\Core\Exception($e->getMessage()); } }
private function process_userProfile(&$project, &$errors) { if (!isset($_POST['process_userProfile'])) { return false; } $user = Model\User::get($project->owner); // tratar la imagen y ponerla en la propiedad avatar // __FILES__ $fields = array('user_name' => 'name', 'user_location' => 'location', 'user_avatar' => 'avatar', 'user_about' => 'about', 'user_facebook' => 'facebook', 'user_google' => 'google', 'user_twitter' => 'twitter', 'user_identica' => 'identica', 'user_linkedin' => 'linkedin'); foreach ($fields as $fieldPost => $fieldTable) { if (isset($_POST[$fieldPost])) { $user->{$fieldTable} = $_POST[$fieldPost]; } } // Avatar if (isset($_FILES['avatar_upload']) && $_FILES['avatar_upload']['error'] != UPLOAD_ERR_NO_FILE) { $user->avatar = $_FILES['avatar_upload']; } // tratar si quitan la imagen if (!empty($_POST['avatar-' . $user->avatar->id . '-remove'])) { $user->avatar->remove(); $user->avatar = null; } $user->interests = $_POST['user_interests']; //tratar webs existentes foreach ($user->webs as $i => &$web) { // luego aplicar los cambios if (isset($_POST['web-' . $web->id . '-url'])) { $web->url = $_POST['web-' . $web->id . '-url']; } //quitar las que quiten if (!empty($_POST['web-' . $web->id . '-remove'])) { unset($user->webs[$i]); } } //tratar nueva web if (!empty($_POST['web-add'])) { $user->webs[] = new Model\User\Web(array('url' => 'http://')); } /// este es el único save que se lanza desde un metodo process_ $user->save($project->errors['userProfile']); // si hay errores en la imagen hay que mostrarlos if (!empty($project->errors['userProfile']['image'])) { $project->errors['userProfile']['avatar'] = $project->errors['userProfile']['image']; } $user = Model\User::flush(); $project->user = $user; return true; }
public static function process($action = 'list', $id = null, $filters = array(), $subaction = '') { // @NODESYS $nodes = array(); // @NODESYS $node = \GOTEO_NODE; $errors = array(); switch ($action) { case 'add': // si llega post: creamos if ($_SERVER['REQUEST_METHOD'] == 'POST') { // para crear se usa el mismo método save del modelo, hay que montar el objeto $user = new Model\User(); $user->userid = $_POST['userid']; $user->name = $_POST['name']; $user->email = $_POST['email']; $user->password = $_POST['password']; $user->node = !empty($_POST['node']) ? $_POST['node'] : \GOTEO_NODE; if (isset($_SESSION['admin_node']) && $user->node != $_SESSION['admin_node']) { $user->node = $_SESSION['admin_node']; } $user->save($errors); if (empty($errors)) { // mensaje de ok y volvemos a la lista de usuarios Message::Info(Text::get('user-register-success')); throw new Redirection('/admin/users/manage/' . $user->id); } else { // si hay algun error volvemos a poner los datos en el formulario $data = $_POST; Message::Error(implode('<br />', $errors)); } } // vista de crear usuario return new View('view/admin/index.html.php', array('folder' => 'users', 'file' => 'add', 'data' => $data, 'nodes' => $nodes)); break; case 'edit': $user = Model\User::get($id); // si llega post: actualizamos if ($_SERVER['REQUEST_METHOD'] == 'POST') { $tocado = array(); // para crear se usa el mismo método save del modelo, hay que montar el objeto if (!empty($_POST['email'])) { $user->email = $_POST['email']; $tocado[] = Text::_('el email'); } if (!empty($_POST['password'])) { $user->password = $_POST['password']; $tocado[] = Text::_('la contraseña'); } if (!empty($tocado) && $user->update($errors)) { // Evento Feed $log = new Feed(); $log->setTarget($user->id, 'user'); $log->populate(Text::_('Operación sobre usuario'), '/admin/users', \vsprintf('El admin %s ha %s del usuario %s', array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('relevant', 'Tocado ' . implode(' y ', $tocado)), Feed::item('user', $user->name, $user->id)))); $log->doAdmin('user'); unset($log); // mensaje de ok y volvemos a la lista de usuarios Message::Info(Text::_('Datos actualizados')); throw new Redirection('/admin/users'); } else { // si hay algun error volvemos a poner los datos en el formulario $data = $_POST; Message::Error(Text::_('No se ha guardado correctamente. ') . implode('<br />', $errors)); } } // vista de editar usuario return new View('view/admin/index.html.php', array('folder' => 'users', 'file' => 'edit', 'user' => $user, 'data' => $data, 'nodes' => $nodes)); break; case 'manage': // si llega post: ejecutamos + mensaje + seguimos editando // operación y acción para el feed $mngSa = static::_manageSubAct(); $sql = $mngSa[$subaction]['sql']; $log_action = $mngSa[$subaction]['log']; if (!empty($sql)) { $user = Model\User::getMini($id); if (Model\User::query($sql, array(':user' => $id))) { // mensaje de ok y volvemos a la gestion del usuario // Message::Info('Ha <strong>' . $log_action . '</strong> al usuario <strong>'.$user->name.'</strong> CORRECTAMENTE'); $log_text = 'El admin %s ha %s al usuario %s'; // procesos adicionales switch ($subaction) { case 'admin': case 'noadmin': // @NODESYS : this admin/noadmin subactions are here for NODESYS module extra break; case 'translator': // le ponemos todos los idiomas (excepto el español) $sql = "INSERT INTO user_translang (user, lang) SELECT '{$id}' as user, id as lang FROM `lang` WHERE id != 'es'"; Model\User::query($sql); break; case 'notranslator': // quitamos los idiomas $sql = "DELETE FROM user_translang WHERE user = :user"; Model\User::query($sql, array(':user' => $id)); break; } } else { // mensaje de error y volvemos a la gestion del usuario Message::Error('Ha FALLADO cuando ha <strong>' . $log_action . '</strong> al usuario <strong>' . $id . '</strong>'); $log_text = 'Al admin %s le ha <strong>FALLADO</strong> cuando ha %s al usuario %s'; } // Evento Feed $log = new Feed(); $log->setTarget($user->id, 'user'); $log->populate(Text::_('Operación sobre usuario'), '/admin/users', \vsprintf($log_text, array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('relevant', $log_action), Feed::item('user', $user->name, $user->id)))); $log->doAdmin('user'); unset($log); throw new Redirection('/admin/users/manage/' . $id); } $user = Model\User::get($id); $viewData = array('folder' => 'users', 'file' => 'manage', 'user' => $user, 'nodes' => $nodes); $viewData['roles'] = Model\User::getRolesList(); $viewData['langs'] = Lang::getAll(); // quitamos el español unset($viewData['langs']['es']); // vista de gestión de usuario return new View('view/admin/index.html.php', $viewData); break; // aplicar idiomas // aplicar idiomas case 'translang': if (!isset($_POST['user'])) { Message::Error(Text::_('Hemos perdido de vista al usuario')); throw new Redirection('/admin/users'); } else { $user = $_POST['user']; } $sql = "DELETE FROM user_translang WHERE user = :user"; Model\User::query($sql, array(':user' => $user)); $anylang = false; foreach ($_POST as $key => $value) { if (\substr($key, 0, \strlen('lang_')) == 'lang_') { $sql = "INSERT INTO user_translang (user, lang) VALUES (:user, :lang)"; if (Model\User::query($sql, array(':user' => $user, ':lang' => $value))) { $anylang = true; } } } if (!$anylang) { Message::Error(Text::_('No se ha seleccionado ningún idioma, este usuario tendrá problemas en su panel de traducción!')); } else { Message::Info(Text::_('Se han aplicado al traductor los idiomas seleccionados')); } throw new Redirection('/admin/users/manage/' . $user); break; case 'impersonate': $user = Model\User::get($id); // vista de acceso a suplantación de usuario return new View('view/admin/index.html.php', array('folder' => 'users', 'file' => 'impersonate', 'user' => $user, 'nodes' => $nodes)); break; case 'move': $user = Model\User::get($id); if ($_SERVER['REQUEST_METHOD'] == 'POST') { $values = array(':id' => $id, ':node' => $_POST['node']); try { $sql = "UPDATE user SET node = :node WHERE id = :id"; if (Model\User::query($sql, $values)) { $log_text = 'El admin %s ha <span class="red">movido</span> el usuario %s al nodo %s'; } else { $log_text = 'Al admin %s le ha <span class="red">fallado al mover</span> el usuario %s al nodo %s'; } // Evento Feed $log = new Feed(); $log->setTarget($user->id, 'user'); $log->populate('User cambiado de nodo (admin)', '/admin/users', \vsprintf($log_text, array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('user', $user->name, $user->id), Feed::item('user', $nodes[$_POST['node']])))); Message::Error($log->html); $log->doAdmin('user'); unset($log); throw new Redirection('/admin/users'); } catch (\PDOException $e) { Message::Error("Ha fallado! " . $e->getMessage()); } } // vista de acceso a suplantación de usuario return new View('view/admin/index.html.php', array('folder' => 'users', 'file' => 'move', 'user' => $user, 'nodes' => $nodes)); break; case 'list': default: if (!empty($filters['filtered'])) { $users = Model\User::getAll($filters, $node); } else { $users = array(); } $status = array('active' => Text::_('Activo'), 'inactive' => Text::_('Inactivo')); $interests = Model\User\Interest::getAll(); $roles = Model\User::getRolesList(); $roles['user'] = Text::_('Solo usuario'); $types = array('creators' => Text::_('Impulsores'), 'investors' => Text::_('Cofinanciadores'), 'supporters' => Text::_('Colaboradores')); $orders = array('created' => Text::_('Fecha de alta'), 'name' => Text::_('Alias'), 'id' => Text::_('User'), 'amount' => Text::_('Cantidad'), 'projects' => Text::_('Proyectos')); // proyectos con aportes válidos $projects = Model\Invest::projects(true, $node); return new View('view/admin/index.html.php', array('folder' => 'users', 'file' => 'list', 'users' => $users, 'filters' => $filters, 'status' => $status, 'interests' => $interests, 'roles' => $roles, 'types' => $types, 'nodes' => $nodes, 'projects' => $projects, 'orders' => $orders)); break; } }
case 'continue': echo new View('view/m/project/widget/investMsg.html.php', array('message' => $step, 'user' => $user)), new View('view/m/project/widget/invest_redirect.html.php', array('project' => $project, 'personal' => $personalData, 'step' => $step, 'allowpp'=> $this['allowpp'])); break; case 'ok': echo new View('view/m/project/widget/investMsg.html.php', array('message' => $step, 'user' => $user)), new View('view/project/widget/spread.html.php',array('project' => $project)); //sacarlo de div#center $printSendMsg=true; break; case 'fail': echo new View('view/m/project/widget/investMsg.html.php', array('message' => $step, 'user' => User::get($_SESSION['user']->id))), new View('view/m/project/widget/invest.html.php', array('project' => $project, 'personal' => User::getPersonal($_SESSION['user']->id), 'allowpp'=> $this['allowpp'])); break; default: echo new View('view/m/project/widget/investMsg.html.php', array('message' => $step, 'user' => $user)), new View('view/m/project/widget/invest.html.php', array('project' => $project, 'personal' => $personalData, 'step' => $step, 'allowpp'=> $this['allowpp'])); break; } } else { echo new View('view/m/project/widget/supporters.html.php', $this), new View('view/m/worth/legend.html.php'); } break;
/** * Recuperacion de contraseña * - Si no llega nada, mostrar formulario para que pongan su username y el email correspondiente * - Si llega post es una peticion, comprobar que el username y el email que han puesto son válidos * si no lo son, dejarlos en el formulario y mensaje de error * si son válidos, enviar email con la url y mensaje de ok * * - Si llega un hash, verificar y darle acceso hasta su dashboard /profile/access para que la cambien * * @param string $token Codigo */ public function recover($token = null) { // si el token mola, logueo este usuario y lo llevo a su dashboard if (!empty($token)) { $token = base64_decode($token); $parts = explode('¬', $token); if (count($parts) > 1) { $query = Model\User::query('SELECT id FROM user WHERE email = ? AND token = ?', array($parts[1], $token)); if ($id = $query->fetchColumn()) { if (!empty($id)) { // el token coincide con el email y he obtenido una id Model\User::query('UPDATE user SET active = 1 WHERE id = ?', array($id)); $user = Model\User::get($id); $_SESSION['user'] = $user; $_SESSION['recovering'] = $user->id; throw new Redirection(SEC_URL . '/dashboard/profile/access/recover#password'); } } } $error = Text::get('recover-token-incorrect'); } // password recovery only by email if ($_SERVER['REQUEST_METHOD'] === 'POST' && !empty($_POST['recover'])) { $email = $_POST['email']; if (!empty($email) && Model\User::recover($email)) { $message = Text::get('recover-email-sended'); unset($_POST['email']); } else { $error = Text::get('recover-request-fail'); } } return new View('view/user/recover.html.php', array('error' => $error, 'message' => $message)); }
public static function process($action = 'list', $id = null, $filters = array()) { $node = isset($_SESSION['admin_node']) ? $_SESSION['admin_node'] : \GOTEO_NODE; // métodos de pago $methods = Model\Invest::methods(); // estados del proyecto $status = Model\Project::status(); // estados de aporte $investStatus = Model\Invest::status(); // listado de proyectos $projects = Model\Invest::projects(false, $node); // usuarios cofinanciadores $users = Model\Invest::users(true); // campañas que tienen aportes $calls = Model\Invest::calls(); // extras $types = array('donative' => 'Solo los donativos', 'anonymous' => 'Solo los anónimos', 'manual' => 'Solo los manuales', 'campaign' => 'Solo con riego'); if ($action == 'csv') { $invest = Model\Invest::getPreapproval($id); foreach ($invest as $value) { $csv[] = array($value->id, $value->amount); } $fileName = "axes_" . date("YmdHis") . ".csv"; header("Content-Disposition: attachment; filename=\"{$filename}\""); header("Content-type: application/octet-stream"); header("Pragma: no-cache"); header("Expires: 0"); $fp = fopen('php://output', 'w'); foreach ($csv as $fields) { fputcsv($fp, $fields); } fclose($fp); exit; } if ($action == 'dopay') { $query = \Goteo\Core\Model::query("\n SELECT *\n FROM invest\n WHERE invest.project = ?\n AND (invest.status = 0\n OR (invest.method = 'tpv'\n AND invest.status = 1\n )\n OR (invest.method = 'cash'\n AND invest.status = 1\n )\n )\n AND (invest.campaign IS NULL OR invest.campaign = 0)\n ", array($id)); $invests = $query->fetchAll(\PDO::FETCH_CLASS, '\\Goteo\\Model\\Invest'); foreach ($invests as $key => $invest) { if ($invest->setPayment(date("YmdHis"))) { $invest->setStatus(1); Model\Invest::setDetail($invest->id, 'executed', 'Preapproval has been executed, has initiated the chained payment. Process cron / execute'); if ($invest->issue) { Model\Invest::unsetIssue($invest->id); Model\Invest::setDetail($invest->id, 'issue-solved', 'The incidence has been resolved upon success by the automatic process'); } } } Message::Info("処理しました"); throw new Redirection('/admin/projects/list'); exit; } // detalles del aporte if ($action == 'details') { $invest = Model\Invest::get($id); $project = Model\Project::get($invest->project); $userData = Model\User::get($invest->user); if (!empty($invest->droped)) { $droped = Model\Invest::get($invest->droped); } else { $droped = null; } if ($project->node != $node) { throw new Redirection('/admin/invests'); } return new View('view/admin/index.html.php', array('folder' => 'invests', 'file' => 'details', 'invest' => $invest, 'project' => $project, 'user' => $userData, 'status' => $status, 'investStatus' => $investStatus, 'droped' => $droped, 'calls' => $calls)); } // listado de aportes if ($filters['filtered'] == 'yes') { if (!empty($filters['calls'])) { $filters['types'] = ''; } $list = Model\Invest::getList($filters, $node, 999); } else { $list = array(); } $viewData = array('folder' => 'invests', 'file' => 'list', 'list' => $list, 'filters' => $filters, 'projects' => $projects, 'users' => $users, 'calls' => $calls, 'methods' => $methods, 'types' => $types, 'investStatus' => $investStatus); return new View('view/admin/index.html.php', $viewData); }
} break; case 'supporters': // segun el paso de aporte if (!empty($step) && in_array($step, array('start', 'login', 'confirm', 'continue', 'ok', 'fail'))) { switch ($step) { case 'continue': echo new View('view/project/widget/investMsg.html.php', array('message' => $step, 'user' => $user)), new View('view/project/widget/invest_redirect.html.php', array('project' => $project, 'personal' => $personalData, 'step' => $step, 'allowpp' => $this['allowpp'])); break; case 'ok': echo new View('view/project/widget/investMsg.html.php', array('message' => $step, 'user' => $user)), new View('view/project/widget/spread.html.php', array('project' => $project)); //sacarlo de div#center $printSendMsg = true; break; case 'fail': echo new View('view/project/widget/investMsg.html.php', array('message' => $step, 'user' => User::get($_SESSION['user']->id))), new View('view/project/widget/invest.html.php', array('project' => $project, 'personal' => User::getPersonal($_SESSION['user']->id), 'allowpp' => $this['allowpp'])); break; default: echo new View('view/project/widget/investMsg.html.php', array('message' => $step, 'user' => $user)), new View('view/project/widget/invest.html.php', array('project' => $project, 'personal' => $personalData, 'step' => $step, 'allowpp' => $this['allowpp'])); break; } } else { echo new View('view/project/widget/supporters.html.php', $this), new View('view/worth/legend.html.php'); } break; case 'messages': echo new View('view/project/widget/messages.html.php', array('project' => $project)); break; case 'rewards': echo new View('view/project/widget/rewards-summary.html.php', array('project' => $project)); break;
public function translates($option = 'overview', $action = 'list', $id = null) { $user = $_SESSION['user']; $errors = array(); $langs = \Goteo\Library\i18n\Lang::getAll(); if ($action == 'lang' && !empty($_POST['lang'])) { $_SESSION['translate_lang'] = $_POST['lang']; } elseif (empty($_SESSION['translate_lang'])) { $_SESSION['translate_lang'] = 'en'; } $projects = Model\User\Translate::getMyProjects($user->id); // al seleccionar controlamos: translate_type if ($action == 'select' && !empty($_POST['type'])) { unset($_SESSION['translate_project']); // quitamos el proyecto de traducción $type = $_POST['type']; if (!empty($_POST[$type])) { $_SESSION['translate_type'] = $type; $_SESSION['translate_' . $type] = $_POST[$type]; } else { $_SESSION['translate_type'] = 'profile'; } } // view data basico para esta seccion $viewData = array('menu' => self::menu(), 'section' => __FUNCTION__, 'option' => $option, 'action' => $action, 'langs' => $langs, 'projects' => $projects, 'errors' => $errors, 'success' => $success); // aqui, segun lo que este traduciendo, necesito tener un proyecto de trabajo, una convocatoria o mi perfil personal switch ($_SESSION['translate_type']) { case 'project': try { // si lo que tenemos en sesion no es una instancia de proyecto (es una id de proyecto) if ($_SESSION['translate_project'] instanceof Model\Project) { $project = Model\Project::get($_SESSION['translate_project']->id, $_SESSION['translate_lang']); } else { $project = Model\Project::get($_SESSION['translate_project'], $_SESSION['translate_lang']); } } catch (\Goteo\Core\Error $e) { $project = null; } if (!$project instanceof Model\Project) { Message::Error('Ha fallado al cargar los datos del proyecto'); $_SESSION['translate_type'] = 'profile'; throw new Redirection('/dashboard/translates'); } $_SESSION['translate_project'] = $project; $project->lang_name = $langs[$project->lang]->name; unset($viewData['langs'][$project->lang]); // quitamos el idioma original //// Control de traduccion de proyecto if ($option == 'updates') { // sus novedades $blog = Model\Blog::get($project->id); if ($action != 'edit') { $action = 'list'; } } // tratar lo que llega por post para guardar los datos if ($_SERVER['REQUEST_METHOD'] == 'POST') { switch ($option) { case 'profile': if ($action == 'save') { $user = Model\User::get($_POST['id'], $_SESSION['translate_lang']); $user->about_lang = $_POST['about']; $user->keywords_lang = $_POST['keywords']; $user->contribution_lang = $_POST['contribution']; $user->lang = $_SESSION['translate_lang']; $user->saveLang($errors); } break; case 'overview': if ($action == 'save') { $project->description_lang = $_POST['description']; $project->motivation_lang = $_POST['motivation']; $project->video_lang = $_POST['video']; $project->about_lang = $_POST['about']; $project->goal_lang = $_POST['goal']; $project->related_lang = $_POST['related']; $project->reward_lang = $_POST['reward']; $project->keywords_lang = $_POST['keywords']; $project->media_lang = $_POST['media']; $project->subtitle_lang = $_POST['subtitle']; $project->lang_lang = $_SESSION['translate_lang']; $project->saveLang($errors); } break; case 'costs': if ($action == 'save') { foreach ($project->costs as $key => $cost) { if (isset($_POST['cost-' . $cost->id . '-cost'])) { $cost->cost_lang = $_POST['cost-' . $cost->id . '-cost']; $cost->description_lang = $_POST['cost-' . $cost->id . '-description']; $cost->lang = $_SESSION['translate_lang']; $cost->saveLang($errors); } } } break; case 'rewards': if ($action == 'save') { foreach ($project->social_rewards as $k => $reward) { if (isset($_POST['social_reward-' . $reward->id . '-reward'])) { $reward->reward_lang = $_POST['social_reward-' . $reward->id . '-reward']; $reward->description_lang = $_POST['social_reward-' . $reward->id . '-description']; $reward->other_lang = $_POST['social_reward-' . $reward->id . '-other']; $reward->lang = $_SESSION['translate_lang']; $reward->saveLang($errors); } } foreach ($project->individual_rewards as $k => $reward) { if (isset($_POST['individual_reward-' . $reward->id . '-reward'])) { $reward->reward_lang = $_POST['individual_reward-' . $reward->id . '-reward']; $reward->description_lang = $_POST['individual_reward-' . $reward->id . '-description']; $reward->other_lang = $_POST['individual_reward-' . $reward->id . '-other']; $reward->lang = $_SESSION['translate_lang']; $reward->saveLang($errors); } } } break; case 'supports': if ($action == 'save') { // tratar colaboraciones existentes foreach ($project->supports as $key => $support) { if (isset($_POST['support-' . $support->id . '-support'])) { // guardamos los datos traducidos $support->support_lang = $_POST['support-' . $support->id . '-support']; $support->description_lang = $_POST['support-' . $support->id . '-description']; $support->lang = $_SESSION['translate_lang']; $support->saveLang($errors); // actualizar el Mensaje correspondiente, solamente actualizar $msg = Model\Message::get($support->thread); $msg->message_lang = "{$support->support_lang}: {$support->description_lang}"; $msg->lang = $_SESSION['translate_lang']; $msg->saveLang($errors); } } } break; case 'updates': if (empty($_POST['blog']) || empty($_POST['id'])) { break; } $post = Model\Blog\Post::get($_POST['id']); $post->title_lang = $_POST['title']; $post->text_lang = $_POST['text']; $post->media_lang = $_POST['media']; $post->legend_lang = $_POST['legend']; $post->lang = $_SESSION['translate_lang']; $post->saveLang($errors); $action = 'edit'; break; } } switch ($option) { case 'profile': $viewData['user'] = Model\User::get($project->owner, $_SESSION['translate_lang']); break; case 'overview': break; case 'costs': if ($_POST) { foreach ($_POST as $k => $v) { if (!empty($v) && preg_match('/cost-(\\d+)-edit/', $k, $r)) { $viewData[$k] = true; } } } break; case 'rewards': if ($_POST) { foreach ($_POST as $k => $v) { if (!empty($v) && preg_match('/((social)|(individual))_reward-(\\d+)-edit/', $k)) { $viewData[$k] = true; break; } } } break; case 'supports': if ($_POST) { foreach ($_POST as $k => $v) { if (!empty($v) && preg_match('/support-(\\d+)-edit/', $k, $r)) { $viewData[$k] = true; break; } } } break; // publicar actualizaciones // publicar actualizaciones case 'updates': $viewData['blog'] = $blog; if ($action == 'edit') { $post = Model\Blog\Post::get($id, $_SESSION['translate_lang']); $viewData['post'] = $post; } else { $posts = array(); foreach ($blog->posts as $post) { $posts[] = Model\Blog\Post::get($post->id, $_SESSION['translate_lang']); } $viewData['posts'] = $posts; } break; } $viewData['project'] = $project; //// FIN Control de traduccion de proyecto break; default: // profile $viewData['option'] = 'profile'; unset($langs['es']); if ($_SERVER['REQUEST_METHOD'] == 'POST') { if ($action == 'save') { $user = Model\User::get($_POST['id'], $_SESSION['translate_lang']); $user->about_lang = $_POST['about']; $user->keywords_lang = $_POST['keywords']; $user->contribution_lang = $_POST['contribution']; $user->lang = $_SESSION['translate_lang']; $user->saveLang($errors); } } $viewData['user'] = Model\User::get($user->id, $_SESSION['translate_lang']); } if (!empty($errors)) { Message::Error('HA HABIDO ERRORES: <br />' . implode('<br />', $errors)); } return new View('view/dashboard/index.html.php', $viewData); }
public static function get($id, $lang = null) { try { // metemos los datos del proyecto en la instancia $query = self::query("SELECT * FROM project WHERE id = ?", array(urldecode($id))); $project = $query->fetchObject(__CLASS__); if (!$project instanceof \Goteo\Model\Project) { throw new \Goteo\Core\Error('404', Text::html('fatal-error-project')); } // si recibimos lang y no es el idioma original del proyecto, ponemos la traducción y mantenemos para el resto de contenido if ($lang == $project->lang) { $lang = null; } elseif (!empty($lang)) { $sql = "\n SELECT\n IFNULL(project_lang.description, project.description) as description,\n IFNULL(project_lang.motivation, project.motivation) as motivation,\n IFNULL(project_lang.video, project.video) as video,\n IFNULL(project_lang.about, project.about) as about,\n IFNULL(project_lang.goal, project.goal) as goal,\n IFNULL(project_lang.related, project.related) as related,\n IFNULL(project_lang.reward, project.reward) as reward,\n IFNULL(project_lang.keywords, project.keywords) as keywords,\n IFNULL(project_lang.media, project.media) as media,\n IFNULL(project_lang.subtitle, project.subtitle) as subtitle,\n IFNULL(project_lang.evaluation, project.evaluation) as evaluation\n FROM project\n LEFT JOIN project_lang\n ON project_lang.id = project.id\n AND project_lang.lang = :lang\n WHERE project.id = :id\n "; $query = self::query($sql, array(':id' => $id, ':lang' => $lang)); foreach ($query->fetch(\PDO::FETCH_ASSOC) as $field => $value) { $project->{$field} = $value; } } if (isset($project->media)) { $project->media = new Project\Media($project->media); } if (isset($project->video)) { $project->video = new Project\Media($project->video); } // owner $project->user = User::get($project->owner, $lang); // galeria $project->gallery = Project\Image::getGallery($project->id); // imágenes por sección foreach (Project\Image::sections() as $sec => $val) { if ($sec != '') { $project->secGallery[$sec] = Project\Image::get($project->id, $sec); } } // categorias $project->categories = Project\Category::get($id); // skills $project->skills = Project\Skill::get($id); // costes y los sumammos $project->costs = Project\Cost::getAll($id, $lang); $project->minmax(); // retornos colectivos $project->social_rewards = Project\Reward::getAll($id, 'social', $lang); // retornos individuales $project->individual_rewards = Project\Reward::getAll($id, 'individual', $lang); // colaboraciones $project->supports = Project\Support::getAll($id, $lang); //----------------------------------------------------------------- // Diferentes verificaciones segun el estado del proyecto //----------------------------------------------------------------- $project->investors = Invest::investors($id); $project->num_investors = Invest::numInvestors($id); $amount = Invest::invested($id); if ($project->invested != $amount) { self::query("UPDATE project SET amount = '{$amount}' WHERE id = ?", array($id)); } $project->invested = $amount; $project->amount = $amount; //mensajes y mensajeros $messegers = array(); $project->messages = Message::getAll($id, $lang); $project->num_messages = 0; foreach ($project->messages as $msg) { $project->num_messages++; $project->num_messages += count($msg->responses); $messegers[$msg->user] = $msg->user; } $project->num_messegers = count($messegers); $project->setDays(); $project->setTagmark(); // fecha final primera ronda (fecha campaña + 40) if (!empty($project->published)) { $ptime = strtotime($project->published); $project->willpass = date('Y-m-d', \mktime(0, 0, 0, date('m', $ptime), date('d', $ptime) + 40, date('Y', $ptime))); } //----------------------------------------------------------------- // Fin de verificaciones //----------------------------------------------------------------- return $project; } catch (\PDOException $e) { throw new \Goteo\Core\Exception($e->getMessage()); } catch (\Goteo\Core\Error $e) { throw new \Goteo\Core\Error('404', Text::html('fatal-error-project')); } }
* the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Goteo is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with Goteo. If not, see <http://www.gnu.org/licenses/agpl.txt>. * */ use Goteo\Core\View, Goteo\Library\Text, Goteo\Library\SuperForm; $user = $this['user']; $errors = $this['errors']; $original = \Goteo\Model\User::get($user->id); $sfid = 'sf-project-profile'; ?> <?php if (isset($this['ownprofile'])) { ?> <div class="widget">Estas traduciendo tu perfil personal. <a href="/dashboard/translates/profile">Volver al perfil del autor del proyecto</a></div> <?php } elseif (!isset($this['noowner']) && $user->id != $_SESSION['user']->id && $_SESSION['user']->roles['translator']->id == 'translator') { ?> <div class="widget">Estas traduciendo el perfil del autor del proyecto. <a href="/dashboard/translates/profile/own">Traducir mi perfil personal</a></div> <?php } ?>
/** * @param $_param * @return false|Model\obj */ private function _get_user($_param) { if (!empty($_param)) { $_result = \Goteo\Model\User::get($_param, 'ja'); } return $_result; }
public function personal($user = null) { if (empty($user)) { throw new Redirection('/community', Redirection::PERMANENT); } if ($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['message'])) { // sacamos el mail del responsable del proyecto $user = Model\User::get($user); if (!$user instanceof Model\User) { throw new Redirection('/', Redirection::TEMPORARY); } $msg_content = \nl2br(\strip_tags($_POST['message'])); // Obtenemos la plantilla para asunto y contenido $template = Template::get(4); // Sustituimos los datos if (isset($_POST['subject']) && !empty($_POST['subject'])) { $subject = $_POST['subject']; } else { // En el asunto por defecto: %USERNAME% por $_SESSION['user']->name $subject = str_replace('%USERNAME%', $_SESSION['user']->name, $template->title); } $remite = $_SESSION['user']->name . ' ' . Text::get('regular-from') . ' '; $remite .= GOTEO_MAIL_NAME; $response_url = SITE_URL . '/user/profile/' . $_SESSION['user']->id . '/message'; $profile_url = SITE_URL . "/user/profile/{$user->id}/sharemates"; // En el contenido: nombre del destinatario -> %TONAME% por $user->name // el mensaje que ha escrito el usuario -> %MESSAGE% por $msg_content // nombre del usuario -> %USERNAME% por $_SESSION['user']->name // url del perfil -> %PROFILEURL% por ".SITE_URL."/user/profile/{$user->id}/sharemates" $search = array('%MESSAGE%', '%TONAME%', '%USERNAME%', '%PROFILEURL%', '%RESPONSEURL%'); $replace = array($msg_content, $user->name, $_SESSION['user']->name, $profile_url, $response_url); $content = \str_replace($search, $replace, $template->text); $mailHandler = new Mail(); $mailHandler->fromName = $remite; $mailHandler->to = $user->email; $mailHandler->toName = $user->name; // blind copy a goteo desactivado durante las verificaciones // $mailHandler->bcc = '*****@*****.**'; $mailHandler->subject = $subject; $mailHandler->content = $content; $mailHandler->html = true; $mailHandler->template = $template->id; if ($mailHandler->send($errors)) { // ok \Goteo\Library\Message::Info(Text::get('regular-message_success')); } else { \Goteo\Library\Message::Info(Text::get('regular-message_fail') . '<br />' . implode(', ', $errors)); } unset($mailHandler); } throw new Redirection("/user/profile/{$user->id}", Redirection::TEMPORARY); }
public function paid($id = null) { if ($_GET['result'] != 'ok') { die; } $id = $_GET['sendid']; if (empty($id)) { die; } // el aporte $invest = Model\Invest::get($id); if ($invest->status != "-1") { die; } $projectData = Model\Project::getMedium($invest->project); // para evitar las duplicaciones de feed y email if (isset($_SESSION['invest_' . $invest->id . '_completed'])) { die; } $user = Model\User::get($invest->user); // Paypal solo disponible si activado if ($invest->method == 'axes') { // hay que cambiarle el status a 0 $invest->setStatus('0'); // Evento Feed $log = new Feed(); $log->setTarget($projectData->id); $log->populate('Aporte Axes', '/admin/invests', \vsprintf("%s ha aportado %s al proyecto %s mediante PayPal", array(Feed::item('user', $user->name, $user->id), Feed::item('money', $invest->amount . ' ¥'), Feed::item('project', $projectData->name, $projectData->id)))); $log->doAdmin('money'); // evento público $log_html = Text::html('feed-invest', Feed::item('money', $invest->amount . ' ¥'), Feed::item('project', $projectData->name, $projectData->id)); if ($invest->anonymous) { $log->populate(Text::get('regular-anonymous'), '/user/profile/anonymous', $log_html, 1); } else { $log->populate($user->name, '/user/profile/' . $user->id, $log_html, $user->avatar->id); } $log->doPublic('community'); unset($log); } // fin segun metodo // texto recompensa // @TODO quitar esta lacra de N recompensas porque ya es solo una recompensa siempre $rewards = $invest->rewards; array_walk($rewards, function (&$reward) { $reward = $reward->reward; }); $txt_rewards = implode(', ', $rewards); // recaudado y porcentaje $amount = $projectData->invested; $percent = floor($projectData->invested / $projectData->mincost * 100); // email de agradecimiento al cofinanciador // primero monto el texto de recompensas //@TODO el concepto principal sería 'renuncia' (porque todos los aportes son donativos) if ($invest->resign) { // Plantilla de donativo segun la ronda if ($projectData->round == 2) { $template = Template::get(36); // en segunda ronda } else { $template = Template::get(28); // en primera ronda } } else { // plantilla de agradecimiento segun la ronda if ($projectData->round == 2) { $template = Template::get(34); // en segunda ronda } else { $template = Template::get(10); // en primera ronda } } // Dirección en el mail (y version para regalo) $txt_address = Text::get('invest-address-address-field') . ' ' . $invest->address->address; $txt_address .= '<br> ' . Text::get('invest-address-zipcode-field') . ' ' . $invest->address->zipcode; // $txt_address .= '<br> ' . Text::get('invest-address-location-field') . ' ' . $invest->address->location; // $txt_address .= '<br> ' . Text::get('invest-address-country-field') . ' ' . $invest->address->country; $txt_destaddr = $txt_address; $txt_address = Text::get('invest-mail_info-address') . '<br>' . $txt_address; // Agradecimiento al cofinanciador // Sustituimos los datos $subject = str_replace('%PROJECTNAME%', $projectData->name, $template->title); // En el contenido: $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%', '%AMOUNT%', '%REWARDS%', '%ADDRESS%'); $replace = array($user->name, $projectData->name, SITE_URL . '/project/' . $projectData->id, $confirm->amount, $txt_rewards, $txt_address); $content = \str_replace($search, $replace, $template->text); $mailHandler = new Mail(); $mailHandler->reply = GOTEO_CONTACT_MAIL; $mailHandler->replyName = GOTEO_MAIL_NAME; $mailHandler->to = $user->email; $mailHandler->toName = $user->name; $mailHandler->subject = $subject; $mailHandler->content = $content; $mailHandler->html = true; $mailHandler->template = $template->id; if ($mailHandler->send($errors)) { Message::Info(Text::get('project-invest-thanks_mail-success')); } else { Message::Error(Text::get('project-invest-thanks_mail-fail')); Message::Error(implode('<br />', $errors)); } unset($mailHandler); // Notificación al autor $template = Template::get(29); // Sustituimos los datos $subject = str_replace('%PROJECTNAME%', $projectData->name, $template->title); // En el contenido: $search = array('%OWNERNAME%', '%USERNAME%', '%PROJECTNAME%', '%SITEURL%', '%AMOUNT%', '%MESSAGEURL%'); $replace = array($projectData->user->name, $user->name, $projectData->name, SITE_URL, $invest->amount, SITE_URL . '/user/profile/' . $user->id . '/message'); $content = \str_replace($search, $replace, $template->text); $mailHandler = new Mail(); $mailHandler->to = $projectData->user->email; $mailHandler->toName = $projectData->user->name; $mailHandler->subject = $subject; $mailHandler->content = $content; $mailHandler->html = true; $mailHandler->template = $template->id; $mailHandler->send(); unset($mailHandler); // marcar que ya se ha completado el proceso de aportar $_SESSION['invest_' . $invest->id . '_completed'] = true; // log Model\Invest::setDetail($invest->id, 'confirmed', 'El usuario regresó a /invest/confirmed'); }