Parcourir la source

fix: :bug: corregir validacoes e informacoes dashboard

corrigir as validacoes do dashboard e as exibicoes da informacao

fase:dev | origin:bug-interno
Gustavo Zanatta il y a 3 semaines
Parent
commit
fd478c04a0
2 fichiers modifiés avec 92 ajouts et 22 suppressions
  1. 39 0
      app/Rules/ScheduleBusinessRules.php
  2. 53 22
      app/Services/DashboardService.php

+ 39 - 0
app/Rules/ScheduleBusinessRules.php

@@ -11,6 +11,7 @@ use App\Models\Schedule;
 use App\Models\ScheduleProposal;
 use Carbon\Carbon;
 use Illuminate\Support\Facades\Log;
+use Illuminate\Support\Collection;
 
 class ScheduleBusinessRules
 {
@@ -279,4 +280,42 @@ class ScheduleBusinessRules
 
       return true;
     }
+
+    // -------------------------------------------------------------------------
+    // Métodos de consulta em batch — usados para filtragem em listagens.
+    // Não lançam exceção: retornam coleções de IDs para uso em whereIn/whereNotIn.
+    // -------------------------------------------------------------------------
+
+    /**
+     * Retorna os IDs de prestadores que bloquearam o cliente OU foram bloqueados por ele.
+     * Centraliza ambas as direções de bloqueio em um único método para uso em listagens.
+     *
+     * @param int $client_id
+     * @return Collection
+     */
+    public static function getBlockedProviderIdsForClient(int $client_id): Collection
+    {
+        // Prestadores que bloquearam este cliente (ProviderClientBlock)
+        $blockedByProvider = ProviderClientBlock::where('client_id', $client_id)
+            ->pluck('provider_id');
+
+        // Prestadores que este cliente bloqueou (ClientProviderBlock)
+        $blockedByClient = ClientProviderBlock::where('client_id', $client_id)
+            ->pluck('provider_id');
+
+        return $blockedByProvider->merge($blockedByClient)->unique()->values();
+    }
+
+    /**
+     * Retorna os IDs de prestadores que possuem pelo menos um dia de trabalho cadastrado.
+     * Garante que apenas prestadores ativos na plataforma apareçam em listagens.
+     *
+     * @return Collection
+     */
+    public static function getProviderIdsWithWorkingDays(): Collection
+    {
+        return ProviderWorkingDay::select('provider_id')
+            ->distinct()
+            ->pluck('provider_id');
+    }
 }

+ 53 - 22
app/Services/DashboardService.php

@@ -8,6 +8,7 @@ use App\Models\ClientFavoriteProvider;
 use App\Models\Provider;
 use App\Models\Review;
 use App\Models\Schedule;
+use App\Rules\ScheduleBusinessRules;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\DB;
 use Illuminate\Support\Facades\Log;
@@ -21,27 +22,37 @@ class DashboardService
     $user = Auth::user();
     $cliente = Client::where('user_id', $user->id)->first();
     $headerBar = [
-      'rating' => $cliente->average_rating,
-      'total_ratings' => Review::where('reviews.origin', 'provider')->leftJoin('schedules', 'schedules.id', '=', 'reviews.schedule_id')->where('schedules.client_id', $cliente->id)->count(),
+      'rating'        => $cliente->average_rating,
+      'total_ratings' => Review::where('reviews.origin', 'provider')
+        ->leftJoin('schedules', 'schedules.id', '=', 'reviews.schedule_id')
+        ->where('schedules.client_id', $cliente->id)
+        ->count(),
       'total_services' => $cliente->total_services,
     ];
 
-    $address = Address::where('source', 'client')->where('source_id', $cliente->id)->with(['city', 'state'])->first();
+    $address = Address::where('source', 'client')
+      ->where('source_id', $cliente->id)
+      ->with(['city', 'state'])
+      ->first();
+
     $summaryInfos = [
-      'name' => $user->name,
-      'address' => $address,
-      'pending_services' => Schedule::where('client_id', $cliente->id)->where('status', 'pending')->count(),
+      'name'             => $user->name,
+      'address'          => $address,
+      'pending_services' => Schedule::where('client_id', $cliente->id)
+        ->where('status', 'pending')
+        ->count(),
     ];
-    Log::info($address);
 
     $nextSchedules = Schedule::with('address:district,address,number,source_id,source,id,address_type')
       ->where('schedules.client_id', $cliente->id)
       ->whereIn('schedules.status', ['accepted', 'paid'])
       ->leftJoin('providers', 'providers.id', '=', 'schedules.provider_id')
       ->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
-      // ->where('schedules.date', '>=', now()->toDateString())
+      ->leftJoin('custom_schedules', 'custom_schedules.schedule_id', '=', 'schedules.id')
+      ->where('schedules.date', '>=', now()->toDateString())
       ->select(
         'schedules.id',
+        'schedules.provider_id',
         'provider_user.name as provider_name',
         'schedules.date',
         'schedules.start_time',
@@ -50,6 +61,7 @@ class DashboardService
         'schedules.period_type',
         'schedules.schedule_type',
         'schedules.address_id',
+        'custom_schedules.address_type as custom_address_type',
       )
       ->orderBy('schedules.date', 'asc')
       ->get();
@@ -60,38 +72,60 @@ class DashboardService
       ->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
       ->select(
         'schedules.id',
+        'schedules.provider_id',
         'provider_user.name as provider_name',
       )
       ->orderBy('schedules.date', 'desc')
       ->limit(5)
       ->get();
 
-    $favoriteProviders = ClientFavoriteProvider::where('client_id', $cliente->id)
+    $favoriteProviders = ClientFavoriteProvider::where('client_favorite_providers.client_id', $cliente->id)
       ->leftJoin('providers', 'providers.id', '=', 'client_favorite_providers.provider_id')
       ->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
       ->select(
-        'providers.id',
+        'providers.id as provider_id',
         'provider_user.name as provider_name',
         'providers.average_rating',
+        'providers.daily_price_8h',
+        'providers.daily_price_6h',
+        'providers.daily_price_4h',
+        'providers.daily_price_2h',
       )
       ->get();
 
+    $blockedProviderIds       = ScheduleBusinessRules::getBlockedProviderIdsForClient($cliente->id);
+    $providersWithWorkingDays = ScheduleBusinessRules::getProviderIdsWithWorkingDays();
+
     $providersClose = Provider::leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
       ->leftJoin('addresses as provider_address', function ($join) {
         $join->on('provider_address.source_id', '=', 'providers.id')
           ->where('provider_address.source', 'provider');
       })
       ->leftJoin('addresses as client_address', function ($join) use ($cliente) {
-          $join->where('client_address.source_id', $cliente->id)
-              ->where('client_address.source', 'client');
+        $join->where('client_address.source_id', $cliente->id)
+          ->where('client_address.source', 'client');
       })
       ->whereColumn('provider_address.city_id', '=', 'client_address.city_id')
+      ->whereNotIn('providers.id', $blockedProviderIds)
+      ->whereIn('providers.id', $providersWithWorkingDays)
+      ->where(function ($query) {
+        $query->whereNotNull('providers.daily_price_8h')
+          ->orWhereNotNull('providers.daily_price_6h')
+          ->orWhereNotNull('providers.daily_price_4h')
+          ->orWhereNotNull('providers.daily_price_2h');
+      })
       ->select(
-        'providers.id',
+        'providers.id as provider_id',
         'provider_user.name as provider_name',
-        'provider_address.district', // refatorar para pegar o bairro
+        'provider_address.district',
         'providers.average_rating',
-        DB::raw("(SELECT COUNT(*) FROM reviews LEFT JOIN schedules ON schedules.id = reviews.schedule_id WHERE reviews.origin = 'provider' AND schedules.provider_id = providers.id) as total_reviews"),
+        DB::raw("(
+          SELECT COUNT(*)
+          FROM reviews
+          LEFT JOIN schedules ON schedules.id = reviews.schedule_id
+          WHERE reviews.origin = 'provider'
+          AND schedules.provider_id = providers.id
+        ) as total_reviews"),
         'providers.total_services',
         'providers.daily_price_8h',
         'providers.daily_price_6h',
@@ -101,12 +135,12 @@ class DashboardService
       ->get();
 
     return [
-      'headerBar' => $headerBar,
-      'summaryInfos' => $summaryInfos,
-      'nextSchedules' => $nextSchedules,
+      'headerBar'        => $headerBar,
+      'summaryInfos'     => $summaryInfos,
+      'nextSchedules'    => $nextSchedules,
       'lastDoneSchedules' => $lastDoneSchedules,
       'favoriteProviders' => $favoriteProviders,
-      'providersClose' => $providersClose,
+      'providersClose'   => $providersClose,
     ];
   }
 
@@ -115,8 +149,6 @@ class DashboardService
     $user = Auth::user();
     $provider = Provider::where('user_id', $user->id)->first();
 
-    Log::info($provider);
-
     $headerBar = [
       'rating' => $provider->average_rating,
       'total_ratings' => Review::where('reviews.origin', 'client')->leftJoin('schedules', 'schedules.id', '=', 'reviews.schedule_id')->where('schedules.provider_id', $provider->id)->count(),
@@ -124,7 +156,6 @@ class DashboardService
     ];
 
     $address = Address::where('source', 'provider')->where('source_id', $provider->id)->with(['city', 'state'])->first();
-    Log::info($address);
     $summaryInfos = [
       'name' => $user->name,
       'address' => $address,