Пример #1
0
 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);
     }
 }
Пример #2
0
 /**
  * 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 . ' &yen;') . ' 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 . ' &yen;') . ' 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;
 }
Пример #3
0
 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 . ' &euro;'), Feed::item('project', $projectData->name, $projectData->id))));
         $log->doAdmin('money');
         // evento público
         $log_html = Text::html('feed-invest', Feed::item('money', $invest->amount . ' &euro;'), 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 . ' &euro;'), 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 . ' &euro;') . ' 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 . ' &euro;'), 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 . ' &euro;'), 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);
 }
Пример #4
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));
 }
Пример #5
0
 /**
  * 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');
 }
Пример #6
0
 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;
     }
 }
Пример #7
0
 /**
  * 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);
 }
Пример #8
0
 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 . ' &yen; <br />';
         }
         $execute = false;
         $cancelAll = false;
         if ($debug) {
             echo 'Obtenido: ' . $project->amount . ' &yen;<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 . ' &#37; 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 . ' &yen; (' . $per_amount . '&#37;) 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 . ' &yen; (' . \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 . ' &yen; (' . \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 . ' &yen;'), 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 . ' &yen;'), 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);
 }
Пример #9
0
 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 . ' &yen;'), Feed::item('project', $projectData->name, $projectData->id))));
         $log->doAdmin('money');
         // evento público
         $log_html = Text::html('feed-invest', Feed::item('money', $invest->amount . ' &yen;'), 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');
 }
Пример #10
0
 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 . ' &euro;'), 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 . ' &euro;'), 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;
 }