Эх сурвалжийг харах

fix: :bug: fix (dashboard cliente) corrigindo duplicacoes

foram corrigidas duplicacoes de registros com base em prestadores que tem mais de um endereco

fase:dev | origin:melhoria-interna
Gustavo Zanatta 6 өдөр өмнө
parent
commit
a7a3ed899a

+ 8 - 0
app/Models/Address.php

@@ -2,9 +2,11 @@
 
 namespace App\Models;
 
+use Illuminate\Database\Eloquent\Builder;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\SoftDeletes;
+use Illuminate\Support\Facades\DB;
 
 /**
  * @property int $id
@@ -90,6 +92,12 @@ class Address extends Model
         'deleted_at'     => 'datetime',
     ];
 
+    public static function preferredForProvider(): Builder
+    {
+        return static::select('*', DB::raw('ROW_NUMBER() OVER (PARTITION BY source_id ORDER BY is_primary DESC, id DESC) as rn'))
+            ->where('source', 'provider');
+    }
+
     public function city()
     {
         return $this->belongsTo(City::class)->select('id', 'name');

+ 14 - 10
app/Services/DashboardService.php

@@ -96,15 +96,20 @@ class DashboardService
             unset($item->provider_photo_path);
         });
 
-        $lastDoneSchedules = Schedule::where('schedules.client_id', $cliente->id)
-            ->where('schedules.status', 'finished')
+        $latestPerProvider = Schedule::where('client_id', $cliente->id)
+            ->where('status', 'finished')
+            ->select('provider_id', DB::raw('MAX(id) as max_id'))
+            ->groupBy('provider_id');
+
+        $lastDoneSchedules = Schedule::joinSub($latestPerProvider, 'latest', function ($join) {
+                $join->on('schedules.id', '=', 'latest.max_id');
+            })
             ->leftJoin('providers', 'providers.id', '=', 'schedules.provider_id')
             ->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
-            ->leftJoin('addresses as provider_address', function ($join) {
+            ->leftJoinSub(Address::preferredForProvider(), 'provider_address', fn($join) =>
                 $join->on('provider_address.source_id', '=', 'providers.id')
-                    ->where('provider_address.source', 'provider')
-                    ->orderBy('provider_address.is_primary', 'desc');
-            })
+                     ->where('provider_address.rn', 1)
+            )
             ->leftJoin('media as provider_media', 'provider_media.id', '=', 'providers.profile_media_id')
             ->select(
                 'schedules.id',
@@ -127,11 +132,10 @@ class DashboardService
         $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')
-            ->leftJoin('addresses as provider_address', function ($join) {
+            ->leftJoinSub(Address::preferredForProvider(), 'provider_address', fn($join) =>
                 $join->on('provider_address.source_id', '=', 'providers.id')
-                    ->where('provider_address.source', 'provider')
-                    ->orderBy('provider_address.is_primary', 'desc');
-            })
+                     ->where('provider_address.rn', 1)
+            )
             ->leftJoin('media as provider_media', 'provider_media.id', '=', 'providers.profile_media_id')
             ->select(
                 'providers.id as provider_id',