فهرست منبع

feat: ✨ feat (informacoes agendamento) adicionada informacoes do prestador no agendamento

ao realizar um agendamento, adicionada informacoes no dialog do prestador, exibindo idade, genero e tipos de servico

fase:dev | origin:escopo
Gustavo Zanatta 9 ساعت پیش
والد
کامیت
bd80aebed1
3فایلهای تغییر یافته به همراه67 افزوده شده و 1 حذف شده
  1. 14 0
      app/Http/Controllers/SearchController.php
  2. 51 0
      app/Services/SearchService.php
  3. 2 1
      routes/authRoutes/search.php

+ 14 - 0
app/Http/Controllers/SearchController.php

@@ -3,6 +3,7 @@
 namespace App\Http\Controllers;
 
 use App\Services\SearchService;
+use Illuminate\Database\Eloquent\ModelNotFoundException;
 use Illuminate\Http\JsonResponse;
 use Illuminate\Http\Request;
 
@@ -20,4 +21,17 @@ class SearchController extends Controller
             return $this->errorResponse(message: __('messages.error_fetching_data'), code: 500, exception: $e);
         }
     }
+
+    public function perfilPrestador(int $id): JsonResponse
+    {
+        try {
+            $dados = $this->service->perfilPrestador($id);
+
+            return $this->successResponse(payload: $dados);
+        } catch (ModelNotFoundException $e) {
+            return $this->errorResponse(message: __('messages.not_found'), code: 404, exception: $e);
+        } catch (\Exception $e) {
+            return $this->errorResponse(message: __('messages.error_fetching_data'), code: 500, exception: $e);
+        }
+    }
 }

+ 51 - 0
app/Services/SearchService.php

@@ -6,6 +6,7 @@ use App\Enums\GenderEnum;
 use App\Models\Address;
 use App\Models\Client;
 use App\Models\Provider;
+use App\Models\ProviderServicesType;
 use App\Rules\ScheduleBusinessRules;
 use Illuminate\Support\Facades\Auth;
 use Illuminate\Support\Facades\DB;
@@ -189,6 +190,56 @@ class SearchService
         })->values()->toArray();
     }
 
+    public function perfilPrestador(int $providerId): array
+    {
+        $provider = Provider::query()
+            ->visibleToCustomers()
+            ->whereNull('providers.deleted_at')
+            ->with(['user:id,name', 'profileMedia'])
+            ->findOrFail($providerId);
+
+        $address = Address::where('source', 'provider')
+            ->where('source_id', $provider->id)
+            ->orderByDesc('is_primary')
+            ->orderByDesc('id')
+            ->first();
+
+        $serviceTypes = ProviderServicesType::query()
+            ->join('service_types', 'service_types.id', '=', 'provider_services_types.service_type_id')
+            ->where('provider_services_types.provider_id', $provider->id)
+            ->whereNull('provider_services_types.deleted_at')
+            ->whereNull('service_types.deleted_at')
+            ->where('service_types.is_active', true)
+            ->orderBy('service_types.description')
+            ->get([
+                'service_types.id',
+                'service_types.description',
+            ])
+            ->toArray();
+
+        $totalReviews = DB::table('reviews')
+            ->leftJoin('schedules', 'schedules.id', '=', 'reviews.schedule_id')
+            ->where('reviews.origin', 'provider')
+            ->where('schedules.provider_id', $provider->id)
+            ->count();
+
+        return [
+            'provider_id'       => $provider->id,
+            'provider_name'     => $provider->user?->name,
+            'district'          => $address?->district,
+            'age'               => $provider->birth_date?->age,
+            'gender'            => $provider->gender,
+            'gender_label'      => GenderEnum::labelFor($provider->gender),
+            'average_rating'    => $provider->average_rating,
+            'total_services'    => $provider->total_services,
+            'total_reviews'     => $totalReviews,
+            'profile_media_url' => $provider->profileMedia?->path
+                ? Storage::temporaryUrl($provider->profileMedia->path, now()->addMinutes(60))
+                : null,
+            'service_types'     => $serviceTypes,
+        ];
+    }
+
     //
 
     private function applyCreditCardFee(?float $price): ?float

+ 2 - 1
routes/authRoutes/search.php

@@ -3,4 +3,5 @@
 use App\Http\Controllers\SearchController;
 use Illuminate\Support\Facades\Route;
 
-Route::get('/prestadores-busca', [SearchController::class, 'buscaPrestadores'])->middleware('permission:dashboard,view');
+Route::get('/prestadores-busca', [SearchController::class, 'buscaPrestadores'])->middleware('permission:dashboard,view');
+Route::get('/prestador-perfil/{id}', [SearchController::class, 'perfilPrestador'])->middleware('permission:dashboard,view');