Пример #1
0
 public static function Projects($debug = false)
 {
     // proyectos a notificar
     $projects = Model\Project::review();
     // para cada uno,
     foreach ($projects as $project) {
         // por ahora solo tratamos los de primera ronda y hasta 2 meses tras la financiación
         if ($project->days > 40 || $project->days > 360) {
             continue;
         }
         if ($debug) {
             echo "Proyecto {$project->name}, Impulsor:  {$project->user->name}, email: {$project->user->email}, estado {$project->status}, lleva {$project->days} dias<br />";
         }
         // primero los que no se bloquean
         // Recuerdo al autor proyecto, 2 meses despues de campaña finalizada
         if ($project->days == 140) {
             // si quedan recompensas/retornos pendientes por cumplir
             if (!Model\Project\Reward::areFulfilled($project->id) || !Model\Project\Reward::areFulfilled($project->id, 'social')) {
                 if ($debug) {
                     echo "Recompensas/Retornos pendientes<br />";
                 }
                 Send::toOwner('2m_after', $project);
             } else {
                 if ($debug) {
                     echo "Recompensas/Retornos cumplidas, no se envía<br />";
                 }
             }
         }
         // Recuerdo al autor proyecto, 8 meses despues de campaña finalizada
         if ($project->days == 320) {
             // si quedan retornos pendientes por cumplir
             if (!Model\Project\Reward::areFulfilled($project->id, 'social')) {
                 if ($debug) {
                     echo "Retornos pendientes<br />";
                 }
                 Send::toOwner('8m_after', $project);
             } else {
                 if ($debug) {
                     echo "Retornos cumplidos, no se envía<br />";
                 }
             }
         }
         // ahora checkeamos bloqueo de consejos
         $prefs = Model\User::getPreferences($project->owner);
         if ($prefs->tips) {
             if ($debug) {
                 echo "Bloqueado por preferencias<hr />";
             }
             continue;
         }
         // flag de aviso
         $avisado = false;
         // Consejos/avisos puntuales
         switch ($project->days) {
             // NO condicionales
             case 1:
                 // Difunde, difunde, difunde
             // Difunde, difunde, difunde
             case 2:
                 // Comienza por lo más próximo
             // Comienza por lo más próximo
             case 3:
                 // Una acción a diario, por pequeña que sea
             // Una acción a diario, por pequeña que sea
             case 4:
                 // Llama a todas las puertas
             // Llama a todas las puertas
             case 5:
                 // Busca dónde está tu comunidad
             // Busca dónde está tu comunidad
             case 8:
                 // Agradece en público e individualmente
                 $template = 'tip_' . $project->days;
                 if ($debug) {
                     echo "Envío {$template}<br />";
                 }
                 Send::toOwner($template, $project);
                 break;
                 // periodico condicional
             // periodico condicional
             case 6:
                 // Publica novedades!
                 // y  se repite cada 6 días (fechas libres) mientras no haya posts
             // Publica novedades!
             // y  se repite cada 6 días (fechas libres) mientras no haya posts
             case 12:
             case 18:
             case 24:
             case 30:
             case 36:
                 // si ya hay novedades, nada
                 if (Model\Blog::hasUpdates($project->id)) {
                     if ($debug) {
                         echo "Ya ha publicado novedades<br />";
                     }
                 } else {
                     if ($debug) {
                         echo "Envío aviso de que no ha publicado novedades<br />";
                     }
                     Send::toOwner('any_update', $project);
                     $avisado = true;
                 }
                 break;
                 // comprobación periódica pero solo un envío
             // comprobación periódica pero solo un envío
             case 7:
                 // Apóyate en quienes te van apoyando ,  si más de 20 cofinanciadores
                 // o en cuanto llegue a 20 backers (en fechas libres)
             // Apóyate en quienes te van apoyando ,  si más de 20 cofinanciadores
             // o en cuanto llegue a 20 backers (en fechas libres)
             case 14:
             case 17:
             case 21:
             case 24:
             case 27:
                 // Si ya se mandó esta plantilla (al llegar a los 20 por primera vez) no se envía de nuevo
                 $sql = "\n                            SELECT\n                                id\n                            FROM mail\n                            WHERE mail.email = :email\n                            AND mail.template = 46\n                            ORDER BY mail.date DESC\n                            LIMIT 1";
                 $query = Model\Project::query($sql, array(':email' => $project->user->email));
                 $sended = $query->fetchColumn(0);
                 if (!$sended) {
                     if ($project->num_investors >= 20) {
                         if ($debug) {
                             echo "Tiene 20 backers y no se le habia enviado aviso antes<br />";
                         }
                         Send::toOwner('20_backers', $project);
                     } else {
                         if ($debug) {
                             echo "No llega a los 20 backers<br />";
                         }
                     }
                 } else {
                     if ($debug) {
                         echo "Ya enviado<br />";
                     }
                 }
                 break;
             case 9:
                 // Busca prescriptores e implícalos
                 // si no tiene padrinos
                 if ($project->patrons > 0) {
                     if ($debug) {
                         echo "Tiene padrino<br />";
                     }
                 } else {
                     if ($debug) {
                         echo "No tiene padrino<br />";
                     }
                     Send::toOwner('tip_9', $project);
                 }
                 break;
             case 10:
                 // Luce tus recompensas y retornos
                 // que no se envie a los que solo tienen recompensas de agradecimiento
                 $thanksonly = true;
                 // recompensas
                 $rewards = Model\Project\Reward::getAll($project->id, 'individual', \LANG);
                 foreach ($rewards as $rew) {
                     if ($rew->icon != 'thanks') {
                         $thanksonly = false;
                         break;
                         // ya salimos del bucle, no necesitamos más
                     }
                 }
                 if ($thanksonly) {
                     if ($debug) {
                         echo "Solo tiene recompensas de agradecimiento<br />";
                     }
                 } else {
                     if ($debug) {
                         echo "Tienen recompensas<br />";
                     }
                     uasort($rewards, function ($a, $b) {
                         if ($a->amount == $b->amount) {
                             return 0;
                         }
                         return $a->amount > $b->amount ? 1 : -1;
                     });
                     // sacar la primera y la última
                     $lower = reset($rewards);
                     $project->lower = $lower->reward;
                     $higher = end($rewards);
                     $project->higher = $higher->reward;
                     Send::toOwner('tip_10', $project);
                 }
                 break;
             case 11:
                 // Refresca tu mensaje de motivacion
                 // si no tiene video motivacional
                 if (empty($project->video)) {
                     if ($debug) {
                         echo "No tiene video motivacional<br />";
                     }
                     Send::toOwner('tip_11', $project);
                 } else {
                     if ($debug) {
                         echo "Tiene video motivacional<br />";
                     }
                 }
                 break;
             case 15:
                 // Sigue los avances y calcula lo que falta
                 // si no ha llegado al mínimo
                 if ($project->invested < $project->mincost) {
                     if ($debug) {
                         echo "No ha llegado al mínimo<br />";
                     }
                     Send::toOwner('tip_15', $project);
                 } else {
                     if ($debug) {
                         echo "Ha llegado al mínimo<br />";
                     }
                 }
                 break;
             case 25:
                 // No bajes la guardia!
                 // si no ha llegado al mínimo
                 if ($project->invested < $project->mincost) {
                     if ($debug) {
                         echo "No ha llegado al mínimo<br />";
                     }
                     Send::toOwner('two_weeks', $project);
                 } else {
                     if ($debug) {
                         echo "Ha llegado al mínimo<br />";
                     }
                 }
                 break;
             case 32:
                 // Al proyecto le faltan 8 días para archivarse
                 // si no ha llegado al mínimo
                 if ($project->invested < $project->mincost) {
                     if ($debug) {
                         echo "No ha llegado al mínimo<br />";
                     }
                     Send::toOwner('8_days', $project);
                 } else {
                     if ($debug) {
                         echo "Ha llegado al mínimo<br />";
                     }
                 }
                 break;
             case 38:
                 // Al proyecto le faltan 2 días para archivarse
                 // si no ha llegado al mínimo pero está por encima del 70%
                 if ($project->invested < $project->mincost && $project->percent >= 70) {
                     if ($debug) {
                         echo "No ha llegado al mínimo<br />";
                     }
                     Send::toOwner('2_days', $project);
                 } else {
                     if ($debug) {
                         echo "Ha llegado al mínimo o lleva menos de 70%<br />";
                     }
                 }
                 break;
         }
         // Avisos periodicos
         // si lleva más de 15 días: si no se han publicado novedades en la última semana
         // Ojo! que si no a enviado ninguna no lanza este sino la de cada 6 días
         if (!$avisado && $project->days > 15) {
             if ($debug) {
                 echo "ya lleva una quincena de campaña, verificamos novedades<br />";
             }
             // veamos si ya le avisamos hace una semana
             // Si ya se mandó esta plantilla (al llegar a los 20 por primera vez) no se envía de nuevo
             $sql = "\n                        SELECT\n                            id,\n                            DATE_FORMAT(\n                                from_unixtime(unix_timestamp(now()) - unix_timestamp(date))\n                                , '%j'\n                            ) as days\n                        FROM mail\n                        WHERE mail.email = :email\n                        AND mail.template = 23\n                        ORDER BY mail.date DESC\n                        LIMIT 1";
             $query = Model\Project::query($sql, array(':email' => $project->user->email));
             $lastsend = $query->fetchObject();
             if (!$lastsend->id || $lastsend->days > 7) {
                 // veamos cuanto hace de la última novedad
                 $sql = "\n                            SELECT\n                                DATE_FORMAT(\n                                    from_unixtime(unix_timestamp(now()) - unix_timestamp(date))\n                                    , '%j'\n                                ) as days\n                            FROM post\n                            INNER JOIN blog\n                                ON  post.blog = blog.id\n                                AND blog.type = 'project'\n                                AND blog.owner = :project\n                            WHERE post.publish = 1\n                            ORDER BY post.date DESC\n                            LIMIT 1";
                 $query = Model\Project::query($sql, array(':project' => $project->id));
                 $lastUpdate = $query->fetchColumn(0);
                 if ($lastUpdate > 7) {
                     if ($debug) {
                         echo "Ultima novedad es de hace más de una semana<br />";
                     }
                     Send::toOwner('no_updates', $project);
                 } elseif (is_numeric($lastUpdate)) {
                     if ($debug) {
                         echo "Publicó novedad hace menos de una semana<br />";
                     }
                 } else {
                     if ($debug) {
                         echo "No se ha publicado nada, recibirá el de cada 6 días<br />";
                     }
                 }
             } else {
                 if ($debug) {
                     echo "Se le avisó por novedades hace menos de una semana<br />";
                 }
             }
         }
         if ($debug) {
             echo "<hr />";
         }
     }
     if ($debug) {
         echo "<br />Auto-tips Listo!<hr />";
     }
     return;
 }
Пример #2
0
 public function index($project = null)
 {
     if (empty($project)) {
         throw new Redirection('/discover', Redirection::PERMANENT);
     }
     if ($_SERVER['REQUEST_METHOD'] == 'POST' && !empty($_POST['message'])) {
         $projectData = Model\Project::getMini($project);
         if ($projectData->status < 3) {
             \Goteo\Library\Message::Error(Text::get('project-messages-closed'));
             throw new Redirection("/project/{$project}");
         }
         $message = new Model\Message(array('user' => $_SESSION['user']->id, 'project' => $project, 'thread' => $_POST['thread'], 'message' => $_POST['message']));
         if ($message->save($errors)) {
             $support = Model\Message::isSupport($_POST['thread']);
             // Evento Feed
             $log = new Feed();
             $log->setTarget($projectData->id);
             if (empty($_POST['thread'])) {
                 // nuevo hilo
                 $log_html = \vsprintf('%s ha creado un tema en %s del proyecto %s', array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('message', Text::get('project-menu-messages'), $projectData->id . '/messages#message' . $message->id), Feed::item('project', $projectData->name, $projectData->id)));
             } else {
                 // respuesta
                 // si una respuesta a un mensaje de colaboraicón
                 if (!empty($support)) {
                     $log_html = \vsprintf('Nueva colaboración de %s con %s en el proyecto %s', array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('message', $support, $projectData->id . '/messages#message' . $_POST['thread']), Feed::item('project', $projectData->name, $projectData->id)));
                 } else {
                     // es una respuesta a un hilo normal
                     $log_html = \vsprintf('%s ha respondido en %s del proyecto %s', array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('message', Text::get('project-menu-messages'), $projectData->id . '/messages#message' . $message->id), Feed::item('project', $projectData->name, $projectData->id)));
                 }
             }
             $log->populate('usuario escribe mensaje/respuesta en Mensajes del proyecto', '/admin/projects', $log_html);
             $log->doAdmin('user');
             // Evento público
             if (empty($_POST['thread'])) {
                 $log_html = Text::html('feed-messages-new_thread', Feed::item('message', Text::get('project-menu-messages'), $projectData->id . '/messages#message' . $message->id), Feed::item('project', $projectData->name, $projectData->id));
             } else {
                 // si una respuesta a un mensaje de colaboraicón
                 if (!empty($support)) {
                     $log_html = Text::html('feed-message_support-response', Feed::item('message', $support, $projectData->id . '/messages#message' . $_POST['thread']), Feed::item('project', $projectData->name, $projectData->id));
                 } else {
                     // es una respuesta a un hilo normal
                     $log_html = Text::html('feed-messages-response', Feed::item('message', Text::get('project-menu-messages'), $projectData->id . '/messages#message' . $message->id), Feed::item('project', $projectData->name, $projectData->id));
                 }
             }
             $log->populate($_SESSION['user']->name, '/user/profile/' . $_SESSION['user']->id, $log_html, $_SESSION['user']->avatar->id);
             $log->doPublic('community');
             unset($log);
             if (!empty($_POST['thread'])) {
                 // aqui el owner es el autor del mensaje thread
                 $thread = Model\Message::get($_POST['thread']);
                 // Si no tiene estas notiicaciones bloqueadas en sus preferencias
                 $sql = "\n                            SELECT user_prefer.threads\n                            FROM user_prefer\n                            WHERE user = :user\n                            ";
                 $query = Model\Project::query($sql, array(':user' => $thread->user->id));
                 $spam = $query->fetchColumn(0);
                 if (!$spam) {
                     // Mail al autor del thread
                     // Obtenemos la plantilla para asunto y contenido
                     $template = Template::get(12);
                     // 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 . '/messages#message' . $message->id;
                     $search = array('%MESSAGE%', '%OWNERNAME%', '%USERNAME%', '%PROJECTNAME%', '%PROJECTURL%', '%RESPONSEURL%');
                     $replace = array($_POST['message'], $thread->user->name, $_SESSION['user']->name, $projectData->name, $project_url, $response_url);
                     $content = \str_replace($search, $replace, $template->text);
                     $mailHandler = new Mail();
                     $mailHandler->to = $thread->user->email;
                     $mailHandler->toName = $thread->user->name;
                     $mailHandler->subject = $subject;
                     $mailHandler->content = $content;
                     $mailHandler->html = true;
                     $mailHandler->template = $template->id;
                     $mailHandler->send($errors);
                     unset($mailHandler);
                 }
             } else {
                 // mensaje al autor del proyecto
                 // Obtenemos la plantilla para asunto y contenido
                 $template = Template::get(30);
                 // 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 . '/messages#message' . $message->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);
             }
         }
     }
     throw new Redirection("/project/{$project}/messages#message" . $message->id, Redirection::TEMPORARY);
 }
Пример #3
0
 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));
 }
Пример #4
0
 public static function process($action = 'list', $id = null, $filters = array())
 {
     $node = isset($_SESSION['admin_node']) ? $_SESSION['admin_node'] : \GOTEO_NODE;
     $errors = array();
     switch ($action) {
         case 'add':
             // proyectos que están más allá de edición y con traducción deshabilitada
             $availables = Model\User\Translate::getAvailables('project', $_SESSION['admin_node']);
             if (empty($availables)) {
                 Message::Error(Text::_('No hay más proyectos disponibles para traducir'));
                 throw new Redirection('/admin/translates');
             }
         case 'edit':
         case 'assign':
         case 'unassign':
         case 'send':
             // a ver si tenemos proyecto
             if (empty($id) && !empty($_POST['project'])) {
                 $id = $_POST['project'];
             }
             if (!empty($id)) {
                 $project = Model\Project::getMini($id);
             } elseif ($action != 'add') {
                 Message::Error(Text::_('No hay proyecto sobre el que operar'));
                 throw new Redirection('/admin/translates');
             }
             // asignar o desasignar
             // la id de revision llega en $id
             // la id del usuario llega por get
             $user = $_GET['user'];
             if (!empty($user)) {
                 $userData = Model\User::getMini($user);
                 $assignation = new Model\User\Translate(array('item' => $project->id, 'type' => 'project', 'user' => $user));
                 switch ($action) {
                     case 'assign':
                         // se la ponemos
                         $what = Text::_('Asignado');
                         if ($assignation->save($errors)) {
                             Message::Info(Text::_('Traducción asignada correctamente'));
                             throw new Redirection('/admin/translates/edit/' . $project->id);
                         } else {
                             Message::Error(Text::_('No se ha guardado correctamente. ') . implode(', ', $errors));
                         }
                         break;
                     case 'unassign':
                         // se la quitamos
                         $what = Text::_('Desasignado');
                         if ($assignation->remove($errors)) {
                             Message::Info(Text::_('Traducción desasignada correctamente'));
                             throw new Redirection('/admin/translates/edit/' . $project->id);
                         } else {
                             Message::Error(Text::_('No se ha guardado correctamente. ') . implode(', ', $errors));
                         }
                         break;
                 }
                 if (empty($errors)) {
                     // Evento Feed
                     $log = new Feed();
                     $log->setTarget($userData->id, 'user');
                     $log->populate($what . ' traduccion (admin)', '/admin/translates', \vsprintf('El admin %s ha %s a %s la traducción del proyecto %s', array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('relevant', $what), Feed::item('user', $userData->name, $userData->id), Feed::item('project', $project->name, $project->id))));
                     $log->doAdmin('admin');
                     unset($log);
                 }
                 $action = 'edit';
             }
             // fin asignar o desasignar
             // añadir o actualizar
             // se guarda el idioma original y si la traducción está abierta o cerrada
             if ($_SERVER['REQUEST_METHOD'] == 'POST' && isset($_POST['save'])) {
                 if (empty($id)) {
                     Message::Error(Text::_('Hemos perdido de vista el proyecto'));
                     throw new Redirection('/admin/translates');
                 }
                 // ponemos los datos que llegan
                 $sql = "UPDATE project SET lang = :lang, translate = 1 WHERE id = :id";
                 if (Model\Project::query($sql, array(':lang' => $_POST['lang'], ':id' => $id))) {
                     if ($action == 'add') {
                         Message::Info('El proyecto ' . $project->name . ' se ha habilitado para traducir');
                     } else {
                         Message::Info(Text::_('Datos de traducción actualizados'));
                     }
                     if ($action == 'add') {
                         // Evento Feed
                         $log = new Feed();
                         $log->setTarget($project->id);
                         $log->populate(Text::_('proyecto habilitado para traducirse (admin)'), '/admin/translates', \vsprintf('El admin %s ha %s la traducción del proyecto %s', array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('relevant', 'Habilitado'), Feed::item('project', $project->name, $project->id))));
                         $log->doAdmin('admin');
                         unset($log);
                         throw new Redirection('/admin/translates/edit/' . $project->id);
                     } else {
                         throw new Redirection('/admin/translates');
                     }
                 } else {
                     if ($action == 'add') {
                         Message::Error(Text::_('Ha fallado al habilitar la traducción del proyecto ') . $project->name);
                     } else {
                         Message::Error(Text::_('Ha fallado al actualizar los datos de la traducción'));
                     }
                 }
             }
             if ($action == 'send') {
                 // Informar al autor de que la traduccion está habilitada
                 // Obtenemos la plantilla para asunto y contenido
                 $template = Template::get(26);
                 // Sustituimos los datos
                 $subject = str_replace('%PROJECTNAME%', $project->name, $template->title);
                 $search = array('%OWNERNAME%', '%PROJECTNAME%', '%SITEURL%');
                 $replace = array($project->user->name, $project->name, SITE_URL);
                 $content = \str_replace($search, $replace, $template->text);
                 // iniciamos mail
                 $mailHandler = new Mail();
                 $mailHandler->to = $project->user->email;
                 $mailHandler->toName = $project->user->name;
                 // blind copy a goteo desactivado durante las verificaciones
                 //              $mailHandler->bcc = '*****@*****.**';
                 $mailHandler->subject = $subject;
                 $mailHandler->content = $content;
                 $mailHandler->html = true;
                 $mailHandler->template = $template->id;
                 if ($mailHandler->send()) {
                     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);
                 $action = 'edit';
             }
             $project->translators = Model\User\Translate::translators($id);
             $translators = Model\User::getAll(array('role' => 'translator'));
             // añadimos al dueño del proyecto en el array de traductores
             array_unshift($translators, $project->user);
             return new View('view/admin/index.html.php', array('folder' => 'translates', 'file' => 'edit', 'action' => $action, 'availables' => $availables, 'translators' => $translators, 'project' => $project));
             break;
         case 'close':
             // la sentencia aqui mismo
             // el campo translate del proyecto $id a false
             $sql = "UPDATE project SET translate = 0 WHERE id = :id";
             if (Model\Project::query($sql, array(':id' => $id))) {
                 Message::Info('La traducción del proyecto ' . $project->name . ' se ha finalizado');
                 Model\Project::query("DELETE FROM user_translate WHERE type = 'project' AND item = :id", array(':id' => $id));
                 // Evento Feed
                 $log = new Feed();
                 $log->setTarget($project->id);
                 $log->populate(Text::_('traducción finalizada (admin)'), '/admin/translates', \vsprintf('El admin %s ha dado por %s la traducción del proyecto %s', array(Feed::item('user', $_SESSION['user']->name, $_SESSION['user']->id), Feed::item('relevant', 'Finalizada'), Feed::item('project', $project->name, $project->id))));
                 $log->doAdmin('admin');
                 unset($log);
             } else {
                 Message::Error(Text::_('Falló al finalizar la traducción'));
             }
             break;
     }
     $projects = Model\Project::getTranslates($filters, $node);
     $owners = Model\User::getOwners();
     $translators = Model\User::getAll(array('role' => 'translator'));
     return new View('view/admin/index.html.php', array('folder' => 'translates', 'file' => 'list', 'projects' => $projects, 'filters' => $filters, 'fields' => array('owner', 'translator'), 'owners' => $owners, 'translators' => $translators));
 }
Пример #5
0
 public function dopay($project)
 {
     die('Ya no realizamos pagos secundarios mediante sistema');
     if (\defined('CRON_EXEC')) {
         die('Este proceso no necesitamos lanzarlo automaticamente');
     }
     @mail(\GOTEO_FAIL_MAIL, 'Se ha lanzado el cron ' . __FUNCTION__ . ' en ' . SITE_URL, 'Se ha lanzado manualmente el cron ' . __FUNCTION__ . ' para el proyecto ' . $project . ' en ' . SITE_URL . ' a las ' . date('H:i:s') . ' Usuario ' . $_SESSION['user']->id);
     // 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 ' . $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'));
         }
     }
     $projectData = Model\Project::getMini($project);
     // necesitamos la cuenta del proyecto y que sea la misma que cuando el preapproval
     $projectAccount = Model\Project\Account::get($project);
     if (empty($projectAccount->paypal)) {
         // iniciamos mail
         $mailHandler = new Mail();
         $mailHandler->to = \GOTEO_MAIL;
         $mailHandler->toName = 'Goteo.org';
         $mailHandler->subject = 'El proyecto ' . $projectData->name . ' no tiene cuenta PayPal';
         $mailHandler->content = 'Hola Goteo, el proyecto ' . $projectData->name . ' no tiene cuenta PayPal y se estaba intentando realizar pagos secundarios.';
         $mailHandler->html = false;
         $mailHandler->template = null;
         $mailHandler->send();
         unset($mailHandler);
         die('El proyecto ' . $projectData->name . ' no tiene la cuenta PayPal!!');
     }
     // tratamiento de aportes pendientes
     $query = Model\Project::query("\n                SELECT  *\n                FROM  invest\n                WHERE   invest.status = 1\n                AND     invest.method = 'paypal'\n                AND     invest.project = ?\n                ", array($project));
     $invests = $query->fetchAll(\PDO::FETCH_CLASS, '\\Goteo\\Model\\Invest');
     echo 'Vamos a tratar ' . count($invests) . ' aportes para el proyecto ' . $projectData->name . '<br />';
     foreach ($invests as $key => $invest) {
         $errors = array();
         $userData = Model\User::getMini($invest->user);
         echo 'Tratando: Aporte (id: ' . $invest->id . ') de ' . $userData->name . ' [' . $userData->email . ']<br />';
         if (Paypal::doPay($invest, $errors)) {
             echo 'Aporte (id: ' . $invest->id . ') pagado al proyecto. Ver los detalles en la <a href="/admin/accounts/details/' . $invest->id . '">gestion de transacciones</a><br />';
             $log_text = Text::_("Se ha realizado el pago de %s PayPal al proyecto %s por el aporte de %s (id: %s) del dia %s");
             Model\Invest::setDetail($invest->id, 'payed', 'Se ha realizado el pago secundario al proyecto. Proceso cron/doPay');
         } else {
             echo 'Fallo al pagar al proyecto el aporte (id: ' . $invest->id . '). Ver los detalles en la <a href="/admin/accounts/details/' . $invest->id . '">gestion de transacciones</a><br />' . implode('<br />', $errors);
             $log_text = Text::_("Ha fallado al realizar el pago de %s PayPal al proyecto %s por el aporte de %s (id: %s) del dia %s");
             Model\Invest::setDetail($invest->id, 'pay-failed', 'Fallo al realizar el pago secundario: ' . implode('<br />', $errors) . '. Proceso cron/doPay');
         }
         // Evento Feed
         $log = new Feed();
         $log->setTarget($projectData->id);
         $log->populate('Pago al proyecto encadenado-secundario (cron)', '/admin/accounts', \vsprintf($log_text, array(Feed::item('money', $invest->amount . ' &yen;'), Feed::item('project', $projectData->name, $project), Feed::item('user', $userData->name, $userData->id), Feed::item('system', $invest->id), Feed::item('system', date('d/m/Y', strtotime($invest->invested))))));
         $log->doAdmin();
         unset($log);
         echo '<hr />';
     }
     // 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);
 }
Пример #6
0
 public static function process($debug = false)
 {
     // eliminamos ACL innecesario
     $sql = "DELETE FROM `acl` \n                WHERE id > 1000 \n                AND role_id = 'user' \n                AND user_id != '*' \n                AND (url LIKE '%project/edit%'  OR url LIKE '%project/delete%') \n                AND DATE_FORMAT(from_unixtime(unix_timestamp(now()) - unix_timestamp(`timestamp`)), '%j') > 30\n                ";
     // echo $sql . '<br />';
     $query = Model\Project::query($sql);
     $count = $query->rowCount();
     if ($debug) {
         echo "Eliminados {$count} registros de ACL antiguo.<br />";
     }
     // eliminamos feed antiguo
     $sql1 = "DELETE \n                FROM `feed` \n                WHERE type != 'goteo' \n                AND DATE_FORMAT(from_unixtime(unix_timestamp(now()) - unix_timestamp(`datetime`)), '%j') > 30\n                AND (url NOT LIKE '%updates%' OR url IS NULL)\n                ";
     // echo $sql . '<br />';
     $query1 = Model\Project::query($sql1);
     $count1 = $query1->rowCount();
     if ($debug) {
         echo "Eliminados {$count1} registros de feed.<br />";
     }
     // eliminamos mail antiguo
     $sql2 = "DELETE\n                FROM `mail` \n                WHERE (template != 33 OR template IS NULL)\n                AND DATE_FORMAT(from_unixtime(unix_timestamp(now()) - unix_timestamp(`date`)), '%j') > 30\n                ";
     // echo $sql2 . '<br />';
     $query2 = Model\Project::query($sql2);
     $count2 = $query2->rowCount();
     if ($debug) {
         echo "Eliminados {$count2} registros de mail.<br />";
     }
     // eliminamos registros de imágenes cuyo archivo no esté en el directorio de imágenes
     // busco aportes incompletos con codigo de autorización
     $sql5 = "SELECT * FROM invest WHERE status = -1 AND transaction IS NOT NULL";
     $query5 = Model\Project::query($sql5);
     foreach ($query5->fetchAll(\PDO::FETCH_OBJ) as $row) {
         @mail(\GOTEO_FAIL_MAIL, 'Aporte Incompleto con numero de autorización. En ' . SITE_URL, 'Aporte Incompleto con numero de autorización: <pre>' . print_r($row, 1) . '</pre>');
     }
     // eliminamos aportes incompletos
     /*
     $sql4 = "DELETE
         FROM `invest` 
         WHERE status = -1
         AND DATE_FORMAT(from_unixtime(unix_timestamp(now()) - unix_timestamp(`datetime`)), '%j') > 120
         ";
     
     //echo $sql4 . '<br />';
     $query4 = Model\Project::query($sql4);
     $count4 = $query4->rowCount();
     // -- eliminamos registros relativos a aportes no existentes
     Model\Project::query("DELETE FROM `invest_address` WHERE invest NOT IN (SELECT id FROM `invest`)");
     Model\Project::query("DELETE FROM `invest_detail`  WHERE invest NOT IN (SELECT id FROM `invest`)");
     Model\Project::query("DELETE FROM `invest_reward`  WHERE invest NOT IN (SELECT id FROM `invest`)");
     echo "Eliminados $count4 aportes incompletos y sus registros (recompensa, dirección, detalles) relacionados.<br />";
     */
     if ($debug) {
         echo "<hr /> Iniciamos caducidad de tokens<br/>";
     }
     // eliminamos los tokens que tengan más de 4 días
     $sql5 = "SELECT id, token FROM user WHERE token IS NOT NULL AND token != '' AND token LIKE '%¬%'";
     $query5 = Model\Project::query($sql5);
     foreach ($query5->fetchAll(\PDO::FETCH_OBJ) as $row) {
         $parts = explode('¬', $row->token);
         $datepart = strtotime($parts[2]);
         $today = date('Y-m-d');
         $datedif = strtotime($today) - $datepart;
         $days = round($datedif / 86400);
         if ($days > 4 || !isset($parts[2])) {
             if ($debug) {
                 echo "User: {$row->id}  ;  Token: {$row->token}  ;  Datepart: {$parts['2']}   =>  {$datepart}  ;  Compare: {$today}  =>  {$datedif}  ;  Days: {$days}  ;   ";
             }
             if (Model\Project::query("UPDATE user SET token = '' WHERE id = ?", array($row->id))) {
                 if ($debug) {
                     echo "Token borrado.";
                 }
             } else {
                 if ($debug) {
                     echo "Fallo al borrar Token!!!";
                 }
             }
             if ($debug) {
                 echo "<br />";
             }
         }
     }
     if ($debug) {
         echo "<br />";
     }
     echo 'Verify Listo!';
     return;
 }
Пример #7
0
 *  Goteo is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Affero General Public License for more details.
 *
 *  You should have received a copy of the GNU Affero General Public License
 *  along with Goteo.  If not, see <http://www.gnu.org/licenses/agpl.txt>.
 *
 */
use Goteo\Library\Text, Goteo\Model;
$original = $this['original'];
$user = $this['user'];
$project = $this['project'];
// Lastima que no me sirve ni el getAll ni el getList ni el Published
$projects = array();
$query = Model\Project::query("\n    SELECT\n        project.id as id,\n        project.name as name\n    FROM    project\n    WHERE status = 3\n    ORDER BY project.name ASC\n    ");
foreach ($query->fetchAll(\PDO::FETCH_CLASS) as $item) {
    $projects[$item->id] = $item->name;
}
?>
<div class="widget">
    <p><?php 
echo Text::_('Movemos el aporte de ');
?>
<strong><?php 
echo $user->name;
?>
</strong> <?php 
echo Text::_('al proyecto');
?>
 <strong><?php