public static function Projects($debug = false) { // proyectos a notificar $projects = Model\Project::review(); // para cada uno, foreach ($projects as $project) { // por ahora solo tratamos los de primera ronda y hasta 2 meses tras la financiación if ($project->days > 40 || $project->days > 360) { continue; } if ($debug) { echo "Proyecto {$project->name}, Impulsor: {$project->user->name}, email: {$project->user->email}, estado {$project->status}, lleva {$project->days} dias<br />"; } // primero los que no se bloquean // Recuerdo al autor proyecto, 2 meses despues de campaña finalizada if ($project->days == 140) { // si quedan recompensas/retornos pendientes por cumplir if (!Model\Project\Reward::areFulfilled($project->id) || !Model\Project\Reward::areFulfilled($project->id, 'social')) { if ($debug) { echo "Recompensas/Retornos pendientes<br />"; } Send::toOwner('2m_after', $project); } else { if ($debug) { echo "Recompensas/Retornos cumplidas, no se envía<br />"; } } } // Recuerdo al autor proyecto, 8 meses despues de campaña finalizada if ($project->days == 320) { // si quedan retornos pendientes por cumplir if (!Model\Project\Reward::areFulfilled($project->id, 'social')) { if ($debug) { echo "Retornos pendientes<br />"; } Send::toOwner('8m_after', $project); } else { if ($debug) { echo "Retornos cumplidos, no se envía<br />"; } } } // ahora checkeamos bloqueo de consejos $prefs = Model\User::getPreferences($project->owner); if ($prefs->tips) { if ($debug) { echo "Bloqueado por preferencias<hr />"; } continue; } // flag de aviso $avisado = false; // Consejos/avisos puntuales switch ($project->days) { // NO condicionales case 1: // Difunde, difunde, difunde // Difunde, difunde, difunde case 2: // Comienza por lo más próximo // Comienza por lo más próximo case 3: // Una acción a diario, por pequeña que sea // Una acción a diario, por pequeña que sea case 4: // Llama a todas las puertas // Llama a todas las puertas case 5: // Busca dónde está tu comunidad // Busca dónde está tu comunidad case 8: // Agradece en público e individualmente $template = 'tip_' . $project->days; if ($debug) { echo "Envío {$template}<br />"; } Send::toOwner($template, $project); break; // periodico condicional // periodico condicional case 6: // Publica novedades! // y se repite cada 6 días (fechas libres) mientras no haya posts // Publica novedades! // y se repite cada 6 días (fechas libres) mientras no haya posts case 12: case 18: case 24: case 30: case 36: // si ya hay novedades, nada if (Model\Blog::hasUpdates($project->id)) { if ($debug) { echo "Ya ha publicado novedades<br />"; } } else { if ($debug) { echo "Envío aviso de que no ha publicado novedades<br />"; } Send::toOwner('any_update', $project); $avisado = true; } break; // comprobación periódica pero solo un envío // comprobación periódica pero solo un envío case 7: // Apóyate en quienes te van apoyando , si más de 20 cofinanciadores // o en cuanto llegue a 20 backers (en fechas libres) // Apóyate en quienes te van apoyando , si más de 20 cofinanciadores // o en cuanto llegue a 20 backers (en fechas libres) case 14: case 17: case 21: case 24: case 27: // Si ya se mandó esta plantilla (al llegar a los 20 por primera vez) no se envía de nuevo $sql = "\n SELECT\n id\n FROM mail\n WHERE mail.email = :email\n AND mail.template = 46\n ORDER BY mail.date DESC\n LIMIT 1"; $query = Model\Project::query($sql, array(':email' => $project->user->email)); $sended = $query->fetchColumn(0); if (!$sended) { if ($project->num_investors >= 20) { if ($debug) { echo "Tiene 20 backers y no se le habia enviado aviso antes<br />"; } Send::toOwner('20_backers', $project); } else { if ($debug) { echo "No llega a los 20 backers<br />"; } } } else { if ($debug) { echo "Ya enviado<br />"; } } break; case 9: // Busca prescriptores e implícalos // si no tiene padrinos if ($project->patrons > 0) { if ($debug) { echo "Tiene padrino<br />"; } } else { if ($debug) { echo "No tiene padrino<br />"; } Send::toOwner('tip_9', $project); } break; case 10: // Luce tus recompensas y retornos // que no se envie a los que solo tienen recompensas de agradecimiento $thanksonly = true; // recompensas $rewards = Model\Project\Reward::getAll($project->id, 'individual', \LANG); foreach ($rewards as $rew) { if ($rew->icon != 'thanks') { $thanksonly = false; break; // ya salimos del bucle, no necesitamos más } } if ($thanksonly) { if ($debug) { echo "Solo tiene recompensas de agradecimiento<br />"; } } else { if ($debug) { echo "Tienen recompensas<br />"; } uasort($rewards, function ($a, $b) { if ($a->amount == $b->amount) { return 0; } return $a->amount > $b->amount ? 1 : -1; }); // sacar la primera y la última $lower = reset($rewards); $project->lower = $lower->reward; $higher = end($rewards); $project->higher = $higher->reward; Send::toOwner('tip_10', $project); } break; case 11: // Refresca tu mensaje de motivacion // si no tiene video motivacional if (empty($project->video)) { if ($debug) { echo "No tiene video motivacional<br />"; } Send::toOwner('tip_11', $project); } else { if ($debug) { echo "Tiene video motivacional<br />"; } } break; case 15: // Sigue los avances y calcula lo que falta // si no ha llegado al mínimo if ($project->invested < $project->mincost) { if ($debug) { echo "No ha llegado al mínimo<br />"; } Send::toOwner('tip_15', $project); } else { if ($debug) { echo "Ha llegado al mínimo<br />"; } } break; case 25: // No bajes la guardia! // si no ha llegado al mínimo if ($project->invested < $project->mincost) { if ($debug) { echo "No ha llegado al mínimo<br />"; } Send::toOwner('two_weeks', $project); } else { if ($debug) { echo "Ha llegado al mínimo<br />"; } } break; case 32: // Al proyecto le faltan 8 días para archivarse // si no ha llegado al mínimo if ($project->invested < $project->mincost) { if ($debug) { echo "No ha llegado al mínimo<br />"; } Send::toOwner('8_days', $project); } else { if ($debug) { echo "Ha llegado al mínimo<br />"; } } break; case 38: // Al proyecto le faltan 2 días para archivarse // si no ha llegado al mínimo pero está por encima del 70% if ($project->invested < $project->mincost && $project->percent >= 70) { if ($debug) { echo "No ha llegado al mínimo<br />"; } Send::toOwner('2_days', $project); } else { if ($debug) { echo "Ha llegado al mínimo o lleva menos de 70%<br />"; } } break; } // Avisos periodicos // si lleva más de 15 días: si no se han publicado novedades en la última semana // Ojo! que si no a enviado ninguna no lanza este sino la de cada 6 días if (!$avisado && $project->days > 15) { if ($debug) { echo "ya lleva una quincena de campaña, verificamos novedades<br />"; } // veamos si ya le avisamos hace una semana // Si ya se mandó esta plantilla (al llegar a los 20 por primera vez) no se envía de nuevo $sql = "\n SELECT\n id,\n DATE_FORMAT(\n from_unixtime(unix_timestamp(now()) - unix_timestamp(date))\n , '%j'\n ) as days\n FROM mail\n WHERE mail.email = :email\n AND mail.template = 23\n ORDER BY mail.date DESC\n LIMIT 1"; $query = Model\Project::query($sql, array(':email' => $project->user->email)); $lastsend = $query->fetchObject(); if (!$lastsend->id || $lastsend->days > 7) { // veamos cuanto hace de la última novedad $sql = "\n SELECT\n DATE_FORMAT(\n from_unixtime(unix_timestamp(now()) - unix_timestamp(date))\n , '%j'\n ) as days\n FROM post\n INNER JOIN blog\n ON post.blog = blog.id\n AND blog.type = 'project'\n AND blog.owner = :project\n WHERE post.publish = 1\n ORDER BY post.date DESC\n LIMIT 1"; $query = Model\Project::query($sql, array(':project' => $project->id)); $lastUpdate = $query->fetchColumn(0); if ($lastUpdate > 7) { if ($debug) { echo "Ultima novedad es de hace más de una semana<br />"; } Send::toOwner('no_updates', $project); } elseif (is_numeric($lastUpdate)) { if ($debug) { echo "Publicó novedad hace menos de una semana<br />"; } } else { if ($debug) { echo "No se ha publicado nada, recibirá el de cada 6 días<br />"; } } } else { if ($debug) { echo "Se le avisó por novedades hace menos de una semana<br />"; } } } if ($debug) { echo "<hr />"; } } if ($debug) { echo "<br />Auto-tips Listo!<hr />"; } return; }
public function profile($option = 'profile', $action = 'edit') { // tratamos el post segun la opcion y la acion $user = $_SESSION['user']; // salto al perfil público if ($option == 'public') { throw new Redirection('/user/profile/' . $user->id); } // vip/recomendador tiene una imagen adicional $vip = $option == 'profile' && isset($user->roles['vip']) ? Model\User\Vip::get($user->id) : null; if ($_SERVER['REQUEST_METHOD'] == 'POST') { $log_action = null; $errors = array(); switch ($option) { // perfil publico case 'profile': Dashboard\Profile::process_profile($user, $vip, $errors, $log_action); break; // datos personales // datos personales case 'personal': Dashboard\Profile::process_personal($user->id, $errors, $log_action); break; //cambio de email y contraseña //cambio de email y contraseña case 'access': Dashboard\Profile::process_access($user, $errors, $log_action); break; // preferencias de notificación // preferencias de notificación case 'preferences': Dashboard\Profile::process_preferences($user->id, $errors, $log_action); break; } if (!empty($log_action)) { // Evento Feed $log = new Feed(); $log->setTarget($user->id, 'user'); $log->populate('usuario ' . $log_action . ' (dashboard)', '/admin/users', \vsprintf('%s ha %s desde su dashboard', array(Feed::item('user', $user->name, $user->id), Feed::item('relevant', $log_action)))); $log->doAdmin('user'); unset($log); } } $viewData = array('menu' => self::menu(), 'section' => __FUNCTION__, 'option' => $option, 'action' => $action, 'errors' => $errors, 'user' => $user); switch ($option) { case 'profile': $viewData['interests'] = Model\User\Interest::getAll(); if ($_POST) { foreach ($_POST as $k => $v) { if (!empty($v) && preg_match('/web-(\\d+)-edit/', $k, $r)) { $viewData[$k] = true; break; } } } if (!empty($_POST['web-add'])) { $last = end($user->webs); if ($last !== false) { $viewData["web-{$last->id}-edit"] = true; } } if (isset($user->roles['vip'])) { $viewData['vip'] = Model\User\Vip::get($user->id); } break; case 'personal': $viewData['personal'] = Model\User::getPersonal($user->id); break; case 'access': // si es recover, en contraseña actual tendran que poner el username if ($action == 'recover') { $viewData['message'] = Text::get('dashboard-password-recover-advice'); } break; case 'preferences': $viewData['preferences'] = Model\User::getPreferences($user->id); break; } return new View('view/dashboard/index.html.php', $viewData); }