Sfoglia il codice sorgente

feat: :sparkles: feat (agenda) criada tela de agenda

foi criada a tela de agenda para o app cliente e prestador com exibicao dos servicos ativos e ja feitos, opcao de avaliar e reagendar

fase:dev | origin:escopo
Gustavo Zanatta 1 mese fa
parent
commit
6bdd172e0b

+ 23 - 0
app/Http/Controllers/ClientCalendarController.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Services\ClientCalendarService;
+use Illuminate\Http\JsonResponse;
+use Illuminate\Support\Facades\Log;
+
+class ClientCalendarController extends Controller
+{
+  public function __construct(private readonly ClientCalendarService $service) {}
+
+  public function index(): JsonResponse
+  {
+    try {
+      $dados = $this->service->getCalendar();
+      return $this->successResponse(payload: $dados);
+    } catch (\Exception $e) {
+      Log::error("Error fetching client calendar: " . $e->getMessage());
+      return $this->errorResponse(message: __("messages.error_fetching_data"), code: 500);
+    }
+  }
+}

+ 23 - 0
app/Http/Controllers/ProviderCalendarController.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Services\ProviderCalendarService;
+use Illuminate\Http\JsonResponse;
+use Illuminate\Support\Facades\Log;
+
+class ProviderCalendarController extends Controller
+{
+  public function __construct(private readonly ProviderCalendarService $service) {}
+
+  public function index(): JsonResponse
+  {
+    try {
+      $dados = $this->service->getCalendar();
+      return $this->successResponse(payload: $dados);
+    } catch (\Exception $e) {
+      Log::error("Error fetching provider calendar: " . $e->getMessage());
+      return $this->errorResponse(message: __("messages.error_fetching_data"), code: 500);
+    }
+  }
+}

+ 80 - 0
app/Services/ClientCalendarService.php

@@ -0,0 +1,80 @@
+<?php
+
+namespace App\Services;
+
+use App\Models\Client;
+use App\Models\Schedule;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\DB;
+
+class ClientCalendarService
+{
+  public function __construct() {}
+
+  public function getCalendar(): array
+  {
+    $user = Auth::user();
+    $client = Client::where('user_id', $user->id)->first();
+
+    $selectFields = [
+      'schedules.id',
+      'schedules.provider_id',
+      'schedules.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',
+      'provider_user.name as provider_name',
+      'providers.average_rating',
+      'providers.total_services',
+      DB::raw("(SELECT media.url FROM media WHERE media.source_id = providers.id AND media.source = 'provider' AND media.deleted_at IS NULL LIMIT 1) as provider_photo"),
+      DB::raw("EXISTS(
+        SELECT 1 FROM reviews
+        WHERE reviews.schedule_id = schedules.id
+          AND reviews.origin = 'client'
+          AND reviews.origin_id = {$client->id}
+          AND reviews.deleted_at IS NULL
+      ) as client_reviewed"),
+      DB::raw("(
+        SELECT reviews.stars FROM reviews
+        WHERE reviews.schedule_id = schedules.id
+          AND reviews.origin = 'client'
+          AND reviews.origin_id = {$client->id}
+          AND reviews.deleted_at IS NULL
+        LIMIT 1
+      ) as client_stars"),
+    ];
+
+    $upcomingSchedules = Schedule::with('address:district,address,number,source_id,source,id')
+      ->where('schedules.client_id', $client->id)
+      ->whereIn('schedules.status', ['pending', 'accepted', 'paid', 'started'])
+      ->whereDate('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($selectFields)
+      ->orderBy('schedules.date', 'asc')
+      ->orderBy('schedules.start_time', 'asc')
+      ->get();
+
+    $completedSchedules = Schedule::with('address:district,address,number,source_id,source,id')
+      ->where('schedules.client_id', $client->id)
+      ->whereIn('schedules.status', ['finished', 'cancelled'])
+      ->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($selectFields)
+      ->orderBy('schedules.date', 'desc')
+      ->orderBy('schedules.start_time', 'desc')
+      ->get();
+
+    return [
+      'upcomingSchedules' => $upcomingSchedules,
+      'completedSchedules' => $completedSchedules,
+    ];
+  }
+}

+ 1 - 0
app/Services/DashboardService.php

@@ -51,6 +51,7 @@ class DashboardService
       ->where('schedules.client_id', $cliente->id)
       ->whereIn('schedules.status', ['accepted', 'paid'])
       ->whereDate('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')
       ->where('schedules.date', '>=', now()->toDateString())

+ 77 - 0
app/Services/ProviderCalendarService.php

@@ -0,0 +1,77 @@
+<?php
+
+namespace App\Services;
+
+use App\Models\Provider;
+use App\Models\Schedule;
+use Illuminate\Support\Facades\Auth;
+use Illuminate\Support\Facades\DB;
+
+class ProviderCalendarService
+{
+  public function __construct() {}
+
+  public function getCalendar(): array
+  {
+    $user = Auth::user();
+    $provider = Provider::where('user_id', $user->id)->first();
+
+    $selectFields = [
+      '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.schedule_type',
+      'schedules.address_id',
+      'schedules.status',
+      '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 reviews.stars FROM reviews
+        WHERE reviews.schedule_id = schedules.id
+          AND reviews.origin = 'provider'
+          AND reviews.origin_id = {$provider->id}
+          AND reviews.deleted_at IS NULL
+        LIMIT 1
+      ) as provider_stars"),
+    ];
+
+    $upcomingSchedules = Schedule::with('address:district,address,number,source_id,source,id')
+      ->where('schedules.provider_id', $provider->id)
+      ->whereIn('schedules.status', ['pending', 'accepted', 'paid', 'started'])
+      ->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($selectFields)
+      ->orderBy('schedules.date', 'asc')
+      ->orderBy('schedules.start_time', 'asc')
+      ->get();
+
+    $completedSchedules = Schedule::with('address:district,address,number,source_id,source,id')
+      ->where('schedules.provider_id', $provider->id)
+      ->whereIn('schedules.status', ['finished', 'cancelled'])
+      ->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($selectFields)
+      ->orderBy('schedules.date', 'desc')
+      ->orderBy('schedules.start_time', 'desc')
+      ->get();
+
+    return [
+      'upcomingSchedules' => $upcomingSchedules,
+      'completedSchedules' => $completedSchedules,
+    ];
+  }
+}

+ 6 - 0
routes/authRoutes/client_calendar.php

@@ -0,0 +1,6 @@
+<?php
+
+use App\Http\Controllers\ClientCalendarController;
+use Illuminate\Support\Facades\Route;
+
+Route::get('/dados-agenda-cliente', [ClientCalendarController::class, 'index'])->middleware('permission:dashboard,view');

+ 6 - 0
routes/authRoutes/provider_calendar.php

@@ -0,0 +1,6 @@
+<?php
+
+use App\Http\Controllers\ProviderCalendarController;
+use Illuminate\Support\Facades\Route;
+
+Route::get('/dados-agenda-prestador', [ProviderCalendarController::class, 'index'])->middleware('permission:dashboard,view');