public function index($show = 'activity', $category = null) { if (defined('GOTEO_EASY') && \GOTEO_EASY === true) { throw new Redirection('/'); } $page = Page::get('community'); $items = array(); $shares = array(); if (!in_array($show, array('sharemates', 'activity'))) { $show = 'activity'; } $viewData = array('description' => $page->description, 'show' => $show); switch ($show) { // compartiendo intereses global case 'sharemates': $categories = Interest::getAll(); foreach ($categories as $catId => $catName) { $gente = Interest::shareAll($catId); if (count($gente) == 0) { continue; } $shares[$catId] = $gente; } $viewData['category'] = $category; $viewData['categories'] = $categories; $viewData['shares'] = $shares; // top ten cofinanciadores en Goteo $projects = Invest::projects(true); $investors = array(); foreach ($projects as $projectId => $projectName) { foreach (Invest::investors($projectId) as $key => $investor) { if (\array_key_exists($investor->user, $investors)) { // si es otro proyecto y ya está en el array, añadir uno if ($investors[$investor->user]->lastproject != $projectId) { ++$investors[$investor->user]->projects; $investors[$investor->user]->lastproject = $projectId; } $investors[$investor->user]->amount += $investor->amount; $investors[$investor->user]->date = $investor->date; } else { $investors[$investor->user] = (object) array('user' => $investor->user, 'name' => $investor->name, 'projects' => 1, 'lastproject' => $projectId, 'avatar' => $investor->avatar, 'worth' => $investor->worth, 'amount' => $investor->amount, 'date' => $investor->date); } } } $viewData['investors'] = $investors; break; // feed público // feed público case 'activity': $items = array(); $items['goteo'] = Feed::getAll('goteo', 'public', 50); $items['projects'] = Feed::getAll('projects', 'public', 50); $items['community'] = Feed::getAll('community', 'public', 50); $viewData['items'] = $items; break; } return new View('view/community.html.php', $viewData); }
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); }
/** * Perfil público de usuario. * * @param string $id Nombre de usuario */ public function profile($id, $show = 'profile', $category = null) { if (!in_array($show, array('profile', 'investors', 'sharemates', 'message'))) { $show = 'profile'; } $user = Model\User::get($id, LANG); if (!$user instanceof Model\User || $user->hide) { throw new Error('404', Text::html('fatal-error-user')); } //--- para usuarios públicos--- if (empty($_SESSION['user'])) { // la subpágina de mensaje también está restringida if ($show == 'message') { $_SESSION['jumpto'] = '/user/profile/' . $id . '/message'; Message::Info(Text::get('user-login-required-to_message')); throw new Redirection(SEC_URL . "/user/login"); } // a menos que este perfil sea de un vip, no pueden verlo if (!isset($user->roles['vip'])) { $_SESSION['jumpto'] = '/user/profile/' . $id . '/' . $show; Message::Info(Text::get('user-login-required-to_see')); throw new Redirection(SEC_URL . "/user/login"); } /* // subpágina de cofinanciadores if ($show == 'investors') { Message::Info(Text::get('user-login-required-to_see-supporters')); throw new Redirection('/user/profile/' . $id); } */ } //--- el resto pueden seguir --- // impulsor y usuario solamente pueden comunicarse si: if ($show == 'message') { $is_author = false; // si es autor de un proyecto publicado $is_investor = false; // si es cofinanciador $is_messeger = false; // si es participante // si el usuario logueado es impulsor (autro de proyecto publicado $user_created = Model\Project::ofmine($_SESSION['user']->id, true); if (!empty($user_created)) { $is_author = true; } // si el usuario del perfil es cofin. o partic. // proyectos que es cofinanciador este usuario (el del perfil) $user_invested = Model\User::invested($id, true); foreach ($user_invested as $a_project) { if ($a_project->owner == $_SESSION['user']->id) { $is_investor = true; break; } } // proyectos que es participante este usuario (el del perfil) (que ha enviado algún mensaje) $user_messeged = Model\Message::getMesseged($id, true); foreach ($user_messeged as $a_project) { if ($a_project->owner == $_SESSION['user']->id) { $is_messeger = true; break; } } // si el usuario logueado es el usuario cofin./partic. // si el usuario del perfil es impulsor de un proyecto cofinanciado o en el que ha participado // proyectos que es cofinanciador el usuario logueado $user_invested = Model\User::invested($_SESSION['user']->id, true); foreach ($user_invested as $a_project) { if ($a_project->owner == $id) { $is_investor = true; break; } } // proyectos que es participante el usuario logueado (que ha enviado algún mensaje) $user_messeged = Model\Message::getMesseged($_SESSION['user']->id, true); foreach ($user_messeged as $a_project) { if ($a_project->owner == $id) { $is_messeger = true; break; } } if (!$is_investor && !$is_messeger && !$is_author) { Message::Info(Text::get('user-message-restricted')); throw new Redirection('/user/profile/' . $id); } else { $_SESSION['message_autorized'] = true; } } // vip profile $viewData = array(); $viewData['user'] = $user; $projects = Model\Project::ofmine($id, true); $viewData['projects'] = $projects; //mis cofinanciadores // array de usuarios con: // foto, nombre, nivel, cantidad a mis proyectos, fecha ultimo aporte, nº proyectos que cofinancia $investors = array(); foreach ($projects as $kay => $project) { // quitamos los caducados if ($project->status == 0) { unset($projects[$kay]); continue; } foreach (Model\Invest::investors($project->id) as $key => $investor) { // convocadores no, gracias if (!empty($investor->campaign)) { continue; } if (\array_key_exists($investor->user, $investors)) { // ya está en el array, quiere decir que cofinancia este otro proyecto // , añadir uno, sumar su aporte, actualizar la fecha ++$investors[$investor->user]->projects; $investors[$investor->user]->amount += $investor->amount; $investors[$investor->user]->date = $investor->date; } else { $investors[$investor->user] = (object) array('user' => $investor->user, 'name' => $investor->name, 'projects' => 1, 'avatar' => $investor->avatar, 'worth' => $investor->worth, 'amount' => $investor->amount, 'date' => $investor->date); } } } $viewData['investors'] = $investors; // comparten intereses $viewData['shares'] = Model\User\Interest::share($id, $category); if ($show == 'sharemates' && empty($viewData['shares'])) { $show = 'profile'; } if (!empty($category)) { $viewData['category'] = $category; } // proyectos que cofinancio $invested = Model\User::invested($id, true); // agrupacion de proyectos que cofinancia y proyectos suyos $viewData['lists'] = array(); if (!empty($invested)) { $viewData['lists']['invest_on'] = Listing::get($invested, 2); } if (!empty($projects)) { $viewData['lists']['my_projects'] = Listing::get($projects, 2); } return new View('view/user/' . $show . '.html.php', $viewData); }
/** * Realiza el envio masivo a participantees o cofinanciadores * * @param type $option 'messegers' || 'rewards' * @param type $project Instancia del proyecto de trabajo * @return boolean */ public static function process_mailing($option, $project) { $who = array(); // verificar que hay mensaje if (empty($_POST['message'])) { Message::Error(Text::get('dashboard-investors-mail-text-required')); return false; } else { $msg_content = nl2br(\strip_tags($_POST['message'])); } // si a todos los participantes if ($option == 'messegers' && !empty($_POST['msg_all'])) { // a todos los participantes foreach (Model\Message::getMessegers($project->id) as $messeger => $msgData) { if ($messeger == $project->owner) { continue; } $who[$messeger] = $messeger; // unset($msgData); // los datos del mensaje del participante no se usan } } elseif ($option == 'rewards' && !empty($_POST['msg_all'])) { // a todos los cofinanciadores foreach (Model\Invest::investors($project->id, false, true) as $user => $investor) { // no duplicar $who[$investor->user] = $investor->user; } } elseif (!empty($_POST['msg_user'])) { // a usuario individual $who[$_POST['msg_user']] = $_POST['msg_user']; } elseif ($option == 'rewards') { $msg_rewards = array(); // estos son msg_reward-[rewardId], a un grupo de recompensa foreach ($_POST as $key => $value) { $parts = explode('-', $key); if ($parts[0] == 'msg_reward' && $value == 1) { $msg_rewards[] = $parts[1]; } } // para cada recompensa foreach ($msg_rewards as $reward) { foreach (Model\Invest::choosed($reward) as $user) { $who[$user] = $user; } } } // no hay destinatarios if (count($who) == 0) { Message::Error(Text::get('dashboard-investors-mail-nowho')); return false; } // obtener contenido // segun destinatarios $allsome = explode('/', Text::get('regular-allsome')); $enviandoa = !empty($_POST['msg_all']) ? $allsome[0] : $allsome[1]; if ($option == 'messegers') { Message::Info(Text::get('dashboard-messegers-mail-sendto', $enviandoa)); } else { Message::Info(Text::get('dashboard-investors-mail-sendto', $enviandoa)); } // Obtenemos la plantilla para asunto y contenido $template = Template::get(2); // Sustituimos los datos if (!empty($_POST['subject'])) { $subject = $_POST['subject']; } else { $subject = str_replace('%PROJECTNAME%', $project->name, $template->title); } $remite = $project->name . ' ' . Text::get('regular-from') . ' '; $remite .= NODE_ID != GOTEO_NODE ? NODE_NAME : GOTEO_MAIL_NAME; $search = array('%MESSAGE%', '%PROJECTNAME%', '%PROJECTURL%', '%OWNERURL%', '%OWNERNAME%'); $replace = array($msg_content, $project->name, SITE_URL . "/project/" . $project->id, SITE_URL . "/user/profile/" . $project->owner, $project->user->name); $content = \str_replace($search, $replace, $template->text); // para usar el proceso Sender: // - $who debe ser compatible con el formato $receivers // (falta nombre e email), sacarlo con getMini $receivers = array(); foreach ($who as $userId) { $user = Model\User::getMini($userId); $user->user = $user->id; $receivers[] = $user; } // - en la plantilla hay que cambiar %NAME% por %USERNAME% para que sender reemplace // - // - se crea un registro de tabla mail $sql = "INSERT INTO mail (id, email, html, template, node) VALUES ('', :email, :html, :template, :node)"; $values = array(':email' => 'any', ':html' => $content, ':template' => $template->id, ':node' => \GOTEO_NODE); $query = \Goteo\Core\Model::query($sql, $values); $mailId = \Goteo\Core\Model::insertId(); // - se usa el metodo initializeSending para grabar el envío (parametro para autoactivar) // , también metemos el reply y repplyName (remitente) en la instancia de envío if (\Goteo\Library\Sender::initiateSending($mailId, $subject, $receivers, 1, $project->user->email, $remite)) { Message::Info(Text::get('dashboard-investors-mail-sended', 'la cola de envíos')); // cambiar este texto } else { Message::Error(Text::get('dashboard-investors-mail-fail', 'la cola de envíos')); // cambiar este texto } return true; }
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')); } }