Sfoglia il codice sorgente

Merge branch 'development' into feature/diariaapp-gus-agendamentos-apps

Gustavo Zanatta 2 settimane fa
parent
commit
b2d4e998e7
2 ha cambiato i file con 66 aggiunte e 33 eliminazioni
  1. 22 1
      app/Models/Provider.php
  2. 44 32
      app/Services/DashboardService.php

+ 22 - 1
app/Models/Provider.php

@@ -5,6 +5,8 @@ namespace App\Models;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
+use Illuminate\Database\Eloquent\Relations\HasMany;
+use Illuminate\Database\Eloquent\Relations\HasOne;
 use Illuminate\Database\Eloquent\SoftDeletes;
 
 /**
@@ -82,7 +84,26 @@ class Provider extends Model
   }
 
   /**
-   * @return \Illuminate\Database\Eloquent\Relations\HasMany
+   * @return HasMany
+     */
+    public function addresses(): HasMany
+    {
+        return $this->hasMany(Address::class, 'source_id')
+            ->where('source', 'provider');
+    }
+
+    // /**
+    //  * @return HasOne
+    //  */
+    // public function primaryAddress(): HasOne
+    // {
+    //     return $this->hasOne(Address::class, 'source_id')
+    //         ->where('source', 'provider')
+    //         ->where('is_primary', true);
+    // }
+
+    /**
+     * @return HasMany
    */
   public function blockedClients()
   {

+ 44 - 32
app/Services/DashboardService.php

@@ -64,16 +64,23 @@ class DashboardService
         'custom_schedules.address_type as custom_address_type',
       )
       ->orderBy('schedules.date', 'asc')
+      ->limit(5)
       ->get();
 
     $lastDoneSchedules = Schedule::where('schedules.client_id', $cliente->id)
       ->where('schedules.status', 'finished')
       ->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) {
+        $join->on('provider_address.source_id', '=', 'providers.id')
+          ->where('provider_address.source', 'provider')
+          ->orderBy('provider_address.is_primary', 'desc');
+      })
       ->select(
         'schedules.id',
         'schedules.provider_id',
         'provider_user.name as provider_name',
+        'provider_address.district as provider_district',
       )
       ->orderBy('schedules.date', 'desc')
       ->limit(5)
@@ -82,6 +89,11 @@ 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) {
+        $join->on('provider_address.source_id', '=', 'providers.id')
+          ->where('provider_address.source', 'provider')
+          ->orderBy('provider_address.is_primary', 'desc');
+      })
       ->select(
         'providers.id as provider_id',
         'provider_user.name as provider_name',
@@ -90,7 +102,10 @@ class DashboardService
         'providers.daily_price_6h',
         'providers.daily_price_4h',
         'providers.daily_price_2h',
+        'provider_address.district as provider_district',
       )
+      ->orderBy('client_favorite_providers.created_at', 'desc')
+      ->limit(5)
       ->get();
 
     $blockedProviderIds       = ScheduleBusinessRules::getBlockedProviderIdsForClient($cliente->id);
@@ -100,6 +115,11 @@ class DashboardService
       ->orderBy('is_primary', 'desc')
       ->first();
 
+    $clientPrimaryAddress = Address::where('source', 'client')
+      ->where('source_id', $cliente->id)
+      ->where('is_primary', true)
+      ->first();
+
     $providersClose = Provider::leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
       ->leftJoin(DB::raw("
         (
@@ -111,18 +131,28 @@ class DashboardService
         ) as provider_address
       "), 'provider_address.source_id', '=', 'providers.id')
       ->where('provider_address.city_id', '=', $clientAddress->city_id)
+      ->leftJoin('addresses as provider_address', function ($join) {
+        $join->on('provider_address.source_id', '=', 'providers.id')
+          ->where('provider_address.source', 'provider')
+          ->whereNull('provider_address.deleted_at')
+          ->orderBy('provider_address.is_primary', 'desc');
+      })
+      ->whereNotNull('provider_address.id')
+      ->where('provider_address.city_id', $clientPrimaryAddress?->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');
-      })
+      ->whereNull('providers.deleted_at')
+
       ->select(
         'providers.id as provider_id',
         'provider_user.name as provider_name',
+        'provider_address.id as address_id',
         'providers.average_rating',
+        'providers.total_services',
+        'providers.daily_price_8h',
+        'providers.daily_price_6h',
+        'providers.daily_price_4h',
+        'providers.daily_price_2h',
         DB::raw("(
           SELECT COUNT(*)
           FROM reviews
@@ -130,11 +160,6 @@ class DashboardService
           WHERE reviews.origin = 'provider'
           AND schedules.provider_id = providers.id
         ) as total_reviews"),
-        'providers.total_services',
-        'providers.daily_price_8h',
-        'providers.daily_price_6h',
-        'providers.daily_price_4h',
-        'providers.daily_price_2h',
       )
       ->get();
 
@@ -298,31 +323,18 @@ class DashboardService
         'schedules.period_type',
         'schedules.schedule_type',
         'schedules.address_id',
-        'custom_schedules.address_type'
+        'custom_schedules.address_type',
+        DB::raw("CASE
+          WHEN schedules.period_type = '2' THEN {$provider->daily_price_2h}
+          WHEN schedules.period_type = '4' THEN {$provider->daily_price_4h}
+          WHEN schedules.period_type = '6' THEN {$provider->daily_price_6h}
+          WHEN schedules.period_type = '8' THEN {$provider->daily_price_8h}
+          ELSE 0
+        END as total_amount"),
       )
       ->orderBy('schedules.date', 'asc')
       ->get();
 
-    $opportunities = $opportunities->map(function ($item) use ($provider) {
-      $price = 0;
-      switch ($item->period_type) {
-        case 2:
-          $price = $provider->daily_price_2h;
-          break;
-        case 4:
-          $price = $provider->daily_price_4h;
-          break;
-        case 6:
-          $price = $provider->daily_price_6h;
-          break;
-        case 8:
-          $price = $provider->daily_price_8h;
-          break;
-      }
-      $item->total_amount = $price;
-      return $item;
-    });
-
     return [
       'headerBar' => $headerBar,
       'summaryInfos' => $summaryInfos,