Procházet zdrojové kódy

criando jobs de dispatch start e finish schedule + logs diarios dos dispatchs

Gustavo Zanatta před 4 dny
rodič
revize
1c59dcc27b
3 změnil soubory, kde provedl 152 přidání a 0 odebrání
  1. 68 0
      app/Jobs/FinishScheduleJob.php
  2. 72 0
      app/Jobs/StartScheduleJob.php
  3. 12 0
      config/logging.php

+ 68 - 0
app/Jobs/FinishScheduleJob.php

@@ -0,0 +1,68 @@
+<?php
+
+namespace App\Jobs;
+
+use App\Models\Schedule;
+use Carbon\Carbon;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+use Illuminate\Support\Facades\Log;
+
+class FinishScheduleJob implements ShouldQueue
+{
+  use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+  public function __construct(
+    public int $scheduleId
+  ) {}
+
+  public function handle()
+  {
+    try {
+      $schedule = Schedule::find($this->scheduleId);
+      $date_cleaned = Carbon::parse($schedule->date)->format('Y-m-d');
+  
+      if (!$schedule) {
+        return;
+      }
+  
+      Log::channel('schedule_end_jobs')->info('Verificando status do agendamento id: ' . $schedule->id);
+      Log::channel('schedule_end_jobs')->info('Status do agendamento: ' . $schedule->status);
+  
+      if ($schedule->status !== 'started') {
+        return;
+      }
+  
+      Log::channel('schedule_end_jobs')->info('Verificando data');
+      Log::channel('schedule_end_jobs')->info('Data do agendamento: ' . $date_cleaned);
+      Log::channel('schedule_end_jobs')->info('Data atual: ' . now()->toDateString());
+      
+
+      if ($date_cleaned > now()->toDateString()) {
+        return;
+      }
+
+      Log::channel('schedule_end_jobs')->info('Verificando horário');
+      Log::channel('schedule_end_jobs')->info('Horário do agendamento: ' . $schedule->end_time);
+      Log::channel('schedule_end_jobs')->info('Horário atual: ' . now()->toTimeString());
+  
+      $end_date_time = Carbon::parse($date_cleaned . ' ' . $schedule->end_time);
+      
+      if ($end_date_time > now()) {
+        return;
+      }
+  
+      Log::channel('schedule_end_jobs')->info('Validado com sucesso, atualizado agendamento id: ' . $schedule->id . ' para status finalizado');
+  
+      $schedule->update([
+        'status' => 'finished'
+      ]);
+    } catch (\Exception $e) {
+      Log::channel('schedule_end_jobs')->error('Erro ao finalizar agendamento id: ' . $this->scheduleId . '. Erro: ' . $e->getMessage());
+      return;
+    }
+  }
+}

+ 72 - 0
app/Jobs/StartScheduleJob.php

@@ -0,0 +1,72 @@
+<?php
+
+namespace App\Jobs;
+
+use App\Models\Schedule;
+use Carbon\Carbon;
+use Illuminate\Bus\Queueable;
+use Illuminate\Contracts\Queue\ShouldQueue;
+use Illuminate\Foundation\Bus\Dispatchable;
+use Illuminate\Queue\InteractsWithQueue;
+use Illuminate\Queue\SerializesModels;
+use Illuminate\Support\Facades\Log;
+
+class StartScheduleJob implements ShouldQueue
+{
+  use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;
+
+  public function __construct(
+    public int $scheduleId
+  ) {}
+
+  public function handle()
+  {
+    try {
+      $schedule = Schedule::find($this->scheduleId);
+      $date_cleaned = Carbon::parse($schedule->date)->format('Y-m-d');
+  
+      if (!$schedule) {
+        return;
+      }
+  
+      Log::channel('schedule_start_jobs')->info('Verificando status do agendamento id: ' . $schedule->id);
+      Log::channel('schedule_start_jobs')->info('Status do agendamento: ' . $schedule->status);
+  
+      if ($schedule->status !== 'paid') {
+        return;
+      }
+      
+      Log::channel('schedule_start_jobs')->info('Verificando data');
+      Log::channel('schedule_start_jobs')->info('Data do agendamento: ' . $date_cleaned);
+      Log::channel('schedule_start_jobs')->info('Data atual: ' . now()->toDateString());
+      
+      if ($date_cleaned > now()->toDateString()) {
+        return;
+      
+      }
+      Log::channel('schedule_start_jobs')->info('Verificando horário');
+      Log::channel('schedule_start_jobs')->info('Horário do agendamento: ' . $schedule->start_time);
+      Log::channel('schedule_start_jobs')->info('Horário atual: ' . now()->toTimeString());
+
+      $start_date_time = Carbon::parse($date_cleaned . ' ' . $schedule->start_time);
+      
+      if ($start_date_time > now()) {
+        return;
+      }
+  
+      Log::channel('schedule_start_jobs')->info('Validado com sucesso, atualizado agendamento id: ' . $schedule->id . ' para status iniciado');
+  
+      $schedule->update([
+        'status' => 'started'
+      ]);
+      $date_time_dispatch = Carbon::parse($date_cleaned . ' ' . $schedule->end_time);
+      FinishScheduleJob::dispatch($schedule->id)->delay($date_time_dispatch); 
+
+      // dispatch de teste em local 
+      // FinishScheduleJob::dispatch($schedule->id)->delay(now()->addSeconds(15)); 
+    } catch (\Exception $e) {
+      Log::channel('schedule_start_jobs')->error('Erro ao iniciar agendamento id: ' . $this->scheduleId . '. Erro: ' . $e->getMessage());
+      return;
+    }
+  }
+}

+ 12 - 0
config/logging.php

@@ -133,6 +133,18 @@ return [
             'level' => 'info',
             'days' => 7,
         ],
+        'schedule_start_jobs' => [
+            'driver' => 'daily',
+            'path' => storage_path('logs/schedules/start_jobs.log'),
+            'level' => 'info',
+            'days' => 7,
+        ],
+        'schedule_end_jobs' => [
+            'driver' => 'daily',
+            'path' => storage_path('logs/schedules/end_jobs.log'),
+            'level' => 'info',
+            'days' => 7,
+        ],
 
     ],