/** Alimenta la cola de procesamiento de producciones * * @return boolean */ public function feedQueue() { //El repositorio de datos debe ser cargado if (!count($this->dataRepository) > 0) { return false; } foreach ($this->dataRepository as $data) { $queue = new QueueProductions(); if (QueueProductions::existsByLink($data[1])) { continue; } $queue->name = $data[0]; $queue->link = $data[1]; $queue->date_creation = DateUtil::getCurrentTime(); $queue->save(); } }
/** Indica si una produccion existe en la cola de procesamiento dado por su link * * @param type $name El nombre de la produccion * @param type $processed (Opcional = False) Si la produccion ya fue procesada * @return type */ static function existsByLink($link, $processed = false) { if (!$processed) { return QueueProductions::all()->where(QueueProductions::ATTR_LINK, $link)->count() > 0; } else { return DB::table('queue_productions_autoupdate')->where(QueueProductions::ATTR_LINK, $link)->whereNotNull(QueueProductions::ATTR_DATE_PROCESSED)->count() > 0; } }
/** Agrega una nueva produccion desde un link * * @param Request $request * @return type */ function ajaxAddFromIMDB(Request $request) { if (!$request->ajax()) { return; } $data = $request->all(); $name = $data["name"]; $link = $data["link"]; if (QueueProductions::existsByLink($link, true)) { return json_encode(array("msg" => "<span class='glyphicon glyphicon-remove-circle'></span> " . $name . " Ya fue agregado y procesado anteriormente")); } $provider = new ProductionProvider($name, $link); $production_id = $provider->save(); if (is_null($production_id)) { return json_encode(array("msg" => "<span class='glyphicon glyphicon-remove-circle'></span> " . $name . " El acceso a la información de la producción no fue posible intentalo de nuevo.")); } //Verifica si ya existia en la cola de procesamiento, si es asi lo indica como procesado y si no, lo crea. if (QueueProductions::existsByLink($link)) { $queue = QueueProductions::where(QueueProductions::ATTR_LINK, $link)->get()[0]; $queue->date_processed = DateUtil::getCurrentTime(); $queue->production_id = $production_id; $queue->save(); return json_encode(array("msg" => "<span class='glyphicon glyphicon-ok-circle'></span> " . $name . " Procesado con éxito")); } else { $queue = new QueueProductions(); $queue->production_id = $production_id; $queue->name = $name; $queue->link = $link; $queue->date_creation = DateUtil::getCurrentTime(); $queue->date_processed = DateUtil::getCurrentTime(); $queue->save(); return json_encode(array("msg" => "<span class='glyphicon glyphicon-ok-circle'></span> " . $name . " Agregado y procesado con éxito")); } }
private function cron() { \Event::listen('cron.collectJobs', function () { /** * CRON: Alimentación de cola de producciones * DESCRIPCION: Alimenta la cola de producciones que se van a procesar * EJECUCION: Cada 3 minutos */ \Cron::add(AutoProcess::CRON_PRODUCTIONS_FEED, '*/3 * * * *', function () { if (!AutoProcess::isActived(AutoProcess::CRON_PRODUCTIONS_FEED)) { return "Desactivado"; } $productionFeed = new ProductionFeed(); //Carga datos de producciones (peliculas) en el repositorio $productionFeed->loadRepository(); //Alimenta la cola de actualizaciones de peliculas $productionFeed->feedQueue(); return count($productionFeed->dataRepository) . " Producciones cargadas en cola"; }); /** * CRON: Seguimiento de produccion * DESCRIPCION: Toma las producciones en cola indicadas y las procesa obtienendo todos los datos de la produccion * EJECUCION: Cada minuto */ \Cron::add(AutoProcess::CRON_PRODUCTION_TRACK, '* * * * *', function () { if (!AutoProcess::isActived(AutoProcess::CRON_PRODUCTION_TRACK)) { return "Desactivado"; } $queue = QueueProductions::where(QueueProductions::ATTR_DATE_PROCESSED, null)->orderBy(QueueProductions::ATTR_ID, "ASC")->take(1)->get(); foreach ($queue as $production) { $provider = new ProductionProvider($production->name, $production->link); $production_id = $provider->save(); //Indica el registro como procesado. Esto ocasiona que la produccion ya no se vuelva a actualizar, hasta una nueva cola. $production->production_id = $production_id; $production->date_processed = DateUtil::getCurrentTime(); $production->save(); return $production->name . " Agregado"; } return "Sin cola"; }); /** * CRON: Seguimiento de persona * DESCRIPCION: Toma las personas indicadas y las procesa para obtener todos sus datos * EJECUCION: Cada minuto */ \Cron::add(AutoProcess::CRON_PERSON_TRACK, '* * * * *', function () { if (!AutoProcess::isActived(AutoProcess::CRON_PERSON_TRACK)) { return "Desactivado"; } $queue = QueuePersons::where(QueuePersons::ATTR_DATE_PROCESSED, null)->orderBy(QueuePersons::ATTR_ID, "DESC")->take(1)->get(); foreach ($queue as $person) { $provider = new PersonProvider($person->name, $person->link); $provider->save(); //Indica el registro como procesado. Esto ocasiona que la produccion ya no se vuelva a actualizar, hasta una nueva cola. $person->date_processed = DateUtil::getCurrentTime(); $person->save(); return $person->name . " Agregado"; } return "Sin cola"; }); /** * CRON: Envio de correo de notificacion de producciones disponibles * DESCRIPCION: Verifica todos las producciones en seguimientos por parte de los usuarios premium y cuando esten disponibles les envia un correo notificandoles * EJECUCION: Cada 12 horas */ \Cron::add(AutoProcess::CRON_USER_PRODUCTION_TRACK_SEND_MAIL, '0 */12 * * *', function () { if (!AutoProcess::isActived(AutoProcess::CRON_USER_PRODUCTION_TRACK_SEND_MAIL)) { return "Desactivado"; } //Obtiene todos los usuarios premium $users = User::where(User::ATTR_ROLE, User::ROLE_SUSCRIPTOR_PREMIUM)->get(); foreach ($users as $user) { //Obtiene las producciones que siguen que ya se encuentran disponibles y que no sean notificado por correo $productions = $user->tracks()->wherePivot(User::ATTR_TRACK_PIVOT_MAILED, 0)->where(Production::ATTR_STATE, Production::STATE_ACTIVE)->get(); if (count($productions) == 0) { continue; } if (count($productions) > 1) { $description_email = "<p>Este mensaje es para informate que varias producciones que te gustaria ver en nuestra plataforma ya se encuentran disponibles y las puedes ver cuando quieras.</p>" . "<div style='text-align:center;'>" . "<h2>Nuevas producciones disponibles para ti</h2>" . "</div>" . "<div style='text-align:center;'>"; } else { $description_email = "<p>Este mensaje es para informate que una producción que te gustaria ver en nuestra plataforma ya se encuentran disponible y la puede ver cuando quieras.</p>" . "<div style='text-align:center;'>" . "<h2>Nueva producción disponible para ti</h2>" . "</div>" . "<div style='text-align:center;'>"; } foreach ($productions as $production) { //Notifica las producciones disponibles asociadas $description_email .= "<a href='" . AutoProcess::URL_SITE . "production/" . $production->slug . "'><img width='192px' height='289px' style='margin: 0px 10px;' src='" . $production->image . "'></a>"; $production->pivot->mailed = 1; $production->pivot->save(); } $description_email .= "</div>"; //Envia el correo de notificacion del usuario $email = new Email(count($productions) > 1 ? "¡Hay varias producciones que te gustaria ver que ya estan disponible!" : "¡Una producción que te gustaria ver ya esta disponible!", $user[User::ATTR_EMAIL], [Email::VAR_NAME => $user->name, Email::VAR_DESCRIPTION => $description_email]); $email->queue(); } return "Notificaciones realizadas (Si aplican)"; }); /** * CRON: Genera el sitemap.xml del sitio * EJECUCION: Cada Semana */ \Cron::add(AutoProcess::CRON_GENERATE_SITEMAP, '0 0 * * 0', function () { //Url standards del sitio web $urls = array(AutoProcess::URL_SITE, AutoProcess::URL_SITE . "doc/terms", AutoProcess::URL_SITE . "doc/privacypolicy", AutoProcess::URL_SITE . "doc/cookies-policy", AutoProcess::URL_SITE . "doc/help", AutoProcess::URL_SITE . "catalogue"); $file = fopen(public_path("sitemap.xml"), "w"); fwrite($file, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" . PHP_EOL); fwrite($file, "<urlset xmlns=\"http://www.sitemaps.org/schemas/sitemap/0.9\"> " . PHP_EOL); for ($i = 0; $i < count($urls); $i++) { fwrite($file, "<url><loc>" . $urls[$i] . "</loc></url>" . PHP_EOL); } //Inserta las url de cada persona $persons = \App\System\Models\Person::whereNotNull(Person::ATTR_BIOGRAPHY)->get(); foreach ($persons as $person) { fwrite($file, "<url><loc>" . AutoProcess::URL_SITE . "person/" . $person->slug . "</loc></url>" . PHP_EOL); } //Inserta las url de todas las producciones $productions = Production::all(); foreach ($productions as $production) { fwrite($file, "<url><loc>" . AutoProcess::URL_SITE . "production/" . $production->slug . "</loc></url>" . PHP_EOL); } fwrite($file, "</urlset>" . PHP_EOL); fclose($file); return "Sitemap.xml generado (" . count($persons) . " Personas) (" . count($productions) . " Producciones)"; }); /** * CRON: Publica automaticamente una produccion programada * EJECUCION: Cada hora */ \Cron::add(AutoProcess::CRON_PRODUCTION_AUTO_PUBLISH, '0 */4 * * *', function () { $productions = Production::where(Production::ATTR_STATE, Production::STATE_PROGRAMMED)->orderBy(Production::ATTR_UPDATED_AT, "ASC")->take(1)->get(); foreach ($productions as $production) { $production->state = Production::STATE_ACTIVE; $production->save(); return $production->title . " Publicado"; } return "No hay producciones programadas"; }); }); }
<div class="col-sm-6 text-justify" id="attention-request"> <b>Atención: </b> Las solicitud de producciones de los usuarios no nos obliga a incluir dicha producción. Las producciones solicitadas sirven al sistema como referencia de las preferencias de los usuarios, lo que puede ocasionar que las priorice y las incluya en el catalogo antes que otras producciones no indexadas o no disponibles. </div> </div> <div id="set-request" class="col-lg-12 text-left"> <button id="open-modal-request" class="btn btn-primary"><span class="glyphicon glyphicon-plus-sign"></span> Solicitar producción</button> </div> @if(count($requests)>0) <table id="table-requests" class="table text-left table-striped table-responsive"> <th>Fecha</th><th>Producción</th><th class="link-imdb">Enlace IMDB</th><th class="text-center">Estado</th> @foreach($requests as $request) <?php $queue = QueueProductions::find($request->queue_id); if (is_null($queue->date_processed)) { $status = "in-queue"; } else { $production = Production::find($queue->production_id); if ($production->state == Production::STATE_ACTIVE) { $status = "available"; } else { $status = "in-wait"; } } ?> <tr> <td>Hace {{DateUtil::calculateDifference($request->date)}}</td><td>{{$queue->name}}</td><td class="link-imdb">{{$queue->link}}</td><td class="text-center"><span class="glyphicon glyphicon-flag {{$status}}"></span></td> </tr> @endforeach