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

Merge remote-tracking branch 'origin/development' into feature/diaria-kay-adicionar-novo-card

Gustavo Zanatta 7 часов назад
Родитель
Сommit
b4b8f892fd
3 измененных файлов с 177 добавлено и 154 удалено
  1. 16 0
      app/Models/Schedule.php
  2. 2 0
      app/Services/CustomScheduleService.php
  3. 159 154
      app/Services/DashboardService.php

+ 16 - 0
app/Models/Schedule.php

@@ -5,6 +5,7 @@ namespace App\Models;
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\SoftDeletes;
+use Illuminate\Support\Collection;
 
 /**
  * @property int $id
@@ -137,6 +138,21 @@ class Schedule extends Model
         return $this->hasMany(Review::class);
     }
 
+    public function getSpecialitiesAttribute(): Collection
+    {
+        if ($this->schedule_type !== 'custom') {
+            return collect();
+        }
+
+        return $this->customSchedule?->specialities
+            ->sortBy('description')
+            ->map(fn(CustomScheduleSpeciality $speciality) => [
+                'id'          => $speciality->id,
+                'description' => $speciality->description,
+            ])
+            ->values() ?? collect();
+    }
+
     //
 
     public function ensureCustomerPhone(?string $fallbackPhone = null): void

+ 2 - 0
app/Services/CustomScheduleService.php

@@ -488,6 +488,8 @@ class CustomScheduleService
 
             $schedule->load(['provider.user', 'client.user']);
 
+            $notificationService = app(NotificationService::class);
+
             $notificationService->create([
                 'title'       => __('notifications.proposal_accepted_title'),
                 'description' => __('notifications.proposal_accepted_description'),

+ 159 - 154
app/Services/DashboardService.php

@@ -16,7 +16,6 @@ use App\Models\Review;
 use App\Models\Schedule;
 use App\Models\ScheduleProposal;
 use App\Models\ServicePackage;
-use App\Models\Speciality;
 use App\Rules\ScheduleBusinessRules;
 use Illuminate\Auth\Access\AuthorizationException;
 use Illuminate\Support\Collection;
@@ -75,7 +74,7 @@ class DashboardService
             'address:district,address,source_id,source,id,address_type',
         ])
             ->where('schedules.client_id', $cliente->id)
-            ->whereIn('schedules.status', ['paid'])
+            ->whereIn('schedules.status', ['accepted', 'paid'])
             ->whereDate('schedules.date', '>=', now()->toDateString())
             ->where('schedules.date', '>=', now()->toDateString())
             ->leftJoin('providers', 'providers.id', '=', 'schedules.provider_id')
@@ -95,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
@@ -104,7 +103,7 @@ class DashboardService
                 ) AS service_package_id
             "),
 
-                DB::raw("
+                    DB::raw("
                 (
                     SELECT COUNT(*)
                     FROM service_package_items spi_count
@@ -116,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);
@@ -133,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);
@@ -207,7 +206,7 @@ class DashboardService
             data_get($clientCoordinates, 'longitude'),
         );
 
-        $providerAddressLatestSubquery = DB::raw("
+         $providerAddressLatestSubquery = DB::raw("
             (
                 SELECT DISTINCT ON (source_id)
                     *
@@ -260,7 +259,7 @@ class DashboardService
                 'providers.daily_price_4h',
                 'providers.daily_price_2h',
 
-                DB::raw("
+                    DB::raw("
                 (
                     SELECT COUNT(*)
                     FROM reviews
@@ -271,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')
@@ -293,6 +292,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 +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(
@@ -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,
@@ -658,33 +671,34 @@ class DashboardService
 
         $solicitations = Schedule::with([
             '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(
@@ -707,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
@@ -717,7 +731,9 @@ class DashboardService
             "),
             )
             ->orderBy('schedules.date', 'asc')
-            ->get();
+            ->get()
+        ->append('specialities')
+        ->makeHidden('customSchedule');
 
         $solicitations->each(function ($solicitation) use ($address) {
             $solicitation->distance_km = $this->zipCodeCoordinatesService->calculateDistance(
@@ -733,29 +749,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 +782,7 @@ class DashboardService
                 ) AS provider_reviewed
             "),
 
-                DB::raw("
+                    DB::raw("
                 (
                     SELECT service_package_items.service_package_id
                     FROM service_package_items
@@ -774,9 +790,9 @@ class DashboardService
                     LIMIT 1
                 ) AS service_package_id
             "),
-            )
-            ->orderBy('schedules.start_time', 'asc')
-            ->get();
+                )
+                ->orderBy('schedules.start_time', 'asc')
+                ->get();
 
 
         $pendingConfirmation = Schedule::with(
@@ -931,13 +947,16 @@ class DashboardService
 
         $cliente = Client::where('user_id', $user->id)->firstOrFail();
 
-        $schedule = Schedule::where('schedules.id', $scheduleId)
+        $schedule = Schedule::with('customSchedule.specialities')
+            ->where('schedules.id', $scheduleId)
             ->where('schedules.client_id', $cliente->id)
             ->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',
+                'schedules.schedule_type',
                 'provider_user.name as provider_name',
                 'providers.birth_date as provider_birth_date',
                 'providers.gender',
@@ -948,28 +967,14 @@ class DashboardService
         $providerPhoto = $this->providerPhotoUrls([$schedule->provider_id])
             ->get($schedule->provider_id);
 
-        $allSpecialities = Speciality::where('active', true)
-            ->select('id', 'description')
-            ->orderBy('description')
-            ->get();
-
-        $providerSpecialityIds = ProviderSpeciality::where('provider_id', $schedule->provider_id)
-            ->pluck('speciality_id')
-            ->all();
-
-        $specialities = $allSpecialities->map(fn($sp) => [
-            'id'             => $sp->id,
-            'description'    => $sp->description,
-            'has_speciality' => in_array($sp->id, $providerSpecialityIds),
-        ])->values();
-
         return [
+            'schedule_type'       => $schedule->schedule_type,
             'provider_name'       => $schedule->provider_name,
             'provider_birth_date' => $schedule->provider_birth_date,
             'gender'              => $schedule->gender,
             'gender_label'        => GenderEnum::labelFor($schedule->gender),
             'offers_meal'         => $schedule->offers_meal,
-            'specialities'        => $specialities,
+            'specialities'        => $schedule->specialities,
 
             'provider_photo' => $providerPhoto,
         ];