/** * 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 function projects($option = 'summary', $action = 'list', $id = null) { $user = $_SESSION['user']; $errors = array(); // verificación de proyectos y proyecto de trabajo list($project, $projects) = Dashboard\Projects::verifyProject($user, $action); // teniendo proyecto de trabajo, comprobar si el proyecto esta en estado de tener blog if ($option == 'updates') { $blog = Dashboard\Projects::verifyBlog($project); } // sacaexcel de cofinanciadores if ($option == 'rewards' && $action == 'table') { $response = new \Goteo\Controller\Sacaexcel(); return $response->index('investors', $project->id); } // ojo si no tiene retornos if ($option == 'commons' && empty($project->social_rewards)) { Message::Error('Este proyecto no tiene retornos colectivos'); throw new Redirection('/dashboard/projects/'); } // procesamiento de formularios if ($_SERVER['REQUEST_METHOD'] == 'POST') { switch ($option) { // gestionar retornos (o mensaje a los mensajeros) case 'messegers': case 'rewards': // sacamos del post el filtro y el orden if ($action == 'filter') { $_SESSION['dashboard-rewards-filter'] = isset($_POST['filter']) ? $_POST['filter'] : $_SESSION['dashboard-rewards-filter']; $_SESSION['dashboard-rewards-order'] = isset($_POST['order']) ? $_POST['order'] : $_SESSION['dashboard-rewards-order']; } //procesamos el envio de mails if ($action == 'message') { Dashboard\Projects::process_mailing($option, $project); // y lo devolvemos a donde estaba throw new Redirection('/dashboard/projects/' . $option); } break; // colaboraciones // colaboraciones case 'supports': if ($action == 'save') { $project = Dashboard\Projects::process_supports($project, $errors); } break; case 'updates': // verificación: si no llega blog correcto no lo procesamos if (empty($_POST['blog']) || $_POST['blog'] != $blog->id) { throw new Redirection('/dashboard/projects/summary'); } list($action, $id) = Dashboard\Projects::process_updates($action, $project, $errors); break; } } // SubControlador para add, edit, delete y list // devuelve $post en las acciones add y edit y $posts en delete y list // maneja por referencia $action, $posts y $errors if ($option == 'updates') { list($post, $posts) = Dashboard\Projects::prepare_updates($action, $id, $blog->id); } // view data basico para esta seccion $viewData = array('menu' => self::menu(), 'section' => __FUNCTION__, 'option' => $option, 'action' => $action, 'projects' => $projects, 'errors' => $errors); switch ($option) { case 'summary': // los datos json de invests y visitors_data $viewData['data'] = Dashboard\Projects::graph($project->id); break; // gestionar recompensas // gestionar recompensas case 'rewards': // recompensas ofrecidas $viewData['rewards'] = Model\Project\Reward::getAll($project->id, 'individual', LANG); // aportes para este proyecto $viewData['invests'] = Model\Invest::getAll($project->id); // ver por (esto son orden y filtros) $viewData['filter'] = $_SESSION['dashboard-rewards-filter']; $viewData['order'] = $_SESSION['dashboard-rewards-order']; break; // gestionar retornos // gestionar retornos case 'commons': $icons = Model\Icon::getAll('social'); foreach ($icons as $key => $icon) { $icons[$key] = $icon->name; } $viewData['icons'] = $icons; break; // listar mensajeadores // listar mensajeadores case 'messegers': $viewData['messegers'] = Model\Message::getMessegers($project->id); break; // editar colaboraciones // editar colaboraciones case 'supports': $viewData['types'] = Model\Project\Support::types(); // para mantener registros desplegados if ($_POST) { foreach ($_POST as $k => $v) { if (!empty($v) && preg_match('/support-(\\d+)-edit/', $k, $r)) { $viewData[$k] = true; break; } } } if (!empty($_POST['support-add'])) { $last = end($project->supports); if ($last !== false) { $viewData['support-' . $last->id . '-edit'] = true; } } $project->supports = Model\Project\Support::getAll($project->id); break; // publicar actualizaciones // publicar actualizaciones case 'updates': $viewData['blog'] = $blog; $viewData['posts'] = $posts; $viewData['post'] = $post; break; } $viewData['project'] = $project; return new View('view/dashboard/index.html.php', $viewData); }