Просмотр исходного кода

Merge branch 'feature/diaria-kay-adicionar-novo-card' of Softpar/sfp_api_laravel_diarista into development

zntt 10 часов назад
Родитель
Сommit
5595261132
2 измененных файлов с 187 добавлено и 135 удалено
  1. 1 0
      app/Http/Resources/DashboardPrestadorResource.php
  2. 186 135
      app/Services/DashboardService.php

+ 1 - 0
app/Http/Resources/DashboardPrestadorResource.php

@@ -23,6 +23,7 @@ class DashboardPrestadorResource extends JsonResource
             'nextSchedules'  => data_get($this, 'nextSchedules'),
             'opportunities'  => data_get($this, 'opportunities'),
             'notifications'  => data_get($this, 'notifications'),
+            'pendingConfirmation' => data_get($this, 'pendingConfirmation'),
         ];
     }
 }

+ 186 - 135
app/Services/DashboardService.php

@@ -11,6 +11,7 @@ use App\Models\ClientFavoriteProvider;
 use App\Models\ClientPaymentMethod;
 use App\Models\Notification;
 use App\Models\Provider;
+use App\Models\ProviderSpeciality;
 use App\Models\Review;
 use App\Models\Schedule;
 use App\Models\ScheduleProposal;
@@ -93,7 +94,7 @@ class DashboardService
                 'schedules.address_id',
                 'custom_schedules.address_type as custom_address_type',
 
-                DB::raw("
+                    DB::raw("
                 (
                     SELECT spi.service_package_id
                     FROM service_package_items spi
@@ -102,7 +103,7 @@ class DashboardService
                 ) AS service_package_id
             "),
 
-                DB::raw("
+                    DB::raw("
                 (
                     SELECT COUNT(*)
                     FROM service_package_items spi_count
@@ -114,10 +115,10 @@ class DashboardService
                     )
                 ) AS service_package_items_count
             "),
-            )
-            ->orderBy('schedules.date', 'asc')
-            ->limit(5)
-            ->get();
+                )
+                ->orderBy('schedules.date', 'asc')
+                ->limit(5)
+                ->get();
 
         $nextSchedules->each(function ($item) {
             $item->gender_label = GenderEnum::labelFor($item->gender);
@@ -131,25 +132,25 @@ class DashboardService
         $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')
-            ->leftJoinSub(
-                Address::preferredForProvider(),
-                'provider_address',
-                fn($join) =>
-                $join->on('provider_address.source_id', '=', 'providers.id')
-                    ->where('provider_address.rn', 1)
-            )
-            ->select(
-                'schedules.id',
-                'schedules.provider_id',
-                'provider_user.name as provider_name',
-                'providers.gender',
-                'provider_address.district as provider_district',
-            )
-            ->orderBy('schedules.date', 'desc')
-            ->limit(5)
-            ->get();
+                ->leftJoin('providers', 'providers.id', '=', 'schedules.provider_id')
+                ->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
+                ->leftJoinSub(
+                    Address::preferredForProvider(),
+                    'provider_address',
+                    fn($join) =>
+                    $join->on('provider_address.source_id', '=', 'providers.id')
+                        ->where('provider_address.rn', 1)
+                )
+                ->select(
+                    'schedules.id',
+                    'schedules.provider_id',
+                    'provider_user.name as provider_name',
+                    'providers.gender',
+                    'provider_address.district as provider_district',
+                )
+                ->orderBy('schedules.date', 'desc')
+                ->limit(5)
+                ->get();
 
         $lastDoneSchedules->each(function ($item) {
             $item->gender_label = GenderEnum::labelFor($item->gender);
@@ -205,7 +206,7 @@ class DashboardService
             data_get($clientCoordinates, 'longitude'),
         );
 
-        $providerAddressLatestSubquery = DB::raw("
+         $providerAddressLatestSubquery = DB::raw("
             (
                 SELECT DISTINCT ON (source_id)
                     *
@@ -258,7 +259,7 @@ class DashboardService
                 'providers.daily_price_4h',
                 'providers.daily_price_2h',
 
-                DB::raw("
+                    DB::raw("
                 (
                     SELECT COUNT(*)
                     FROM reviews
@@ -269,10 +270,10 @@ class DashboardService
                 ) AS total_reviews
             "),
 
-                $providersCloseDistanceSelect,
-            )
-            ->orderByRaw('distance_km ASC NULLS LAST')
-            ->get();
+                    $providersCloseDistanceSelect,
+                )
+                ->orderByRaw('distance_km ASC NULLS LAST')
+                ->get();
 
         $this->zipCodeCoordinatesService->preload(
             $providersClose->whereNull('distance_km')->pluck('provider_zip_code')
@@ -319,30 +320,31 @@ class DashboardService
         });
 
         $providersClose = $providersClose
+            ->sortBy(fn($provider) => $provider->distance_km ?? PHP_FLOAT_MAX)
             ->sortBy(fn($provider) => $provider->distance_km ?? PHP_FLOAT_MAX)
             ->values();
 
         $pendingSchedules = Schedule::with([
             'address:district,address,number,source_id,source,id,address_type',
         ])
-            ->where('schedules.client_id', $cliente->id)
-            ->whereIn('schedules.status', ['pending', 'accepted'])
-            ->where('schedules.schedule_type', 'default')
-            ->leftJoin('providers', 'providers.id', '=', 'schedules.provider_id')
-            ->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
-            ->select(
-                'schedules.id',
-                'schedules.provider_id',
-                'provider_user.name as provider_name',
-                'providers.gender',
-                'schedules.date',
-                'schedules.address_id',
-                'schedules.status',
-                'schedules.total_amount',
-                'schedules.start_time',
-                'schedules.end_time',
-
-                DB::raw("
+                ->where('schedules.client_id', $cliente->id)
+                ->whereIn('schedules.status', ['pending', 'accepted'])
+                ->where('schedules.schedule_type', 'default')
+                ->leftJoin('providers', 'providers.id', '=', 'schedules.provider_id')
+                ->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
+                ->select(
+                    'schedules.id',
+                    'schedules.provider_id',
+                    'provider_user.name as provider_name',
+                    'providers.gender',
+                    'schedules.date',
+                    'schedules.address_id',
+                    'schedules.status',
+                    'schedules.total_amount',
+                    'schedules.start_time',
+                    'schedules.end_time',
+
+                    DB::raw("
                 CASE
                     WHEN (NOW() - schedules.created_at) < INTERVAL '1 hour' THEN
                         CONCAT(
@@ -362,7 +364,7 @@ class DashboardService
                 END AS time_since_request
             "),
 
-                DB::raw("
+                    DB::raw("
                 (
                     SELECT spi.service_package_id
                     FROM service_package_items spi
@@ -371,7 +373,7 @@ class DashboardService
                 ) AS service_package_id
             "),
 
-                DB::raw("
+                    DB::raw("
                 (
                     SELECT COUNT(*)
                     FROM service_package_items spi_count
@@ -383,9 +385,9 @@ class DashboardService
                     )
                 ) AS service_package_items_count
             "),
-            )
-            ->orderBy('schedules.date', 'asc')
-            ->get();
+                )
+                ->orderBy('schedules.date', 'asc')
+                ->get();
 
         $pendingSchedules->each(function ($item) {
             $item->gender_label = GenderEnum::labelFor($item->gender);
@@ -498,28 +500,28 @@ class DashboardService
         $todaySchedules = Schedule::with([
             'address:district,address,number,source_id,source,id,address_type',
         ])
-            ->where('schedules.client_id', $cliente->id)
-            ->whereIn('schedules.status', ['accepted', 'paid', 'started', 'cancelled', 'finished'])
-            ->whereDate('schedules.date', now()->toDateString())
-            ->leftJoin('providers', 'providers.id', '=', 'schedules.provider_id')
-            ->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
-            ->select(
-                'schedules.id',
-                'schedules.provider_id',
-                'provider_user.name as provider_name',
-                'providers.gender',
-                'schedules.date',
-                'schedules.start_time',
-                'schedules.end_time',
-                'schedules.total_amount',
-                'schedules.period_type',
-                'schedules.schedule_type',
-                'schedules.address_id',
-                'schedules.status',
-                'schedules.code_verified',
-                'schedules.code',
-
-                DB::raw("
+                ->where('schedules.client_id', $cliente->id)
+                ->whereIn('schedules.status', ['accepted', 'paid', 'started', 'cancelled', 'finished'])
+                ->whereDate('schedules.date', now()->toDateString())
+                ->leftJoin('providers', 'providers.id', '=', 'schedules.provider_id')
+                ->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
+                ->select(
+                    'schedules.id',
+                    'schedules.provider_id',
+                    'provider_user.name as provider_name',
+                    'providers.gender',
+                    'schedules.date',
+                    'schedules.start_time',
+                    'schedules.end_time',
+                    'schedules.total_amount',
+                    'schedules.period_type',
+                    'schedules.schedule_type',
+                    'schedules.address_id',
+                    'schedules.status',
+                    'schedules.code_verified',
+                    'schedules.code',
+
+                    DB::raw("
                 (
                     SELECT spi.service_package_id
                     FROM service_package_items spi
@@ -528,7 +530,7 @@ class DashboardService
                 ) AS service_package_id
             "),
 
-                DB::raw("
+                    DB::raw("
                 (
                     SELECT COUNT(*)
                     FROM service_package_items spi_count
@@ -541,7 +543,7 @@ class DashboardService
                 ) AS service_package_items_count
             "),
 
-                DB::raw("
+                    DB::raw("
                 EXISTS (
                     SELECT 1
                     FROM reviews
@@ -551,14 +553,14 @@ class DashboardService
                     AND reviews.deleted_at IS NULL
                 ) AS client_reviewed
             "),
-            )
-            ->orderBy('schedules.start_time', 'asc')
-            ->get()
-            ->map(function ($item) {
+                )
+                ->orderBy('schedules.start_time', 'asc')
+                ->get()
+                ->map(function ($item) {
                 $item->gender_label = GenderEnum::labelFor($item->gender);
 
-                return $item;
-            });
+                    return $item;
+                });
 
         $providerCollections = collect([
             $nextSchedules,
@@ -671,32 +673,32 @@ class DashboardService
             'address:district,source_id,source,id,zip_code,latitude,longitude',
             'customSchedule.specialities',
         ])
-            ->where('schedules.provider_id', $provider->id)
-            ->where('schedules.status', 'pending')
-            ->leftJoin('clients', 'clients.id', '=', 'schedules.client_id')
-            ->leftJoin('users as client_user', 'client_user.id', '=', 'clients.user_id')
-            ->leftJoin('custom_schedules', 'custom_schedules.schedule_id', '=', 'schedules.id')
-            ->select(
-                'schedules.id',
-                'schedules.client_id',
-                'client_user.name as client_name',
-                'clients.average_rating',
-                'schedules.date',
-
-                DB::raw("
+                ->where('schedules.provider_id', $provider->id)
+                ->where('schedules.status', 'pending')
+                ->leftJoin('clients', 'clients.id', '=', 'schedules.client_id')
+                ->leftJoin('users as client_user', 'client_user.id', '=', 'clients.user_id')
+                ->leftJoin('custom_schedules', 'custom_schedules.schedule_id', '=', 'schedules.id')
+                ->select(
+                    'schedules.id',
+                    'schedules.client_id',
+                    'client_user.name as client_name',
+                    'clients.average_rating',
+                    'schedules.date',
+
+                    DB::raw("
                 TO_CHAR(schedules.date, 'DD/MM/YYYY') AS formatted_date
             "),
 
-                'schedules.start_time',
-                'schedules.end_time',
-                'schedules.total_amount',
-                'schedules.period_type',
-                'schedules.schedule_type',
-                'schedules.address_id',
-                'schedules.status',
-                'custom_schedules.offers_meal',
+                    'schedules.start_time',
+                    'schedules.end_time',
+                    'schedules.total_amount',
+                    'schedules.period_type',
+                    'schedules.schedule_type',
+                    'schedules.address_id',
+                    'schedules.status',
+                    'custom_schedules.offers_meal',
 
-                DB::raw("
+                    DB::raw("
                 CASE
                     WHEN (NOW() - schedules.created_at) < INTERVAL '1 day' THEN
                         CONCAT(
@@ -719,7 +721,7 @@ class DashboardService
                 END AS time_since_request
             "),
 
-                DB::raw("
+                    DB::raw("
                 (
                     SELECT service_package_items.service_package_id
                     FROM service_package_items
@@ -727,9 +729,9 @@ class DashboardService
                     LIMIT 1
                 ) AS service_package_id
             "),
-        )
-        ->orderBy('schedules.date', 'asc')
-        ->get()
+            )
+            ->orderBy('schedules.date', 'asc')
+            ->get()
         ->append('specialities')
         ->makeHidden('customSchedule');
 
@@ -747,9 +749,58 @@ class DashboardService
         $todayServices = Schedule::with([
             'address:district,address,number,source_id,source,id',
         ])
+                ->where('schedules.provider_id', $provider->id)
+                ->whereIn('schedules.status', ['accepted', 'paid', 'started', 'finished'])
+                ->whereDate('schedules.date', now()->toDateString())
+                ->leftJoin('clients', 'clients.id', '=', 'schedules.client_id')
+                ->leftJoin('users as client_user', 'client_user.id', '=', 'clients.user_id')
+                ->leftJoin('custom_schedules', 'custom_schedules.schedule_id', '=', 'schedules.id')
+                ->select(
+                    'schedules.id',
+                    'schedules.client_id',
+                    'client_user.name as client_name',
+                    'schedules.date',
+                    'schedules.start_time',
+                    'schedules.end_time',
+                    'schedules.total_amount',
+                    'schedules.period_type',
+                    'schedules.address_id',
+                    'schedules.schedule_type',
+                    'schedules.status',
+                    'schedules.code_verified',
+                    'schedules.code',
+                    'custom_schedules.offers_meal',
+
+                    DB::raw("
+                EXISTS (
+                    SELECT 1
+                    FROM reviews
+                    WHERE reviews.schedule_id = schedules.id
+                    AND reviews.origin = 'provider'
+                    AND reviews.origin_id = {$provider->id}
+                    AND reviews.deleted_at IS NULL
+                ) AS provider_reviewed
+            "),
+
+                    DB::raw("
+                (
+                    SELECT service_package_items.service_package_id
+                    FROM service_package_items
+                    WHERE service_package_items.schedule_id = schedules.id
+                    LIMIT 1
+                ) AS service_package_id
+            "),
+                )
+                ->orderBy('schedules.start_time', 'asc')
+                ->get();
+
+
+        $pendingConfirmation = Schedule::with(
+            'address:district,address,number,source_id,source,id,zip_code,latitude,longitude'
+        )
             ->where('schedules.provider_id', $provider->id)
-            ->whereIn('schedules.status', ['accepted', 'paid', 'started', 'finished'])
-            ->whereDate('schedules.date', now()->toDateString())
+            ->where('schedules.status', 'accepted')
+            ->whereDate('schedules.date', '>=', now()->toDateString())
             ->leftJoin('clients', 'clients.id', '=', 'schedules.client_id')
             ->leftJoin('users as client_user', 'client_user.id', '=', 'clients.user_id')
             ->leftJoin('custom_schedules', 'custom_schedules.schedule_id', '=', 'schedules.id')
@@ -765,36 +816,34 @@ class DashboardService
                 'schedules.address_id',
                 'schedules.schedule_type',
                 'schedules.status',
-                'schedules.code_verified',
-                'schedules.code',
                 'custom_schedules.offers_meal',
 
                 DB::raw("
-                EXISTS (
-                    SELECT 1
-                    FROM reviews
-                    WHERE reviews.schedule_id = schedules.id
-                    AND reviews.origin = 'provider'
-                    AND reviews.origin_id = {$provider->id}
-                    AND reviews.deleted_at IS NULL
-                ) AS provider_reviewed
-            "),
-
-                DB::raw("
-                (
-                    SELECT service_package_items.service_package_id
-                    FROM service_package_items
-                    WHERE service_package_items.schedule_id = schedules.id
-                    LIMIT 1
-                ) AS service_package_id
-            "),
+            (
+                SELECT service_package_items.service_package_id
+                FROM service_package_items
+                WHERE service_package_items.schedule_id = schedules.id
+                LIMIT 1
+            ) AS service_package_id
+        "),
             )
-            ->orderBy('schedules.start_time', 'asc')
+            ->orderBy('schedules.date', 'asc')
             ->get();
 
+        $pendingConfirmation->each(function ($schedule) use ($address) {
+            $schedule->distance_km = $this->zipCodeCoordinatesService->calculateDistance(
+                $address?->latitude !== null ? (float) $address->latitude : null,
+                $address?->longitude !== null ? (float) $address->longitude : null,
+                $address?->zip_code,
+                $schedule->address?->latitude !== null ? (float) $schedule->address->latitude : null,
+                $schedule->address?->longitude !== null ? (float) $schedule->address->longitude : null,
+                $schedule->address?->zip_code,
+            );
+        });
+
         $nextSchedules = Schedule::with('address:district,address,number,source_id,source,id,zip_code,latitude,longitude')
             ->where('schedules.provider_id', $provider->id)
-            ->whereIn('schedules.status', ['accepted', 'paid'])
+            ->where('schedules.status', 'paid')
             ->whereDate('schedules.date', '>=', now()->toDateString())
             ->leftJoin('clients', 'clients.id', '=', 'schedules.client_id')
             ->leftJoin('users as client_user', 'client_user.id', '=', 'clients.user_id')
@@ -839,7 +888,8 @@ class DashboardService
         $clientCollections = collect([
             $solicitations,
             $todayServices,
-            $nextSchedules,
+            $pendingConfirmation,
+            $nextSchedules
         ]);
 
         $clientPhotoUrls = $this->clientPhotoUrls(
@@ -884,6 +934,7 @@ class DashboardService
             'priceSuggested' => $priceSuggested,
             'solicitations'  => $solicitations,
             'todayServices'  => $todayServices,
+            'pendingConfirmation' => $pendingConfirmation,
             'nextSchedules'  => $nextSchedules,
             'opportunities'  => $opportunities,
             'notifications'  => $notifications,