Beispiel #1
0
 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);
 }
Beispiel #2
0
 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 . ' &euro;'), 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'] . ' &euro;'), 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 . ' &euro;'), 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 . ' &euro;'), 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);
 }
Beispiel #3
0
 /**
  * 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);
 }
Beispiel #4
0
 /**
  * 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;
 }
Beispiel #5
0
 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'));
     }
 }