public function post($post, $project = null) { if ($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['message'])) { $comment = new Model\Blog\Post\Comment(array('user' => $_SESSION['user']->id, 'post' => $post, 'date' => date('Y-m-d H:i:s'), 'text' => $_POST['message'])); if ($comment->save($errors)) { // a ver los datos del post $postData = Model\Blog\Post::get($post); // Evento Feed $log = new Feed(); if (!empty($project)) { $projectData = Model\Project::getMini($project); $log->setTarget($projectData->id); $log_html = \vsprintf('%s ha escrito un %s en la entrada "%s" en las %s del proyecto %s', array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('message', 'Comentario'), Feed::item('update-comment', $postData->title, $projectData->id . '/updates/' . $postData->id . '#comment' . $comment->id), Feed::item('update-comment', 'Novedades', $projectData->id . '/updates/'), Feed::item('project', $projectData->name, $projectData->id))); } else { $log->setTarget('goteo', 'blog'); $log_html = \vsprintf('%s ha escrito un %s en la entrada "%s" del blog de %s', array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('message', 'Comentario'), Feed::item('blog', $postData->title, $postData->id . '#comment' . $comment->id), Feed::item('blog', 'Goteo', '/'))); } $log->populate('usuario escribe comentario en blog/novedades', '/admin/projects', $log_html); $log->doAdmin('user'); // Evento público if (!empty($project)) { $projectData = Model\Project::getMini($project); $log_html = Text::html('feed-updates-comment', Feed::item('update-comment', $postData->title, $projectData->id . '/updates/' . $postData->id . '#comment' . $comment->id), Feed::item('update-comment', 'Novedades', $projectData->id . '/updates/'), Feed::item('project', $projectData->name, $projectData->id)); } else { $log_html = Text::html('feed-blog-comment', Feed::item('blog', $postData->title, $postData->id . '#comment' . $comment->id), Feed::item('blog', 'Goteo', '/')); } $log->populate($_SESSION['user']->name, '/user/profile/' . $_SESSION['user']->id, $log_html, $_SESSION['user']->avatar->id); $log->doPublic('community'); unset($log); //Notificación al autor del proyecto // Obtenemos la plantilla para asunto y contenido $template = Template::get(31); // Sustituimos los datos $subject = str_replace('%PROJECTNAME%', $projectData->name, $template->title); $response_url = SITE_URL . '/user/profile/' . $_SESSION['user']->id . '/message'; $project_url = SITE_URL . '/project/' . $projectData->id . '/updates/' . $postData->id . '#comment' . $comment->id; $search = array('%MESSAGE%', '%OWNERNAME%', '%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%', '%RESPONSEURL%'); $replace = array($_POST['message'], $projectData->user->name, $_SESSION['user']->name, $projectData->name, $project_url, $response_url); $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($errors); unset($mailHandler); } else { // error } } if (!empty($project)) { throw new Redirection("/project/{$project}/updates/{$post}#comment" . $comment->id, Redirection::TEMPORARY); } else { throw new Redirection("/blog/{$post}#comment" . $comment->id, Redirection::TEMPORARY); } }
/** * Control diario de convocatorias * @param bool $debug */ public static function Calls($debug = false) { // convocatorias con aplicación abierta $calls = Model\Call::getActive(3); foreach ($calls as $call) { // a ver cuantos días le quedan para que acabe la convocatoria $open = strtotime($call->opened); $until = mktime(0, 0, 0, date('m', $open), date('d', $open) + $call->days, date('Y', $open)); $now = strtotime(date('Y-m-d')); $diference = $until - $now; $days = \round($diference / 24 / 60 / 60); $doFeed = false; switch ($days) { case 7: $log_text = Text::_('Falta una semana para que acabe la convocatoria %s'); $log_text_public = 'Falta una semana para que se cierre la aplicación de proyectos'; $doFeed = true; break; case 3: $log_text = Text::_('Faltan 3 dias para que acabe la convocatoria %s'); $log_text_public = 'Faltan 3 dias para que se cierre la aplicación de proyectos'; $doFeed = true; break; case 1: $log_text = Text::_('Ultimo día para la convocatoria %s'); $log_text_public = 'Hoy es el último día para aplicar proyectos!'; $doFeed = true; break; } // feed if ($doFeed) { $log = new Feed(); $log->setTarget($call->id, 'call'); $log->unique = true; $log->populate('Convocatoria terminando (cron)', '/admin/calls/' . $call->id . '?days=' . $days, \vsprintf($log_text, array(Feed::item('call', $call->name, $call->id)))); $log->doAdmin('call'); $log->populate('Convocatoria: ' . $call->name, '/call/' . $call->id . '?days=' . $days, $log_text_public, $call->logo); $log->doPublic('projects'); unset($log); echo \vsprintf($log_text, array($call->name)) . '<br />'; } } // campañas dando dinero $campaigns = Model\Call::getActive(4); foreach ($campaigns as $campaign) { $errors = array(); // tiene que tener presupuesto if (empty($campaign->amount)) { continue; } // a ver cuanto le queda de capital riego $rest = $campaign->rest; $doFeed = false; if ($rest < 100) { $amount = 100; $doFeed = true; } elseif ($rest < 500) { $amount = 500; $doFeed = true; } elseif ($rest < 1000) { $amount = 1000; $doFeed = true; } // feed if ($doFeed) { $log = new Feed(); $log->setTarget($campaign->id, 'call'); $log->unique = true; $log->populate('Campaña terminando (cron)', '/admin/calls/' . $campaign->id . '?rest=' . $amount, \vsprintf('Quedan menos de %s en la campaña %s', array(Feed::item('money', $amount . ' ¥') . ' de ' . Feed::item('drop', 'Capital Riego', '/service/resources'), Feed::item('call', $campaign->name, $campaign->id)))); $log->doAdmin('call'); $log->populate($campaign->name, '/call/' . $campaign->id . '?rest=' . $amount, \vsprintf('Quedan menos de %s en la campaña %s', array(Feed::item('money', $amount . ' ¥') . ' de ' . Feed::item('drop', 'Capital Riego', '/service/resources'), Feed::item('call', $campaign->name, $campaign->id))), $call->logo); $log->doPublic('projects'); unset($log); } } if ($debug) { echo "<br />Calls-control Listo!<hr />"; } return; }
public function confirmed($project = null, $id = null, $reward = null) { if (empty($id)) { Message::Error(Text::get('invest-data-error')); throw new Redirection('/', Redirection::TEMPORARY); } // el aporte $invest = Model\Invest::get($id); $projectData = Model\Project::getMedium($invest->project); // para evitar las duplicaciones de feed y email if (isset($_SESSION['invest_' . $invest->id . '_completed'])) { Message::Info(Text::get('invest-process-completed')); throw new Redirection($retUrl); } // segun método if ($invest->method == 'tpv') { // si el aporte no está en estado "cobrado por goteo" (1) if ($invest->status != '1') { @mail('*****@*****.**', 'Aporte tpv no pagado ' . $invest->id, 'Ha llegado a invest/confirm el aporte ' . $invest->id . ' mediante tpv sin estado cobrado (llega con estado ' . $invest->status . ')'); // mandarlo a la pagina de aportar para que lo intente de nuevo // si es de Bazar, a la del producto del catálogo if ($project == 'bazargoteo') { throw new Redirection("/bazaar/{$reward}/fail"); } else { throw new Redirection("/project/{$invest->project}/invest/?confirm=fail"); } } } // Paypal solo disponible si activado if ($invest->method == 'paypal') { // hay que cambiarle el status a 0 $invest->setStatus('0'); // Evento Feed $log = new Feed(); $log->setTarget($projectData->id); $log->populate('Aporte PayPal', '/admin/invests', \vsprintf("%s ha aportado %s al proyecto %s mediante PayPal", array(Feed::item('user', $_SESSION['user']->name, $_SESSION['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($_SESSION['user']->name, '/user/profile/' . $_SESSION['user']->id, $log_html, $_SESSION['user']->avatar->id); } $log->doPublic('community'); unset($log); } // fin segun metodo // Feed del aporte de la campaña if (!empty($invest->droped) && $drop instanceof Model\Invest && is_object($callData)) { // Evento Feed $log = new Feed(); $log->setTarget($projectData->id); $log->populate('Aporte riego ' . $drop->method, '/admin/invests', \vsprintf("%s ha aportado %s de %s al proyecto %s a través de la campaña %s", array(Feed::item('user', $callData->user->name, $callData->user->id), Feed::item('money', $drop->amount . ' €'), Feed::item('drop', 'Capital Riego', '/service/resources'), Feed::item('project', $projectData->name, $projectData->id), Feed::item('call', $callData->name, $callData->id)))); $log->doAdmin('money'); // evento público $log->populate($callData->user->name, '/user/profile/' . $callData->user->id, Text::html('feed-invest', Feed::item('money', $drop->amount . ' €') . ' de ' . Feed::item('drop', 'Capital Riego', '/service/resources'), Feed::item('project', $projectData->name, $projectData->id) . ' a través de la campaña ' . Feed::item('call', $callData->name, $callData->id)), $callData->user->avatar->id); $log->doPublic('community'); unset($log); } // 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%'); $replace = array($_SESSION['user']->name, $projectData->name, SITE_URL . '/project/' . $projectData->id, $confirm->amount, $txt_rewards); $content = \str_replace($search, $replace, $template->text); $mailHandler = new Mail(); $mailHandler->reply = GOTEO_CONTACT_MAIL; $mailHandler->replyName = GOTEO_MAIL_NAME; $mailHandler->to = $_SESSION['user']->email; $mailHandler->toName = $_SESSION['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, $_SESSION['user']->name, $projectData->name, SITE_URL, $invest->amount, SITE_URL . '/user/profile/' . $_SESSION['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'); if ($confirm->method == 'paypal') { // hay que cambiarle el status a 0 $confirm->setStatus('0'); /* * Evento Feed */ $log = new Feed(); $log->title = 'Aporte PayPal'; $log->url = '/admin/invests'; $log->type = 'money'; $log_text = "%s ha aportado %s al proyecto %s mediante PayPal"; $items = array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('money', $confirm->amount . ' €'), Feed::item('project', $projectData->name, $projectData->id)); $log->html = \vsprintf($log_text, $items); $log->add($errors); // evento público if ($confirm->anonymous) { $log->title = Text::get('regular-anonymous'); $log->url = '/user/profile/anonymous'; $log->image = 1; } else { $log->title = $_SESSION['user']->name; $log->url = '/user/profile/' . $_SESSION['user']->id; $log->image = $_SESSION['user']->avatar->id; } $log->scope = 'public'; $log->type = 'community'; $log->html = Text::html('feed-invest', Feed::item('money', $confirm->amount . ' €'), Feed::item('project', $projectData->name, $projectData->id)); $log->add($errors); unset($log); } // mandarlo a la pagina de gracias throw new Redirection("/project/{$project}/invest/?confirm=ok", Redirection::TEMPORARY); }
public static function process($action = 'list', $id = null, $filters = array()) { $log_text = null; $errors = array(); // multiples usos $nodes = array(); if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['id'])) { $projData = Model\Project::get($_POST['id']); if (empty($projData->id)) { Message::Error('El proyecto ' . $_POST['id'] . ' no existe'); throw new Redirection('/admin/projects/images/' . $id); } if (isset($_POST['save-dates'])) { $fields = array('created', 'updated', 'published', 'success', 'closed', 'passed'); $set = ''; $values = array(':id' => $projData->id); foreach ($fields as $field) { if ($set != '') { $set .= ", "; } $set .= "`{$field}` = :{$field} "; if (empty($_POST[$field]) || $_POST[$field] == '0000-00-00') { $_POST[$field] = null; } $values[":{$field}"] = $_POST[$field]; } try { $sql = "UPDATE project SET " . $set . " WHERE id = :id"; if (Model\Project::query($sql, $values)) { $log_text = 'El admin %s ha <span class="red">tocado las fechas</span> del proyecto ' . $projData->name . ' %s'; } else { $log_text = 'Al admin %s le ha <span class="red">fallado al tocar las fechas</span> del proyecto ' . $projData->name . ' %s'; } } catch (\PDOException $e) { Message::Error(Text::_("No se ha guardado correctamente. ") . $e->getMessage()); } } elseif (isset($_POST['save-accounts'])) { $accounts = Model\Project\Account::get($projData->id); $accounts->bank = $_POST['bank']; $accounts->bank_owner = $_POST['bank_owner']; $accounts->paypal = $_POST['paypal']; $accounts->paypal_owner = $_POST['paypal_owner']; if ($accounts->save($errors)) { Message::Info(Text::_('Se han actualizado las cuentas del proyecto ') . $projData->name); } else { Message::Error(implode('<br />', $errors)); } } elseif ($action == 'images') { $todook = true; if (!empty($_POST['move'])) { $direction = $_POST['action']; Model\Project\Image::$direction($id, $_POST['move'], $_POST['section']); } foreach ($_POST as $key => $value) { $parts = explode('_', $key); if ($parts[1] == 'image' && in_array($parts[0], array('section', 'url'))) { if (Model\Project\Image::update($id, $parts[2], $parts[0], $value)) { // OK } else { $todook = false; Message::Error(Text::_('No se ha podido actualizar campo') . " {$parts[0]} -> {$value}"); } } } if ($todook) { Message::Info(Text::_('Se han actualizado los datos')); } throw new Redirection('/admin/projects/images/' . $id); } elseif ($action == 'rebase') { $todook = true; if ($_POST['proceed'] == 'rebase' && !empty($_POST['newid'])) { $newid = $_POST['newid']; // pimero miramos que no hay otro proyecto con esa id $test = Model\Project::getMini($newid); if ($test->id == $newid) { Message::Error(Text::_('Ya hay un proyecto con ese Id.')); throw new Redirection('/admin/projects/rebase/' . $id); } if ($projData->status >= 3 && $_POST['force'] != 1) { Message::Error(Text::_('El proyecto no está ni en Edición ni en Revisión, no se modifica nada.')); throw new Redirection('/admin/projects/rebase/' . $id); } if ($projData->rebase($newid)) { Message::Info(Text::_('Verificar el proyecto') . ' -> <a href="' . SITE_URL . '/project/' . $newid . '" target="_blank">' . $projData->name . '</a>'); throw new Redirection('/admin/projects'); } else { Message::Info(Text::_('Ha fallado algo en el rebase, verificar el proyecto') . ' -> <a href="' . SITE_URL . '/project/' . $projData->id . '" target="_blank">' . $projData->name . ' (' . $id . ')</a>'); throw new Redirection('/admin/projects/rebase/' . $id); } } } } /* * switch action, * proceso que sea, * redirect * */ if (isset($id)) { $project = Model\Project::get($id); } switch ($action) { case 'review': // pasar un proyecto a revision if ($project->ready($errors)) { $redir = '/admin/reviews/add/' . $project->id; $log_text = 'El admin %s ha pasado el proyecto %s al estado <span class="red">Revision</span>'; } else { $log_text = 'Al admin %s le ha fallado al pasar el proyecto %s al estado <span class="red">Revision</span>'; } break; case 'publish': // poner un proyecto en campa�a if ($project->publish($errors)) { $log_text = 'El admin %s ha pasado el proyecto %s al estado <span class="red">en Campa�a</span>'; } else { $log_text = 'Al admin %s le ha fallado al pasar el proyecto %s al estado <span class="red">en Campa�a</span>'; } break; case 'cancel': // descartar un proyecto por malo if ($project->cancel($errors)) { $log_text = 'El admin %s ha pasado el proyecto %s al estado <span class="red">Descartado</span>'; } else { $log_text = 'Al admin %s le ha fallado al pasar el proyecto %s al estado <span class="red">Descartado</span>'; } break; case 'enable': // si no esta en edicion, recuperarlo if ($project->enable($errors)) { $log_text = 'El admin %s ha pasado el proyecto %s al estado <span class="red">Edicion</span>'; } else { $log_text = 'Al admin %s le ha fallado al pasar el proyecto %s al estado <span class="red">Edicion</span>'; } break; case 'fulfill': // marcar que el proyecto ha cumplido con los retornos colectivos if ($project->satisfied($errors)) { $log_text = 'El admin %s ha pasado el proyecto %s al estado <span class="red">Retorno cumplido</span>'; } else { $log_text = 'Al admin %s le ha fallado al pasar el proyecto %s al estado <span class="red">Retorno cumplido</span>'; } break; case 'unfulfill': // dar un proyecto por financiado manualmente if ($project->rollback($errors)) { $log_text = 'El admin %s ha pasado el proyecto %s al estado <span class="red">Financiado</span>'; } else { $log_text = 'Al admin %s le ha fallado al pasar el proyecto %s al estado <span class="red">Financiado</span>'; } break; } if (isset($log_text)) { // Evento Feed $log = new Feed(); $log->setTarget($project->id); $log->populate(Text::_('Cambio estado/fechas/cuentas/nodo de un proyecto desde el admin'), '/admin/projects', \vsprintf($log_text, array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('project', $project->name, $project->id)))); $log->doAdmin('admin'); Message::Info($log->html); if (!empty($errors)) { Message::Error(implode('<br />', $errors)); } if ($action == 'publish') { // si es publicado, hay un evento publico $log->populate($project->name, '/project/' . $project->id, Text::html('feed-new_project'), $project->gallery[0]->id); $log->doPublic('projects'); } unset($log); if (empty($redir)) { throw new Redirection('/admin/projects/list'); } else { throw new Redirection($redir); } } if ($action == 'report') { // informe financiero // 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' => 'projects', 'file' => 'report', 'project' => $project, 'Data' => $Data)); } if ($action == 'dates') { // cambiar fechas return new View('view/admin/index.html.php', array('folder' => 'projects', 'file' => 'dates', 'project' => $project)); } if ($action == 'accounts') { $accounts = Model\Project\Account::get($project->id); // cambiar fechas return new View('view/admin/index.html.php', array('folder' => 'projects', 'file' => 'accounts', 'project' => $project, 'accounts' => $accounts)); } if ($action == 'images') { // imagenes $images = array(); // secciones $sections = Model\Project\Image::sections(); foreach ($sections as $sec => $secName) { $secImages = Model\Project\Image::get($project->id, $sec); foreach ($secImages as $img) { $images[$sec][] = $img; } } return new View('view/admin/index.html.php', array('folder' => 'projects', 'file' => 'images', 'project' => $project, 'images' => $images, 'sections' => $sections)); } if ($action == 'move') { // cambiar el nodo return new View('view/admin/index.html.php', array('folder' => 'projects', 'file' => 'move', 'project' => $project, 'nodes' => $nodes)); } if ($action == 'rebase') { // cambiar la id return new View('view/admin/index.html.php', array('folder' => 'projects', 'file' => 'rebase', 'project' => $project)); } // Rechazo express if ($action == 'reject') { if (empty($project)) { Message::Error(Text::_('No hay proyecto sobre el que operar')); } else { // Obtenemos la plantilla para asunto y contenido $template = Template::get(40); // Sustituimos los datos $subject = str_replace('%PROJECTNAME%', $project->name, $template->title); $search = array('%USERNAME%', '%PROJECTNAME%'); $replace = array($project->user->name, $project->name); $content = \str_replace($search, $replace, $template->text); // iniciamos mail $mailHandler = new Mail(); $mailHandler->to = $project->user->email; $mailHandler->toName = $project->user->name; $mailHandler->subject = $subject; $mailHandler->content = $content; $mailHandler->html = true; $mailHandler->template = $template->id; if ($mailHandler->send()) { Message::Info('Se ha enviado un email a <strong>' . $project->user->name . '</strong> a la dirección <strong>' . $project->user->email . '</strong>'); } else { Message::Error('Ha fallado al enviar el mail a <strong>' . $project->user->name . '</strong> a la dirección <strong>' . $project->user->email . '</strong>'); } unset($mailHandler); } throw new Redirection('/admin/projects/list'); } if (!empty($filters['filtered'])) { $projects = Model\Project::getList($filters, $_SESSION['admin_node']); } else { $projects = array(); } $status = Model\Project::status(); $categories = Model\Project\Category::getAll(); //@CONTRACTSYS $calls = array(); // la lista de nodos la hemos cargado arriba $orders = array('name' => Text::_('Nombre'), 'updated' => Text::_('Enviado a revision')); return new View('view/admin/index.html.php', array('folder' => 'projects', 'file' => 'list', 'projects' => $projects, 'filters' => $filters, 'status' => $status, 'categories' => $categories, 'calls' => $calls, 'nodes' => $nodes, 'orders' => $orders)); }
/** * Activación usuario. * * @param type string $token */ public function activate($token) { $query = Model\User::query('SELECT id FROM user WHERE token = ?', array($token)); if ($id = $query->fetchColumn()) { $user = Model\User::get($id); if (!$user->confirmed) { $user->confirmed = true; $user->active = true; if ($user->save($errors)) { Message::Info(Text::get('user-activate-success')); $_SESSION['user'] = $user; // Evento Feed $log = new Feed(); $log->setTarget($user->id, 'user'); $log->populate('nuevo usuario registrado (confirmado)', '/admin/users', Text::html('feed-new_user', Feed::item('user', $user->name, $user->id))); $log->doAdmin('user'); // evento público $log->title = $user->name; $log->url = null; $log->doPublic('community'); unset($log); } else { Message::Error($errors); } } else { Message::Info(Text::get('user-activate-already-active')); } } else { Message::Error(Text::get('user-activate-fail')); } throw new Redirection('/dashboard'); }
public static function process($action = 'list', $id = null, $filters = array()) { $errors = array(); $node = empty($_SESSION['admin_node']) ? \GOTEO_NODE : $_SESSION['admin_node']; $blog = Model\Blog::get($node, 'node'); if (!$blog instanceof \Goteo\Model\Blog) { $blog = new Model\Blog(array('type' => 'node', 'owner' => $node, 'active' => 1)); if ($blog->save($errors)) { Message::Info(Text::get('admin-blog-info-initialize')); } else { Message::Error(Text::get('admin-blog-error-initialize')); throw new Redirection('/admin'); } } elseif (!$blog->active) { Message::Error(Text::get('admin-blog-error-no_blog')); throw new Redirection('/admin'); } // primero comprobar que tenemos blog if (!$blog instanceof Model\Blog) { Message::Error(Text::get('admin-blog-error-not_found')); throw new Redirection('/admin'); } $url = '/admin/blog'; if ($_SERVER['REQUEST_METHOD'] == 'POST') { if (empty($_POST['blog'])) { Message::Error(Text::get('admin-blog-error_missing_blog')); break; } $editing = false; if (!empty($_POST['id'])) { $post = Model\Blog\Post::get($_POST['id']); } else { $post = new Model\Blog\Post(); } // campos que actualizamos $fields = array('id', 'blog', 'title', 'text', 'image', 'media', 'legend', 'date', 'publish', 'home', 'footer', 'allow', 'author'); foreach ($fields as $field) { $post->{$field} = $_POST[$field]; } // tratar la imagen y ponerla en la propiedad image if (!empty($_FILES['image_upload']['name'])) { $post->image = $_FILES['image_upload']; $editing = true; } // tratar las imagenes que quitan foreach ($post->gallery as $key => $image) { if (!empty($_POST["gallery-{$image->id}-remove"])) { $image->remove('post'); unset($post->gallery[$key]); if ($post->image == $image->id) { $post->image = ''; } $editing = true; } } if (!empty($post->media)) { $post->media = new Model\Project\Media($post->media); } $post->tags = $_POST['tags']; // si tenemos un nuevio tag hay que añadirlo if (!empty($_POST['new-tag_save']) && !empty($_POST['new-tag'])) { // grabar el tag en la tabla de tag, $new_tag = new Model\Blog\Post\Tag(array('id' => '', 'name' => $_POST['new-tag'])); if ($new_tag->save($errors)) { $post->tags[] = $new_tag->id; // asignar al post } else { Message::Error(implode('<br />', $errors)); } $editing = true; // seguir editando } /// este es el único save que se lanza desde un metodo process_ if ($post->save($errors)) { if ($action == 'edit') { Message::Info(Text::get('admin-blog-info-updates-saved')); } else { Message::Info(Text::get('admin-blog-info-add_new')); $id = $post->id; } $action = $editing ? 'edit' : 'list'; if ((bool) $post->publish) { // Evento Feed $log = new Feed(); $log->setTarget('goteo', 'blog'); $log->populate('nueva entrada blog Goteo (admin)', '/admin/blog', \vsprintf('El admin %s ha %s en el blog Goteo la entrada "%s"', array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('relevant', 'Publicado'), Feed::item('blog', $post->title, $post->id)))); $log->doAdmin('admin'); // evento público $log->unique = true; $log->populate($post->title, '/blog/' . $post->id, Text::recorta($post->text, 250), $post->gallery[0]->id); $log->doPublic('goteo'); unset($log); } else { //sino lo quitamos \Goteo\Core\Model::query("DELETE FROM feed WHERE url = '/blog/{$post->id}' AND scope = 'public' AND type = 'goteo'"); } } else { Message::Error(Text::get('admin-blog-error-save-fail') . ':<br />' . \implode('<br />', $errors)); } } switch ($action) { case 'list': // lista de entradas // obtenemos los datos $filters['node'] = $node; $show = array('all' => 'Todas las entradas existentes', 'published' => 'Solamente las publicadas en el blog', 'owned' => 'Solamente las del propio nodo', 'home' => 'Solamente las de portada', 'entries' => 'Solamente las de cierto nodo', 'updates' => 'Solamente las de proyectos'); // filtro de blogs de proyectos/nodos switch ($filters['show']) { case 'updates': $blogs = Model\Blog::getListProj(); break; case 'entries': $blogs = Model\Blog::getListNode(); break; } if (!in_array($filters['show'], array('entries', 'updates')) || !isset($blogs[$filters['blog']])) { unset($filters['blog']); } $posts = Model\Blog\Post::getList($filters, false); $homes = Model\Post::getList('home', $node); $footers = Model\Post::getList('footer', $node); if ($node == \GOTEO_NODE) { $show['footer'] = 'Solamente las del footer'; } return new View('view/admin/index.html.php', array('folder' => 'blog', 'file' => 'list', 'posts' => $posts, 'filters' => $filters, 'show' => $show, 'blogs' => $blogs, 'homes' => $homes, 'footers' => $footers, 'node' => $node)); break; case 'add': // nueva entrada con wisiwig // obtenemos datos basicos $post = new Model\Blog\Post(array('blog' => $blog->id, 'date' => date('Y-m-d'), 'publish' => false, 'allow' => true, 'tags' => array(), 'author' => $_SESSION['user']->id)); $message = 'Añadiendo una nueva entrada'; return new View('view/admin/index.html.php', array('folder' => 'blog', 'file' => 'edit', 'action' => 'add', 'post' => $post, 'tags' => Model\Blog\Post\Tag::getAll(), 'message' => $message)); break; case 'edit': if (empty($id)) { Message::Error(Text::get('admin-blog-error-nopost')); throw new Redirection('/admin/blog'); break; } else { $post = Model\Blog\Post::get($id); if (!$post instanceof Model\Blog\Post) { Message::Error(Text::get('admin-blog-error-break_entry')); $action = 'list'; break; } elseif ($node != \GOTEO_NODE && $post->owner_type == 'node' && $post->owner_id != $node) { Message::Error(Text::get('admin-blog-error-noedit')); throw new Redirection('/admin/blog/list'); } } $message = 'Editando una entrada existente'; return new View('view/admin/index.html.php', array('folder' => 'blog', 'file' => 'edit', 'action' => 'edit', 'post' => $post, 'tags' => Model\Blog\Post\Tag::getAll(), 'message' => $message)); break; case 'remove': // eliminar una entrada $tempData = Model\Blog\Post::get($id); if ($node != \GOTEO_NODE && $tempData->owner_type == 'node' && $tempData->owner_id != $node) { Message::Error(Text::get('admin-blog-error-nodelete')); throw new Redirection('/admin/blog'); } if (Model\Blog\Post::delete($id)) { // Evento Feed $log = new Feed(); $log->setTarget('goteo', 'blog'); $log->populate('Quita entrada de blog (admin)', '/admin/blog', \vsprintf('El admin %s ha %s la entrada "%s" del blog de Goteo', array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('relevant', 'Quitado'), Feed::item('blog', $tempData->title)))); $log->doAdmin('admin'); unset($log); Message::Info(Text::get('admin-blog-info-deleted_entry')); } else { Message::Error(Text::get('admin-blog-error-delete-fail')); } throw new Redirection('/admin/blog/list'); break; // acciones portada // acciones portada case 'reorder': // lista de entradas en portada // obtenemos los datos $posts = Model\Post::getAll('home', $node); return new View('view/admin/index.html.php', array('folder' => 'blog', 'file' => 'order', 'posts' => $posts)); break; case 'up': if ($node != \GOTEO_NODE) { Model\Post::up_node($id, $node); } else { Model\Post::up($id, 'home'); } throw new Redirection('/admin/blog/reorder'); break; case 'down': if ($node != \GOTEO_NODE) { Model\Post::up_node($id, $node); } else { Model\Post::down($id, 'home'); } throw new Redirection('/admin/blog/reorder'); break; case 'add_home': // siguiente orden if ($node != \GOTEO_NODE) { $next = Model\Post::next_node($node); $data = (object) array('post' => $id, 'node' => $node, 'order' => $next); if (Model\Post::update_node($data, $errors)) { Message::Info(Text::get('admin-blog-info-add-home')); } else { Message::Error(Text::get('admin-blog-error-any-problem') . ':<br />' . \implode('<br />', $errors)); } } else { $next = Model\Post::next('home'); $post = new Model\Post(array('id' => $id, 'order' => $next, 'home' => 1)); if ($post->update($errors)) { Message::Info(Text::get('admin-blog-info-add-home')); } else { Message::Error(Text::get('admin-blog-error-any-problem') . ':<br />' . \implode('<br />', $errors)); } } throw new Redirection('/admin/blog/list'); break; case 'remove_home': // se quita de la portada solamente $ok = false; if ($node != \GOTEO_NODE) { $ok = Model\Post::remove_node($id, $node); } else { $ok = Model\Post::remove($id, 'home'); } if ($ok) { Message::Info(Text::get('admin-blog-info-removecover')); } else { Message::Error(Text::get('admin-blog-error-cover-deletefail')); } throw new Redirection('/admin/blog/list'); break; // acciones footer (solo para superadmin y admins de goteo // acciones footer (solo para superadmin y admins de goteo case 'footer': if ($node == \GOTEO_NODE) { // lista de entradas en el footer // obtenemos los datos $posts = Model\Post::getAll('footer'); return new View('view/admin/index.html.php', array('folder' => 'blog', 'file' => 'footer', 'posts' => $posts)); } else { throw new Redirection('/admin/blog/list'); } break; case 'up_footer': if ($node == \GOTEO_NODE) { Model\Post::up($id, 'footer'); throw new Redirection('/admin/blog/footer'); } else { throw new Redirection('/admin/blog'); } break; case 'down_footer': if ($node == \GOTEO_NODE) { Model\Post::down($id, 'footer'); throw new Redirection('/admin/blog/footer'); } else { throw new Redirection('/admin/blog'); } break; case 'add_footer': if ($node == \GOTEO_NODE) { // siguiente orden $next = Model\Post::next('footer'); $post = new Model\Post(array('id' => $id, 'order' => $next, 'footer' => 1)); if ($post->update($errors)) { Message::Info(Text::get('admin-blog-info-footer-complete')); } else { Message::Error(Text::get('admin-blog-error-any-problem') . ':<br />' . \implode('<br />', $errors)); } } throw new Redirection('/admin/blog'); break; case 'remove_footer': if ($node == \GOTEO_NODE) { // se quita del footer solamente if (Model\Post::remove($id, 'footer')) { Message::Info(Text::get('admin-blog-info-footer-delete')); } else { Message::Error(Text::get('admin-blog-error-footer-deletefail')); } } throw new Redirection('/admin/blog/list'); break; } }
/** * Graba un registro de novedad con lo recibido por POST * * @param array $action (add o edit) y $id del post * @param object $project Instancia de proyecto de trabajo * @param array $errors (por referncia) * @return array $action por si se queda editando o sale a la lista y $id por si es un add y se queda editando */ public static function process_updates($action, $project, &$errors = array()) { $editing = false; if (!empty($_POST['id'])) { $post = Model\Blog\Post::get($_POST['id']); } else { $post = new Model\Blog\Post(); } // campos que actualizamos $fields = array('id', 'blog', 'title', 'text', 'image', 'media', 'legend', 'date', 'publish', 'allow'); foreach ($fields as $field) { $post->{$field} = $_POST[$field]; } // tratar la imagen y ponerla en la propiedad image if (!empty($_FILES['image_upload']['name'])) { $post->image = $_FILES['image_upload']; $editing = true; } // tratar las imagenes que quitan foreach ($post->gallery as $key => $image) { if (!empty($_POST["gallery-{$image->id}-remove"])) { $image->remove('post'); unset($post->gallery[$key]); if ($post->image == $image->id) { $post->image = ''; } $editing = true; } } if (!empty($post->media)) { $post->media = new Model\Project\Media($post->media); } // el blog de proyecto no tiene tags?¿? // $post->tags = $_POST['tags']; /// este es el único save que se lanza desde un metodo process_ if ($post->save($errors)) { $id = $post->id; if ($action == 'edit') { Message::Info(Text::get('dashboard-project-updates-saved')); } else { Message::Info(Text::get('dashboard-project-updates-inserted')); } $action = $editing ? 'edit' : 'list'; // si ha marcado publish, grabamos evento de nueva novedad en proyecto if ((bool) $post->publish) { // Evento Feed $log = new Feed(); $log->setTarget($project->id); $log->populate('usuario publica una novedad en su proyecto (dashboard)', '/project/' . $project->id . '/updates/' . $post->id, \vsprintf('%s ha publicado un nuevo post en %s sobre el proyecto %s, con el título "%s"', array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('blog', Text::get('project-menu-updates')), Feed::item('project', $project->name, $project->id), Feed::item('update', $post->title, $project->id . '/updates/' . $post->id)))); $log->unique = true; $log->doAdmin('user'); // evento público $log->populate($post->title, '/project/' . $project->id . '/updates/' . $post->id, Text::html('feed-new_update', Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('blog', Text::get('project-menu-updates')), Feed::item('project', $project->name, $project->id)), $post->gallery[0]->id); $log->doPublic('projects'); // si no ha encontrado otro, lanzamos la notificación a cofinanciadores if (!$log->unique_issue) { \Goteo\Controller\Cron\Send::toInvestors('update', $project, $post); } unset($log); } } else { $errors[] = Text::get('dashboard-project-updates-fail'); } return array($action, $id); }
public function execute() { if (!\defined('CRON_EXEC')) { @mail(\GOTEO_FAIL_MAIL, 'Se ha lanzado MANUALMENTE el cron ' . __FUNCTION__ . ' en ' . SITE_URL, 'Se ha lanzado manualmente el cron ' . __FUNCTION__ . ' en ' . SITE_URL . ' a las ' . date('H:i:s') . ' Usuario ' . $_SESSION['user']->id); echo 'Lanzamiento manual a las ' . date('H:i:s') . ' <br />'; } else { echo 'Lanzamiento automatico a las ' . date('H:i:s') . ' <br />'; } // a ver si existe el bloqueo $block_file = GOTEO_PATH . 'logs/cron-' . __FUNCTION__ . '.block'; if (file_exists($block_file)) { echo 'Ya existe un archivo de log ' . date('Ymd') . '_' . __FUNCTION__ . '.log<br />'; $block_content = \file_get_contents($block_file); echo 'El contenido del bloqueo es: ' . $block_content; // lo escribimos en el log $log_file = GOTEO_PATH . 'logs/cron/' . date('Ymd') . '_' . __FUNCTION__ . '.log'; \file_put_contents($log_file, \ob_get_contents(), FILE_APPEND); \chmod($log_file, 0777); /* @mail(\GOTEO_FAIL_MAIL, 'Cron '. __FUNCTION__ .' bloqueado en ' . SITE_URL, 'Se ha encontrado con que el cron '. __FUNCTION__ .' está bloqueado el '.date('d-m-Y').' a las ' . date ('H:i:s') . ' El contenido del bloqueo es: '. $block_content); */ die; } else { $block = 'Bloqueo del ' . $block_file . ' activado el ' . date('d-m-Y') . ' a las ' . date('H:i:s') . '<br />'; if (\file_put_contents($block_file, $block, FILE_APPEND)) { \chmod($block_file, 0777); echo $block; } else { echo 'No se ha podido crear el archivo de bloqueo<br />'; @mail(\GOTEO_FAIL_MAIL, 'Cron ' . __FUNCTION__ . ' no se ha podido bloquear en ' . SITE_URL, 'No se ha podido crear el archivo ' . $block_file . ' el ' . date('d-m-Y') . ' a las ' . date('H:i:s')); } } echo '<hr />'; // debug para supervisar en las fechas clave // $debug = ($_GET['debug'] == 'debug') ? true : false; $debug = true; // revision de proyectos: dias, conseguido y cambios de estado // proyectos en campaña, // (publicados hace más de 40 días que no tengan fecha de pase) // o (publicados hace mas de 80 días que no tengan fecha de exito) $projects = Model\Project::getActive(); if ($debug) { echo 'Comenzamos con los proyectos en campaña (esto está en ' . \LANG . ')<br /><br />'; } foreach ($projects as $project) { if ($debug) { echo 'Proyecto ' . $project->name . '<br />'; } // a ver si tiene cuenta paypal $projectAccount = Model\Project\Account::get($project->id); /* if (empty($projectAccount->paypal)) { if ($debug) echo 'No tiene cuenta PayPal<br />'; // Evento Feed solamente si automático if (\defined('CRON_EXEC')) { $log = new Feed(); $log->setTarget($project->id); $log->populate('proyecto sin cuenta paypal (cron)', '/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); // mail de aviso $mailHandler = new Mail(); $mailHandler->to = \GOTEO_CONTACT_MAIL; $mailHandler->toName = 'Goteo.org'; $mailHandler->subject = 'El proyecto '.$project->name.' no tiene cuenta PayPal'; $mailHandler->content = 'Hola Goteo, el proyecto '.$project->name.' no tiene cuenta PayPal y el proceso automatico no podrá tratar los preaprovals al final de ronda.'; $mailHandler->html = false; $mailHandler->template = null; $mailHandler->send(); unset($mailHandler); $task = new Model\Task(); $task->node = \GOTEO_NODE; $task->text = "Poner la cuenta PayPal al proyecto <strong>{$project->name}</strong> urgentemente!"; $task->url = "/admin/projects/accounts/{$project->id}"; $task->done = null; $task->saveUnique(); } } */ $log_text = null; if ($debug) { echo 'Minimo: ' . $project->mincost . ' ¥ <br />'; } $execute = false; $cancelAll = false; if ($debug) { echo 'Obtenido: ' . $project->amount . ' ¥<br />'; } // porcentaje alcanzado if ($project->mincost > 0) { $per_amount = \floor($project->amount / $project->mincost * 100); } else { $per_amount = 0; } if ($debug) { echo 'Ha alcanzado el ' . $per_amount . ' % del minimo<br />'; } // los dias que lleva el proyecto (ojo que los financiados llevaran mas de 80 dias) $days = $project->daysActive(); if ($debug) { echo 'Lleva ' . $days . ' dias desde la publicacion<br />'; } /* Verificar si enviamos aviso */ $rest = $project->days; $round = $project->round; if ($debug) { echo 'Quedan ' . $rest . ' dias para el final de la ' . $round . 'a ronda<br />'; } // a los 5, 3, 2, y 1 dia para finalizar ronda if ($round > 0 && in_array((int) $rest, array(5, 3, 2, 1))) { if ($debug) { echo 'Feed publico cuando quedan 5, 3, 2, 1 dias<br />'; } // Evento Feed solo si ejecucion automática if (\defined('CRON_EXEC')) { $log = new Feed(); $log->setTarget($project->id); $log->populate('proyecto próximo a finalizar ronda (cron)', '/admin/projects', Text::html('feed-project_runout', Feed::item('project', $project->name, $project->id), $rest, $round)); $log->doAdmin('project'); // evento público $log->title = $project->name; $log->url = null; $log->doPublic('projects'); unset($log); } } // (financiado a los 80 o cancelado si a los 40 no llega al minimo) // si ha llegado a los 40 dias: mínimo-> ejecutar ; no minimo proyecto y todos los preapprovals cancelados // (Funded at 80 or canceled if the 40 does not reach the minimum) // If it has reached 40 days: minimum-> execute; no minimum project and canceled all preapprovals if ($days >= 40) { // si no ha alcanzado el mínimo, pasa a estado caducado // If you have not reached the minimum, goes into Expired if ($project->amount < $project->mincost) { if ($debug) { echo 'Ha llegado a los 40 dias de campaña sin conseguir el minimo, no pasa a segunda ronda<br />'; } echo $project->name . ': ha recaudado ' . $project->amount . ', ' . $per_amount . '% de ' . $project->mincost . '/' . $project->maxcost . '<br />'; echo 'No ha conseguido el minimo, cancelamos todos los aportes y lo caducamos:'; $cancelAll = true; $errors = array(); if ($project->fail($errors)) { $log_text = Text::_('El proyecto %s ha %s obteniendo %s'); } else { @mail(\GOTEO_FAIL_MAIL, 'Fallo al archivar ' . SITE_URL, 'Fallo al marcar el proyecto ' . $project->name . ' como archivado ' . implode(',', $errors)); echo 'ERROR::' . implode(',', $errors); $log_text = Text::_('El proyecto %s ha fallado al, %s obteniendo %s'); } echo '<br />'; // Evento Feed solo si ejecucion automatica if (\defined('CRON_EXEC')) { $log = new Feed(); $log->setTarget($project->id); $log->populate('proyecto archivado (cron)', '/admin/projects', \vsprintf($log_text, array(Feed::item('project', $project->name, $project->id), Feed::item('relevant', 'caducado sin éxito'), Feed::item('money', $project->amount . ' ¥ (' . $per_amount . '%) de aportes sobre minimo')))); $log->doAdmin('project'); // evento público $log->populate($project->name, null, Text::html('feed-project_fail', Feed::item('project', $project->name, $project->id), $project->amount, $per_amount)); $log->doPublic('projects'); unset($log); //Email de proyecto fallido al autor Cron\Send::toOwner('fail', $project); //Email de proyecto fallido a los inversores Cron\Send::toInvestors('fail', $project); } echo '<br />'; } else { // tiene hasta 80 días para conseguir el óptimo (o más) // Has up to 80 days for optimum (or more) if ($days >= 80) { if ($debug) { echo 'Ha llegado a los 80 dias de campaña (final de segunda ronda)<br />'; } echo $project->name . ': ha recaudado ' . $project->amount . ', ' . $per_amount . '% de ' . $project->mincost . '/' . $project->maxcost . '<br />'; echo 'Ha llegado a los 80 días: financiado. '; $execute = true; // ejecutar los cargos de la segunda ronda $errors = array(); if ($project->succeed($errors)) { $log_text = Text::_('El proyecto %s ha sido %s obteniendo %s'); } else { @mail(\GOTEO_FAIL_MAIL, 'Fallo al marcar financiado ' . SITE_URL, 'Fallo al marcar el proyecto ' . $project->name . ' como financiado ' . implode(',', $errors)); echo 'ERROR::' . implode(',', $errors); $log_text = Text::_('El proyecto %s ha fallado al ser, %s obteniendo %s'); } // Evento Feed y mails solo si ejecucion automatica if (\defined('CRON_EXEC')) { $log = new Feed(); $log->setTarget($project->id); $log->populate('proyecto supera segunda ronda (cron)', '/admin/projects', \vsprintf($log_text, array(Feed::item('project', $project->name, $project->id), Feed::item('relevant', 'financiado'), Feed::item('money', $project->amount . ' ¥ (' . \round($per_amount) . '%) de aportes sobre minimo')))); $log->doAdmin('project'); // evento público $log->populate($project->name, null, Text::html('feed-project_finish', Feed::item('project', $project->name, $project->id), $project->amount, \round($per_amount))); $log->doPublic('projects'); unset($log); //Email de proyecto final segunda ronda al autor Cron\Send::toOwner('r2_pass', $project); //Email de proyecto final segunda ronda a los inversores Cron\Send::toInvestors('r2_pass', $project); // Tareas para gestionar // calculamos fecha de passed+90 días $passtime = strtotime($project->passed); $limsec = date('d/m/Y', \mktime(0, 0, 0, date('m', $passtime), date('d', $passtime) + 89, date('Y', $passtime))); /* * Ya no hacemos pagos secundarios mediante sistema $task = new Model\Task(); $task->node = \GOTEO_NODE; $task->text = "Hacer los pagos secundarios al proyecto <strong>{$project->name}</strong> antes del día <strong>{$limsec}</strong>"; $task->url = "/admin/accounts/?projects={$project->id}"; $task->done = null; $task->save(); */ // y preparar contrato $task = new Model\Task(); $task->node = \GOTEO_NODE; $task->text = date('d/m/Y') . ": Enviar datos contrato <strong>{$project->name}</strong>, {$project->user->name}"; //@TODO enlace a gestión de contrato $task->url = "/admin/projects?proj_name={$project->name}"; $task->done = null; $task->saveUnique(); // + mail a mercè @mail(\GOTEO_CONTACT_MAIL, 'Preparar contrato ' . $project->name, 'El proyecto ' . $project->name . ' ha pasado la primera ronda, enviarle los datos de contrato. Se ha creado una tarea para esto.'); } echo '<br />'; } elseif (empty($project->passed)) { if ($debug) { echo 'Ha llegado a los 40 dias de campaña, pasa a segunda ronda<br />'; } echo $project->name . ': ha recaudado ' . $project->amount . ', ' . $per_amount . '% de ' . $project->mincost . '/' . $project->maxcost . '<br />'; echo 'El proyecto supera la primera ronda: marcamos fecha'; $execute = true; // ejecutar los cargos de la primera ronda $errors = array(); if ($project->passed($errors)) { // se crea el registro de contrato // Recording contract is created if (Model\Contract::create($project->id, $errors)) { echo ' -> Ok:: se ha creado el registro de contrato'; } else { @mail(\GOTEO_FAIL_MAIL, 'Fallo al crear registro de contrato ' . SITE_URL, 'Fallo al crear registro de contrato para el proyecto ' . $project->name . ': ' . implode(',', $errors)); echo ' -> semi-Ok: se ha actualiuzado el estado del proyecto pero ha fallado al crear el registro de contrato. ERROR: ' . implode(',', $errors); } } else { @mail(\GOTEO_FAIL_MAIL, 'Fallo al marcar fecha de paso a segunda ronda ' . SITE_URL, 'Fallo al marcar la fecha de paso a segunda ronda para el proyecto ' . $project->name . ': ' . implode(',', $errors)); echo ' -> ERROR::' . implode(',', $errors); } echo '<br />'; // Evento Feed solo si ejecucion automatica if (\defined('CRON_EXEC')) { $log = new Feed(); $log->setTarget($project->id); $log->populate('proyecto supera primera ronda (cron)', '/admin/projects', \vsprintf('El proyecto %s %s en segunda ronda obteniendo %s', array(Feed::item('project', $project->name, $project->id), Feed::item('relevant', 'continua en campaña'), Feed::item('money', $project->amount . ' ¥ (' . \number_format($per_amount, 2) . '%) de aportes sobre minimo')))); $log->doAdmin('project'); // evento público $log->populate($project->name, null, Text::html('feed-project_goon', Feed::item('project', $project->name, $project->id), $project->amount, \round($per_amount))); $log->doPublic('projects'); unset($log); if ($debug) { echo 'Email al autor y a los cofinanciadores<br />'; } // Email de proyecto pasa a segunda ronda al autor Cron\Send::toOwner('r1_pass', $project); //Email de proyecto pasa a segunda ronda a los inversores Cron\Send::toInvestors('r1_pass', $project); // Tarea para hacer los pagos $task = new Model\Task(); $task->node = \GOTEO_NODE; $task->text = date('d/m/Y') . ": Pagar a <strong>{$project->name}</strong>, {$project->user->name}"; $task->url = "/admin/projects/report/{$project->id}"; $task->done = null; $task->saveUnique(); // + mail a susana @mail('*****@*****.**', 'Pagar al proyecto ' . $project->name, 'El proyecto ' . $project->name . ' ha terminado la segunda ronda, hacer los pagos. Se ha creado una tarea para esto.'); } } else { if ($debug) { echo 'Lleva más de 40 dias de campaña, debe estar en segunda ronda con fecha marcada<br />'; } if ($debug) { echo $project->name . ': lleva recaudado ' . $project->amount . ', ' . $per_amount . '% de ' . $project->mincost . '/' . $project->maxcost . ' y paso a segunda ronda el ' . $project->passed . '<br />'; } } } } // si hay que ejecutar o cancelar if ($cancelAll || $execute) { if ($debug) { echo '::::::Comienza tratamiento de aportes:::::::<br />'; } if ($debug) { echo 'Execute=' . (string) $execute . ' CancelAll=' . (string) $cancelAll . '<br />'; } // tratamiento de aportes penddientes $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($project->id)); $project->invests = $query->fetchAll(\PDO::FETCH_CLASS, '\\Goteo\\Model\\Invest'); foreach ($project->invests as $key => $invest) { $errors = array(); $log_text = null; $userData = Model\User::getMini($invest->user); if ($invest->invested == date('Y-m-d')) { if ($debug) { echo 'Aporte ' . $invest->id . ' es de hoy.<br />'; } } elseif ($invest->method != 'cash' && empty($invest->preapproval)) { //si no tiene preaproval, cancelar //echo 'Aporte ' . $invest->id . ' cancelado por no tener preapproval.<br />'; //$invest->cancel(); //Model\Invest::setDetail($invest->id, 'no-preapproval', 'Aporte cancelado porque no tiene preapproval. Proceso cron/execute'); //continue; } if ($cancelAll) { if ($debug) { echo 'Cancelar todo<br />'; } switch ($invest->method) { // case 'paypal': // $err = array(); // if (Paypal::cancelPreapproval($invest, $err, true)) { // $log_text = Text::_("Se ha cancelado aporte y preapproval de %s de %s mediante PayPal (id: %s) al proyecto %s del dia %s"); // } else { // $txt_errors = implode('; ', $err); // $log_text = Text::_("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; // } // break; case 'axes': if ($invest->cancel(true)) { $log_text = Text::_("Contribution is canceled"); } else { $log_text = Text::_("Failed to cancel"); } break; case 'tpv': // se habre la operación en optra ventana $err = array(); if (Tpv::cancelPreapproval($invest, $err, true)) { $log_text = Text::_("Se ha anulado el cargo tpv de %s de %s mediante TPV (id: %s) al proyecto %s del dia %s"); } else { $txt_errors = implode('; ', $err); $log_text = Text::_("Ha fallado al anular el 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(true)) { $log_text = Text::_("Se ha cancelado aporte manual de %s de %s (id: %s) al proyecto %s del dia %s"); } else { $log_text = Text::_("Ha fallado al cancelar el aporte manual de %s de %s (id: %s) al proyecto %s del dia %s. "); } break; } // Evento Feed admin $log = new Feed(); $log->setTarget($project->id); $log->populate('Preapproval cancelado por proyecto archivado (cron)', '/admin/invests', \vsprintf($log_text, array(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(); unset($log); echo 'Aporte ' . $invest->id . ' cancelado por proyecto caducado.<br />'; $invest->setStatus('4'); Model\Invest::setDetail($invest->id, 'project-expired', 'Aporte marcado como caducado porque el proyecto no ha tenido exito. Proceso cron/execute'); continue; } // si hay que ejecutar if ($execute && empty($invest->payment)) { if ($debug) { echo 'Ejecutando aporte ' . $invest->id . ' [' . $invest->method . ']'; } switch ($invest->method) { /* cronではなく管理画面から手動で(admin/invests/dopay) case 'axes': $err = array(); if ($invest->setPayment(date("YmdHis"))) { $invest->setStatus(1); $log_text = Text::_("Has been executed under its %s %s contribution via Axes (id:%s) to the project %s %s of the day"); if ($debug) echo ' -> Ok'; Model\Invest::setDetail($invest->id, 'executed', 'Preapproval has been executed, has initiated the chained payment. Process cron / execute'); // si era incidencia la desmarcamos 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'); } } break;*/ case 'paypal': if (empty($projectAccount->paypal)) { if ($debug) { echo '<br />El proyecto ' . $project->name . ' no tiene cuenta paypal.<br />'; } Model\Invest::setDetail($invest->id, 'no-paypal-account', 'El proyecto no tiene cuenta paypal en el momento de ejecutar el preapproval. Proceso cron/execute'); break; } $invest->account = $projectAccount->paypal; $err = array(); if (Paypal::pay($invest, $err)) { $log_text = Text::_("Se ha ejecutado el cargo a %s por su aporte de %s mediante PayPal (id: %s) al proyecto %s del dia %s"); if ($debug) { echo ' -> Ok'; } Model\Invest::setDetail($invest->id, 'executed', 'Se ha ejecutado el preapproval, ha iniciado el pago encadenado. Proceso cron/execute'); // 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 ejecutarse correctamente en el proceso automático'); } } else { $txt_errors = implode('; ', $err); echo 'Aporte ' . $invest->id . ': Fallo al ejecutar cargo paypal: ' . $txt_errors . '<br />'; @mail(\GOTEO_FAIL_MAIL, 'Fallo al ejecutar cargo Paypal ' . SITE_URL, 'Aporte ' . $invest->id . ': Fallo al ejecutar cargo paypal: ' . $txt_errors); if ($debug) { echo ' -> ERROR!!'; } Model\Invest::setDetail($invest->id, 'execution-failed', 'Fallo al ejecutar el preapproval, no ha iniciado el pago encadenado: ' . $txt_errors . '. Proceso cron/execute'); // Notifiacion de incidencia al usuario // Obtenemos la plantilla para asunto y contenido $template = Template::get(37); // Sustituimos los datos $subject = str_replace('%PROJECTNAME%', $project->name, $template->title); $search = array('%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%', '%AMOUNT%', '%DETAILS%'); $replace = array($userData->name, $project->name, SITE_URL . '/project/' . $project->id, $invest->amount, ''); $content = \str_replace($search, $replace, $template->text); // iniciamos mail $mailHandler = new Mail(); $mailHandler->from = GOTEO_CONTACT_MAIL; $mailHandler->to = $userData->email; $mailHandler->toName = $userData->name; $mailHandler->subject = $subject; $mailHandler->content = $content; $mailHandler->html = true; $mailHandler->template = $template->id; if ($mailHandler->send()) { Model\Invest::setDetail($invest->id, 'issue-notified', "Se ha notificado la incidencia al usuario"); } else { Model\Invest::setDetail($invest->id, 'issue-notify-failed', "Ha fallado al enviar el mail de notificacion de la incidencia al usuario"); @mail(\GOTEO_FAIL_MAIL, 'Fallo al enviar email de notificacion de incidencia PayPal' . SITE_URL, 'Fallo al enviar email de notificacion de incidencia PayPal: <pre>' . print_r($mailHandler, 1) . '</pre>'); } } break; case 'tpv': // los cargos con este tpv vienen ejecutados de base if ($debug) { echo ' -> Ok'; } /* $err = array(); if (Tpv::pay($invest, $err)) { echo 'Cargo sermepa correcto'; $log_text = "Se ha ejecutado el cargo a %s por su aporte de %s mediante TPV (id: %s) al proyecto %s del dia %s"; } else { $txt_errors = implode('; ', $err); echo 'Fallo al ejecutar cargo sermepa: ' . $txt_errors; $log_text = "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': // los cargos manuales no los modificamos if ($debug) { echo ' Cash, nada que hacer -> Ok'; } break; } if ($debug) { echo '<br />'; } if (!empty($log_text)) { // Evento Feed $log = new Feed(); $log->setTarget($project->id); $log->populate('Cargo ejecutado (cron)', '/admin/invests', \vsprintf($log_text, array(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(); if ($debug) { echo $log->html . '<br />'; } unset($log); } if ($debug) { echo 'Aporte ' . $invest->id . ' tratado<br />'; } } } if ($debug) { echo '::Fin tratamiento aportes<br />'; } } if ($debug) { echo 'Fin tratamiento Proyecto ' . $project->name . '<hr />'; } } // checkeamos campañas activas //$campaigns = Model\Call::getActive(4); $campaigns = array(); foreach ($campaigns as $campaign) { $errors = array(); // tiene que tener presupuesto if (empty($campaign->amount)) { continue; } // si le quedan cero // -> terminar la campaña exitosamente if ($campaign->rest == 0 && !empty($campaign->amount)) { echo 'La convocatoria ' . $campaign->name . ': '; if ($campaign->checkSuccess($errors)) { if ($campaign->succeed($errors)) { echo 'Ha terminado exitosamente.<br />'; $log = new Feed(); $log->setTarget($campaign->id, 'call'); $log->unique = true; $log->populate('Campaña terminada (cron)', '/admin/calls/' . $campaign->id . '?rest=' . $amount, \vsprintf('La campaña %s ha terminado con exito', array(Feed::item('call', $campaign->name, $campaign->id)))); $log->doAdmin('call'); $log->populate($campaign->name, '/call/' . $campaign->id . '?rest=' . $amount, \vsprintf('La campaña %s ha terminado con éxito', array(Feed::item('call', $campaign->name, $campaign->id))), $call->logo); $log->doPublic('projects'); unset($log); } else { echo 'Ha fallado al marcar exitosa.<br />' . implode('<br />', $errors); } } else { echo 'Le Queda algun proyecto en primera ronda.<br />'; } } } // desbloqueamos if (unlink($block_file)) { echo 'Cron ' . __FUNCTION__ . ' desbloqueado<br />'; } else { echo 'ALERT! Cron ' . __FUNCTION__ . ' no se ha podido desbloquear<br />'; if (file_exists($block_file)) { echo 'El archivo ' . $block_file . ' aun existe!<br />'; } else { echo 'No hay archivo de bloqueo ' . $block_file . '!<br />'; } } // recogemos el buffer para grabar el log $log_file = GOTEO_PATH . 'logs/cron/' . date('Ymd') . '_' . __FUNCTION__ . '.log'; \file_put_contents($log_file, \ob_get_contents(), FILE_APPEND); \chmod($log_file, 0777); }
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'); }
public function comunication() { @mail(\GOTEO_FAIL_MAIL, 'Comunicacion online', 'Este GET<pre>' . print_r($_GET, 1) . '</pre> y este POST:<pre>' . print_r($_POST, 1) . '</pre>'); if (isset($_POST['__expected_field___'])) { $_POST['invest'] = $id = $_POST['__expected_field___']; $invest = Invest::get($id); $userData = User::getMini($invest->user); $projectData = Project::getMini($invest->project); $response = ''; foreach ($_POST as $n => $v) { $response .= "{$n}:'{$v}'; "; } $conf = array('mode' => 0600, 'timeFormat' => '%X %x'); $logger =& \Log::singleton('file', 'logs/' . date('Ymd') . '_invest.log', 'caller', $conf); $logger->log("response: {$response}"); $logger->log('##### END TPV [' . $id . '] ' . date('d/m/Y') . ' ' . $_POST['__expected_field___'] . '#####'); $logger->close(); if (!empty($_POST['__expected_field___'])) { try { $tpvRef = $_POST['__expected_field___']; $tpvAut = $_POST['__expected_field___']; $values = array(':id' => $invest->id, ':payment' => $tpvRef, ':transaction' => $tpvAut, ':charged' => date('Y-m-d')); $sql = "UPDATE invest\n SET\n status = 1,\n payment = :payment,\n charged = :charged,\n transaction = :transaction\n WHERE id = :id"; if (Invest::query($sql, $values)) { Invest::setDetail($invest->id, 'tpv-response', 'La comunicación online del tpv se a completado correctamente. Proceso controller/tpv'); } else { @mail(\GOTEO_FAIL_MAIL, 'Error db en comunicacion online', 'En la grabación de referencia, num auth. y estado. Ha fallado: ' . $sql . ' ' . print_r($values, 1) . '<hr /><pre>' . print_r($invest, 1) . '</pre>'); } // CALLSYS } catch (\PDOException $e) { @mail(\GOTEO_FAIL_MAIL, 'Error db en comunicacion online', 'En la grabación de referencia, num auth. y estado. Ha dado un PDO::Exception<br /><pre>' . print_r($invest, 1) . '</pre>'); } $_POST['result'] = 'Transaccion ok'; $log_text = "%s ha aportado %s al proyecto %s mediante TPV"; $doPublic = true; echo '$*$OKY$*$'; } else { $Cerr = (string) $_POST['Codigo_error']; $errTxt = self::$errcode[$Cerr]; Invest::setDetail($invest->id, 'tpv-response-error', 'El tpv ha comunicado el siguiente Codigo error: ' . $Cerr . ' - ' . $errTxt . '. El aporte a quedado \'En proceso\'. Proceso controller/tpv'); @mail(\GOTEO_FAIL_MAIL, 'Error en TPV', 'Codigo error: ' . $Cerr . ' ' . $errTxt . '<br /><pre>' . print_r($_POST, 1) . '</pre>'); $invest->cancel('ERR ' . $Cerr); $_POST['result'] = 'Fail'; $log_text = 'Ha habido un <span class="red">ERROR de TPV (Codigo: ' . $Cerr . ' ' . $errTxt . ')</span> en el aporte de %s de %s al proyecto %s mediante TPV'; $doPublic = false; } // Evento Feed $log = new Feed(); $log->setTarget($projectData->id); $log->populate('Aporte TPV', '/admin/invests', \vsprintf($log_text, $log_items = array(Feed::item('user', $userData->name, $userData->id), Feed::item('money', $invest->amount . ' €'), Feed::item('project', $projectData->name, $projectData->id)))); $log->doAdmin('money'); if ($doPublic) { // 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($userData->name, '/user/profile/' . $userData->id, $log_html, $userData->avatar->id); } $log->doPublic('community'); } unset($log); } else { echo 'Se esperaban recibir datos de comunicación online del TPV.'; @mail(\GOTEO_FAIL_MAIL, 'Comunicacion online sin datos', 'Este GET<pre>' . print_r($_GET, 1) . '</pre> y este POST:<pre>' . print_r($_POST, 1) . '</pre>'); // throw new Redirection('/', Error::BAD_REQUEST); } die; }