Bläddra i källkod

feat: :sparkles: feat(agendamento-sob-medida) correção e validaçôes gerais da regra de negoci

Foram implementados métodos de verificação de agendamentos para validar disponibilidade e aplicar regras de bloqueio entre cliente e prestador, considerando conflitos de horário, limite semanal e disponibilidade do prestador.

fase:dev | origin:escopo
kayo henrique 1 vecka sedan
förälder
incheckning
db6ee452a9

+ 15 - 0
app/Http/Controllers/ScheduleController.php

@@ -120,4 +120,19 @@ class ScheduleController extends Controller
       return $this->errorResponse($e->getMessage(), 422);
     }
   }
+  public function clientProviderBlocks(Request $request): JsonResponse
+  {
+    $validated = $request->validate([
+      'client_id' => 'required|integer|exists:clients,id',
+      'provider_id' => 'required|integer|exists:providers,id',
+    ]);
+
+    $blocks = $this->scheduleService->getClientProviderBlocks(
+      (int) $validated['client_id'],
+      (int) $validated['provider_id'],
+    );
+
+    return $this->successResponse(payload: $blocks);
+  }
 }
+

+ 42 - 0
app/Services/ScheduleService.php

@@ -16,6 +16,8 @@ use Illuminate\Support\Facades\Log;
 
 class ScheduleService
 {
+  private const EXCLUDED_STATUSES = ['cancelled', 'rejected'];
+
   public function getAll()
   {
     return Schedule::with(['client.user', 'provider.user', 'address'])
@@ -319,5 +321,45 @@ class ScheduleService
       Log::error("Erro ao cancelar agendamento: " . $e->getMessage());
       throw new \Exception("Não foi possível cancelar o agendamento.");
     }
+  }
+          public function getClientProviderBlocks(int $clientId, int $providerId): array
+  {
+    $today = Carbon::today()->format('Y-m-d');
+
+    $schedules = Schedule::where('client_id', $clientId)
+      ->where('provider_id', $providerId)
+      ->whereNotIn('status', self::EXCLUDED_STATUSES)
+      ->whereDate('date', '>=', $today)
+      ->orderBy('date')
+      ->orderBy('start_time')
+      ->get(['id', 'date', 'start_time', 'end_time', 'status']);
+
+    $existingSchedules = $schedules->map(function ($schedule) {
+      return [
+        'id' => $schedule->id,
+        'date' => Carbon::parse($schedule->date)->format('Y-m-d'),
+        'start_time' => $schedule->start_time,
+        'end_time' => $schedule->end_time,
+        'status' => $schedule->status,
+      ];
+    })->values();
+
+    $fullyBlockedWeeks = $schedules
+      ->groupBy(function ($schedule) {
+        return Carbon::parse($schedule->date)
+          ->startOfWeek(Carbon::SUNDAY)
+          ->format('Y-m-d');
+      })
+      ->filter(function ($weekSchedules) {
+        return $weekSchedules->count() >= 2;
+      })
+      ->keys()
+      ->values();
+
+    return [
+      'existing_schedules' => $existingSchedules,
+      'fully_blocked_weeks' => $fullyBlockedWeeks,
+    ];
   }
 }
+

+ 1 - 0
routes/authRoutes/schedule.php

@@ -6,6 +6,7 @@ use Illuminate\Support\Facades\Route;
 Route::get('/schedules', [ScheduleController::class, 'index'])->middleware('permission:config.schedule,view');
 Route::get('/schedules/grouped-by-client', [ScheduleController::class, 'groupedByClient'])->middleware('permission:config.schedule,view');
 Route::get('/schedules/finished', [ScheduleController::class, 'finished'])->middleware('permission:config.schedule,view');
+Route::get('/schedule/client-provider-blocks', [ScheduleController::class, 'clientProviderBlocks'])->middleware('permission:config.schedule,add');
 Route::get('/schedule/{id}', [ScheduleController::class, 'show'])->middleware('permission:config.schedule,view');
 Route::post('/schedule', [ScheduleController::class, 'store'])->middleware('permission:config.schedule,add');
 Route::put('/schedule/{id}', [ScheduleController::class, 'update'])->middleware('permission:config.schedule,edit');