Explorar el Código

fix: :bug: fix(ajustes no agendamento) Foi ajustado as funções para listagem

Foi realizado o ajuste nas funções de listagem do backend para que sejam enviados os dados das especialidades e da idade do prestador, permitindo a exibição dessas informações na tela de perfil.

Origin: bug-interno
kayo henrique hace 21 horas
padre
commit
dfad880493
Se han modificado 1 ficheros con 206 adiciones y 193 borrados
  1. 206 193
      app/Services/DashboardService.php

+ 206 - 193
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', ['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("
                 (
                     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')
@@ -293,6 +293,19 @@ class DashboardService
                     $item->provider_zip_code,
                 );
             }
+            $item->specialities = ProviderSpeciality::query()
+                ->join('specialities', 'specialities.id', '=', 'provider_specialities.speciality_id')
+                ->where('provider_specialities.provider_id', $item->provider_id)
+                ->where('specialities.active', true)
+                ->orderBy('specialities.description')
+                ->get([
+                    'specialities.id',
+                    'specialities.description',
+                ]);
+
+            $item->age = Provider::query()
+                ->where('id', $item->provider_id)
+                ->value(DB::raw("DATE_PART('year', AGE(birth_date))"));
 
             unset($item->provider_zip_code);
 
@@ -308,30 +321,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 +364,7 @@ class DashboardService
                 END AS time_since_request
             "),
 
-            DB::raw("
+                DB::raw("
                 (
                     SELECT spi.service_package_id
                     FROM service_package_items spi
@@ -360,7 +373,7 @@ class DashboardService
                 ) AS service_package_id
             "),
 
-            DB::raw("
+                DB::raw("
                 (
                     SELECT COUNT(*)
                     FROM service_package_items spi_count
@@ -372,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);
@@ -487,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', '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
@@ -517,7 +530,7 @@ class DashboardService
                 ) AS service_package_id
             "),
 
-            DB::raw("
+                DB::raw("
                 (
                     SELECT COUNT(*)
                     FROM service_package_items spi_count
@@ -530,7 +543,7 @@ class DashboardService
                 ) AS service_package_items_count
             "),
 
-            DB::raw("
+                DB::raw("
                 EXISTS (
                     SELECT 1
                     FROM reviews
@@ -540,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,
@@ -561,7 +574,7 @@ class DashboardService
 
         $providerPhotoUrls = $this->providerPhotoUrls(
             $providerCollections->flatMap(
-                fn (Collection $items) => $items->pluck('provider_id'),
+                fn(Collection $items) => $items->pluck('provider_id'),
             ),
         );
 
@@ -592,7 +605,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 +672,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 +720,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 +728,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 +746,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 +779,7 @@ class DashboardService
                 ) AS provider_reviewed
             "),
 
-            DB::raw("
+                DB::raw("
                 (
                     SELECT service_package_items.service_package_id
                     FROM service_package_items
@@ -774,9 +787,9 @@ class DashboardService
                     LIMIT 1
                 ) AS service_package_id
             "),
-        )
-        ->orderBy('schedules.start_time', 'asc')
-        ->get();
+            )
+            ->orderBy('schedules.start_time', 'asc')
+            ->get();
 
         $nextSchedules = Schedule::with('address:district,address,number,source_id,source,id,zip_code,latitude,longitude')
             ->where('schedules.provider_id', $provider->id)
@@ -830,7 +843,7 @@ class DashboardService
 
         $clientPhotoUrls = $this->clientPhotoUrls(
             $clientCollections->flatMap(
-                fn (Collection $items) => $items->pluck('client_id'),
+                fn(Collection $items) => $items->pluck('client_id'),
             ),
         );