Pārlūkot izejas kodu

modal de alteracao de status + dashboard com agendamentos e acoes (fluxo de testes)

Gustavo Zanatta 2 nedēļas atpakaļ
vecāks
revīzija
f2890912bb

+ 25 - 0
app/Http/Controllers/ScheduleController.php

@@ -6,6 +6,7 @@ use App\Http\Requests\ScheduleRequest;
 use App\Http\Resources\ScheduleResource;
 use App\Services\ScheduleService;
 use Illuminate\Http\JsonResponse;
+use Illuminate\Support\Facades\Request;
 
 class ScheduleController extends Controller
 {
@@ -86,4 +87,28 @@ class ScheduleController extends Controller
             code: 204,
         );
     }
+
+    public function groupedByClient(): JsonResponse
+    {
+        $grouped = $this->scheduleService->getGroupedByClient();
+        return $this->successResponse($grouped);
+    }
+
+    public function updateStatus(string $id, ScheduleRequest $request): JsonResponse
+    {
+        try {
+            $validated = $request->validate([
+                'status' => 'required|in:pending,accepted,rejected,paid,cancelled,started,finished'
+            ]);
+
+            $schedule = $this->scheduleService->updateStatus($id, $validated['status']);
+            
+            return $this->successResponse(
+                payload: new ScheduleResource($schedule),
+                message: __("messages.updated"),
+            );
+        } catch (\Exception $e) {
+            return $this->errorResponse($e->getMessage(), 422);
+        }
+    }
 }

+ 74 - 0
app/Services/ScheduleService.php

@@ -165,4 +165,78 @@ class ScheduleService
 
         return true;
     }
+
+    public function getGroupedByClient()
+    {
+        $schedules = Schedule::with(['client.user', 'provider.user', 'address'])
+            // ->orderBy('date', 'desc')
+            ->orderBy('id', 'desc')
+            ->select(
+                'schedules.*'
+                
+            )
+            ->get();
+
+        $grouped = $schedules->groupBy('client_id')->map(function ($clientSchedules) {
+            $firstSchedule = $clientSchedules->first();
+            return [
+                'client_id' => $firstSchedule->client_id,
+                'client_name' => $firstSchedule->client->user->name ?? 'N/A',
+                'schedules' => $clientSchedules->map(function ($schedule) {
+                    return [
+                        'id' => $schedule->id,
+                        'date' => $schedule->date ? Carbon::parse($schedule->date)->format('d/m/Y') : null,
+                        'start_time' => $schedule->start_time,
+                        'end_time' => $schedule->end_time,
+                        'period_type' => $schedule->period_type,
+                        'status' => $schedule->status,
+                        'total_amount' => $schedule->total_amount,
+                        'code' => $schedule->code,
+                        'code_verified' => $schedule->code_verified,
+                        'provider_id' => $schedule->provider_id,
+                        'provider_name' => $schedule->provider->user->name ?? 'N/A',
+                        'address' => $schedule->address ? [
+                            'id' => $schedule->address->id,
+                            'address' => $schedule->address->address,
+                            'complement' => $schedule->address->complement,
+                            'zip_code' => $schedule->address->zip_code,
+                            'city' => $schedule->address->city->name ?? '',
+                            'state' => $schedule->address->city->state->name ?? '',
+                        ] : null,
+                        'client_name' => $schedule->client->user->name ?? 'N/A',
+                    ];
+                })->values()
+            ];
+        })->sortBy('id')->values();
+
+        return $grouped;
+    }
+
+    public function updateStatus($id, string $status)
+    {
+        $schedule = Schedule::findOrFail($id);
+        
+        $allowedTransitions = [
+            'pending' => ['accepted', 'rejected'],
+            'accepted' => ['paid', 'cancelled'],
+            'paid' => ['cancelled', 'started'],
+            'started' => ['finished'],
+            'rejected' => [],
+            'cancelled' => [],
+            'finished' => [],
+        ];
+
+        $currentStatus = $schedule->status;
+        
+        if (!isset($allowedTransitions[$currentStatus])) {
+            throw new \Exception("Status atual inválido.");
+        }
+
+        if (!in_array($status, $allowedTransitions[$currentStatus])) {
+            throw new \Exception("Transição de status não permitida: {$currentStatus} → {$status}");
+        }
+
+        $schedule->update(['status' => $status]);
+        return $schedule->fresh(['client.user', 'provider.user', 'address']);
+    }
 }

+ 2 - 0
routes/authRoutes/schedule.php

@@ -4,7 +4,9 @@ use App\Http\Controllers\ScheduleController;
 use Illuminate\Support\Facades\Route;
 
 Route::get('/schedules', [ScheduleController::class, 'index']);
+Route::get('/schedules/grouped-by-client', [ScheduleController::class, 'groupedByClient']);
 Route::get('/schedule/{id}', [ScheduleController::class, 'show']);
 Route::post('/schedule', [ScheduleController::class, 'store']);
 Route::put('/schedule/{id}', [ScheduleController::class, 'update']);
+Route::patch('/schedule/{id}/status', [ScheduleController::class, 'updateStatus']);
 Route::delete('/schedule/{id}', [ScheduleController::class, 'destroy']);