Sfoglia il codice sorgente

feat: :sparkles: feat(adicionar novo card) Foi adicionado a função de listagem oara o card

Foi adicionado um novo card na parte da dashboard do prestador (aguardando confirmação do cliente)  onde lista apenas os serviços que ainda estão pedentes

fase:dev | origin:escopo
kayo henrique 1 giorno fa
parent
commit
4dc4a071b8

+ 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'),
         ];
     }
 }

+ 243 - 194
app/Services/DashboardService.php

@@ -74,28 +74,28 @@ class DashboardService
         $nextSchedules = Schedule::with([
             'address:district,address,source_id,source,id,address_type',
         ])
-        ->where('schedules.client_id', $cliente->id)
-        ->whereIn('schedules.status', ['accepted', 'paid'])
-        ->whereDate('schedules.date', '>=', now()->toDateString())
-        ->where('schedules.date', '>=', now()->toDateString())
-        ->leftJoin('providers', 'providers.id', '=', 'schedules.provider_id')
-        ->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
-        ->leftJoin('custom_schedules', 'custom_schedules.schedule_id', '=', 'schedules.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',
-            'custom_schedules.address_type as custom_address_type',
-
-            DB::raw("
+            ->where('schedules.client_id', $cliente->id)
+            ->whereIn('schedules.status', ['paid'])
+            ->whereDate('schedules.date', '>=', now()->toDateString())
+            ->where('schedules.date', '>=', now()->toDateString())
+            ->leftJoin('providers', 'providers.id', '=', 'schedules.provider_id')
+            ->leftJoin('users as provider_user', 'provider_user.id', '=', 'providers.user_id')
+            ->leftJoin('custom_schedules', 'custom_schedules.schedule_id', '=', 'schedules.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',
+                'custom_schedules.address_type as custom_address_type',
+
+                DB::raw("
                 (
                     SELECT spi.service_package_id
                     FROM service_package_items spi
@@ -104,7 +104,7 @@ class DashboardService
                 ) AS service_package_id
             "),
 
-            DB::raw("
+                DB::raw("
                 (
                     SELECT COUNT(*)
                     FROM service_package_items spi_count
@@ -116,10 +116,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);
@@ -133,25 +133,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);
@@ -207,7 +207,7 @@ class DashboardService
             data_get($clientCoordinates, 'longitude'),
         );
 
-       $providerAddressLatestSubquery = DB::raw("
+        $providerAddressLatestSubquery = DB::raw("
             (
                 SELECT DISTINCT ON (source_id)
                     *
@@ -229,38 +229,38 @@ class DashboardService
             '=',
             'providers.user_id'
         )
-        ->visibleToCustomers()
-        ->leftJoin(
-            $providerAddressLatestSubquery,
-            'provider_address.source_id',
-            '=',
-            'providers.id'
-        )
-        ->whereNotNull('provider_address.id')
-        ->when(
-            $clientPrimaryAddress?->city_id,
-            fn ($query, int $cityId) => $query->where('provider_address.city_id', $cityId)
-        )
-        ->whereNotIn('providers.id', $blockedProviderIds)
-        ->whereIn('providers.id', $providersWithWorkingDays)
-        ->whereNull('providers.deleted_at')
-        ->select(
-            'providers.id as provider_id',
-            'provider_user.name as provider_name',
-            'providers.gender',
-            'provider_address.id as address_id',
-            'provider_address.zip_code as provider_zip_code',
-            'provider_address.district',
-            'provider_address.latitude as provider_latitude',
-            'provider_address.longitude as provider_longitude',
-            'providers.average_rating',
-            'providers.total_services',
-            'providers.daily_price_8h',
-            'providers.daily_price_6h',
-            'providers.daily_price_4h',
-            'providers.daily_price_2h',
-
-            DB::raw("
+            ->visibleToCustomers()
+            ->leftJoin(
+                $providerAddressLatestSubquery,
+                'provider_address.source_id',
+                '=',
+                'providers.id'
+            )
+            ->whereNotNull('provider_address.id')
+            ->when(
+                $clientPrimaryAddress?->city_id,
+                fn($query, int $cityId) => $query->where('provider_address.city_id', $cityId)
+            )
+            ->whereNotIn('providers.id', $blockedProviderIds)
+            ->whereIn('providers.id', $providersWithWorkingDays)
+            ->whereNull('providers.deleted_at')
+            ->select(
+                'providers.id as provider_id',
+                'provider_user.name as provider_name',
+                'providers.gender',
+                'provider_address.id as address_id',
+                'provider_address.zip_code as provider_zip_code',
+                'provider_address.district',
+                'provider_address.latitude as provider_latitude',
+                'provider_address.longitude as provider_longitude',
+                '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
@@ -271,10 +271,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')
@@ -308,30 +308,30 @@ 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(
@@ -351,7 +351,7 @@ class DashboardService
                 END AS time_since_request
             "),
 
-            DB::raw("
+                DB::raw("
                 (
                     SELECT spi.service_package_id
                     FROM service_package_items spi
@@ -360,7 +360,7 @@ class DashboardService
                 ) AS service_package_id
             "),
 
-            DB::raw("
+                DB::raw("
                 (
                     SELECT COUNT(*)
                     FROM service_package_items spi_count
@@ -372,9 +372,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);
@@ -487,28 +487,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', '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', '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
@@ -517,7 +517,7 @@ class DashboardService
                 ) AS service_package_id
             "),
 
-            DB::raw("
+                DB::raw("
                 (
                     SELECT COUNT(*)
                     FROM service_package_items spi_count
@@ -530,7 +530,7 @@ class DashboardService
                 ) AS service_package_items_count
             "),
 
-            DB::raw("
+                DB::raw("
                 EXISTS (
                     SELECT 1
                     FROM reviews
@@ -540,14 +540,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,
@@ -561,7 +561,7 @@ class DashboardService
 
         $providerPhotoUrls = $this->providerPhotoUrls(
             $providerCollections->flatMap(
-                fn (Collection $items) => $items->pluck('provider_id'),
+                fn(Collection $items) => $items->pluck('provider_id'),
             ),
         );
 
@@ -592,7 +592,7 @@ class DashboardService
         $pendingServicePackages = ServicePackage::query()
             ->where('client_id', $cliente->id)
             ->where('status', ServicePackageStatusEnum::OPEN->value)
-            ->whereDoesntHave('items.schedule', fn ($q) => $q->where('status', '!=', 'accepted'))
+            ->whereDoesntHave('items.schedule', fn($q) => $q->where('status', '!=', 'accepted'))
             ->with(['items.schedule' => function ($query) {
                 $query->with(['provider.user', 'address']);
             }])
@@ -659,32 +659,32 @@ class DashboardService
         $solicitations = Schedule::with([
             'address:district,source_id,source,id,zip_code,latitude,longitude',
         ])
-        ->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(
@@ -707,7 +707,7 @@ class DashboardService
                 END AS time_since_request
             "),
 
-            DB::raw("
+                DB::raw("
                 (
                     SELECT service_package_items.service_package_id
                     FROM service_package_items
@@ -715,9 +715,9 @@ class DashboardService
                     LIMIT 1
                 ) AS service_package_id
             "),
-        )
-        ->orderBy('schedules.date', 'asc')
-        ->get();
+            )
+            ->orderBy('schedules.date', 'asc')
+            ->get();
 
         $solicitations->each(function ($solicitation) use ($address) {
             $solicitation->distance_km = $this->zipCodeCoordinatesService->calculateDistance(
@@ -733,29 +733,29 @@ 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("
+            ->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
@@ -766,7 +766,7 @@ class DashboardService
                 ) AS provider_reviewed
             "),
 
-            DB::raw("
+                DB::raw("
                 (
                     SELECT service_package_items.service_package_id
                     FROM service_package_items
@@ -774,13 +774,60 @@ class DashboardService
                     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'
         )
-        ->orderBy('schedules.start_time', 'asc')
-        ->get();
+            ->where('schedules.provider_id', $provider->id)
+            ->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')
+            ->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',
+                'custom_schedules.offers_meal',
+
+                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.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')
@@ -825,12 +872,13 @@ class DashboardService
         $clientCollections = collect([
             $solicitations,
             $todayServices,
-            $nextSchedules,
+            $pendingConfirmation,
+            $nextSchedules
         ]);
 
         $clientPhotoUrls = $this->clientPhotoUrls(
             $clientCollections->flatMap(
-                fn (Collection $items) => $items->pluck('client_id'),
+                fn(Collection $items) => $items->pluck('client_id'),
             ),
         );
 
@@ -870,6 +918,7 @@ class DashboardService
             'priceSuggested' => $priceSuggested,
             'solicitations'  => $solicitations,
             'todayServices'  => $todayServices,
+            'pendingConfirmation' => $pendingConfirmation,
             'nextSchedules'  => $nextSchedules,
             'opportunities'  => $opportunities,
             'notifications'  => $notifications,