Gustavo Zanatta 2 недель назад
Родитель
Сommit
e3fdbcc2c7
1 измененных файлов с 58 добавлено и 30 удалено
  1. 58 30
      app/Services/DashboardService.php

+ 58 - 30
app/Services/DashboardService.php

@@ -414,6 +414,8 @@ class DashboardService
             $item->gender_label = GenderEnum::labelFor($item->gender);
         });
 
+        $this->attachPackageItems($pendingSchedules);
+
         $proposalsDistanceSelect = DistanceService::sqlExpression(
             $providersCloseLatitude,
             $providersCloseLongitude,
@@ -872,42 +874,15 @@ class DashboardService
                 : 'schedule-'.$schedule->id)
             ->values();
 
-        $packageSchedules = collect();
-
-        $listedPackageIds = $pendingSchedules->pluck('service_package_id')->filter()->unique();
-
-        if ($listedPackageIds->isNotEmpty()) {
-            $packageSchedules = Schedule::query()
-                ->join('service_package_items as spi', 'spi.schedule_id', '=', 'schedules.id')
-                ->whereIn('spi.service_package_id', $listedPackageIds)
-                ->whereNotIn('schedules.status', ['cancelled', 'rejected'])
-                ->orderBy('schedules.date', 'asc')
-                ->orderBy('schedules.start_time', 'asc')
-                ->select([
-                    'schedules.id',
-                    'schedules.date',
-                    'schedules.start_time',
-                    'schedules.end_time',
-                    'schedules.total_amount',
-                    'schedules.offers_meal',
-                    'schedules.status',
-                    'spi.service_package_id',
-                ])
-                ->get()
-                ->groupBy('service_package_id');
-        }
+        $this->attachPackageItems($pendingSchedules);
 
-        $pendingSchedules->each(function ($schedule) use ($packageSchedules) {
+        $pendingSchedules->each(function ($schedule) {
             $schedule->address = [
                 'address'  => $schedule->address_address,
                 'number'   => $schedule->address_number,
                 'district' => $schedule->address_district,
             ];
 
-            $schedule->package_items = $schedule->service_package_id
-                ? $packageSchedules->get($schedule->service_package_id, collect())->values()
-                : collect();
-
             unset(
                 $schedule->address_address,
                 $schedule->address_number,
@@ -1375,7 +1350,60 @@ class DashboardService
         ];
     }
 
-    // gera urls apenas para fotos verificadas ou visiveis ao proprio prestador.
+    private function attachPackageItems(Collection $schedules): void
+    {
+        $packageIds    = $schedules->pluck('service_package_id')->filter()->unique();
+        $standaloneIds = $schedules->whereNull('service_package_id')->pluck('id')->filter()->unique();
+
+        if ($packageIds->isEmpty() && $standaloneIds->isEmpty()) {
+            $schedules->each(fn ($schedule) => $schedule->package_items = collect());
+
+            return;
+        }
+
+        $rows = Schedule::query()
+            ->leftJoin('service_package_items as spi', 'spi.schedule_id', '=', 'schedules.id')
+            ->where(function ($query) use ($packageIds, $standaloneIds) {
+                if ($packageIds->isNotEmpty()) {
+                    $query->orWhereIn('spi.service_package_id', $packageIds);
+                }
+
+                if ($standaloneIds->isNotEmpty()) {
+                    $query->orWhereIn('schedules.id', $standaloneIds);
+                }
+            })
+            ->whereNotIn('schedules.status', ['cancelled', 'rejected'])
+            ->orderBy('schedules.date', 'asc')
+            ->orderBy('schedules.start_time', 'asc')
+            ->select([
+                'schedules.id',
+                'schedules.date',
+                'schedules.start_time',
+                'schedules.end_time',
+                'schedules.total_amount',
+                'schedules.offers_meal',
+                'schedules.status',
+                'spi.service_package_id',
+            ])
+            ->get();
+
+        $byPackage = $rows->whereNotNull('service_package_id')->groupBy('service_package_id');
+        $byId      = $rows->keyBy('id');
+
+        $schedules->each(function ($schedule) use ($byPackage, $byId) {
+            if ($schedule->service_package_id) {
+                $schedule->package_items = $byPackage
+                    ->get($schedule->service_package_id, collect())
+                    ->values();
+
+                return;
+            }
+
+            $own = $byId->get($schedule->id);
+
+            $schedule->package_items = $own ? collect([$own]) : collect();
+        });
+    }
 
     private function providerPhotoUrls(iterable $providerIds): Collection
     {