Browse Source

feat: :sparkles: feat (agendamento) criada flag de auto aprovado

criada flag de auto aprovado no agendamento, para agendamentos que foram aprovados automaticamente. para os aprovados manais, adicionada coluna indicando quem aprovou

fase:dev | origin:escopo
Gustavo Zanatta 1 ngày trước cách đây
mục cha
commit
1e9fde8823

+ 4 - 2
app/Http/Controllers/AppointmentController.php

@@ -48,8 +48,10 @@ class AppointmentController extends Controller
 
         if ($creatingForOther) {
             $data['status'] = AppointmentStatusEnum::CONFIRMADO;
+            $data['auto_approved'] = true;
         } elseif ($authUser->status === UserStatusEnum::ACTIVE) {
             $data['status'] = AppointmentStatusEnum::CONFIRMADO;
+            $data['auto_approved'] = true;
         }
 
         $item = $this->service->create($data);
@@ -73,7 +75,7 @@ class AppointmentController extends Controller
 
     public function update(AppointmentRequest $request, int $id): JsonResponse
     {
-        $item = $this->service->update($id, $request->validated());
+        $item = $this->service->update($id, $request->validated(), Auth::id());
         return $this->successResponse(
             payload: new AppointmentResource($item),
             message: __('messages.updated'),
@@ -120,7 +122,7 @@ class AppointmentController extends Controller
 
     public function approve(AppointmentApproveRequest $request, int $id): JsonResponse
     {
-        $item = $this->service->approve($id, $request->date, $request->time);
+        $item = $this->service->approve($id, $request->date, $request->time, Auth::id());
         return $this->successResponse(payload: new AppointmentResource($item), message: __('messages.updated'));
     }
 

+ 3 - 0
app/Http/Resources/AppointmentResource.php

@@ -24,6 +24,9 @@ class AppointmentResource extends JsonResource
             'observations'                 => $this->observations,
             'requested_at'                 => $this->requested_at?->format('Y-m-d H:i:s'),
             'status'                       => $this->status,
+            'auto_approved'                => $this->auto_approved,
+            'approved_by_user_id'          => $this->approved_by_user_id,
+            'approved_by_user'             => $this->whenLoaded('approvedByUser', fn() => new UserResource($this->approvedByUser)),
             'created_at'                   => Carbon::parse($this->created_at)->format('Y-m-d H:i:s'),
             'updated_at'                   => Carbon::parse($this->updated_at)->format('Y-m-d H:i:s'),
         ];

+ 9 - 3
app/Models/Appointment.php

@@ -16,9 +16,10 @@ class Appointment extends Model
     protected function casts(): array
     {
         return [
-            'date'         => 'date',
-            'requested_at' => 'datetime',
-            'status'       => AppointmentStatusEnum::class,
+            'date'          => 'date',
+            'requested_at'  => 'datetime',
+            'status'        => AppointmentStatusEnum::class,
+            'auto_approved' => 'boolean',
         ];
     }
 
@@ -27,6 +28,11 @@ class Appointment extends Model
         return $this->belongsTo(User::class);
     }
 
+    public function approvedByUser(): BelongsTo
+    {
+        return $this->belongsTo(User::class, 'approved_by_user_id');
+    }
+
     public function partnerAgreement(): BelongsTo
     {
         return $this->belongsTo(PartnerAgreement::class);

+ 21 - 8
app/Services/AppointmentService.php

@@ -65,7 +65,7 @@ class AppointmentService
         ], $model->user_id);
     }
 
-    public function update(int $id, array $data): ?Appointment
+    public function update(int $id, array $data, ?int $approvingUserId = null): ?Appointment
     {
         $model = Appointment::find($id);
 
@@ -73,6 +73,15 @@ class AppointmentService
             return null;
         }
 
+        if (
+            isset($data['status'])
+            && $data['status'] === AppointmentStatusEnum::CONFIRMADO->value
+            && $model->status !== AppointmentStatusEnum::CONFIRMADO
+        ) {
+            $data['auto_approved'] = false;
+            $data['approved_by_user_id'] = $approvingUserId;
+        }
+
         $model->update($data);
         return $model->fresh(['user', 'partnerAgreement', 'partnerAgreementService']);
     }
@@ -122,14 +131,16 @@ class AppointmentService
         return $query->paginate($perPage);
     }
 
-    public function approve(int $id, string $date, string $time): ?Appointment
+    public function approve(int $id, string $date, string $time, ?int $approvedByUserId = null): ?Appointment
     {
         $model = Appointment::find($id);
         if (!$model) return null;
         $model->update([
-            'status' => AppointmentStatusEnum::CONFIRMADO,
-            'date'   => $date,
-            'time'   => $time,
+            'status'              => AppointmentStatusEnum::CONFIRMADO,
+            'date'                => $date,
+            'time'                => $time,
+            'auto_approved'       => false,
+            'approved_by_user_id' => $approvedByUserId,
         ]);
         $this->notificationService->createAutoForUser([
             'title'     => 'Agendamento confirmado',
@@ -161,9 +172,11 @@ class AppointmentService
         $model = Appointment::whereHas('partnerAgreement', fn($q) => $q->where('user_id', $userId))->find($id);
         if (!$model) return null;
         $model->update([
-            'status' => AppointmentStatusEnum::CONFIRMADO,
-            'date'   => $date,
-            'time'   => $time,
+            'status'              => AppointmentStatusEnum::CONFIRMADO,
+            'date'                => $date,
+            'time'                => $time,
+            'auto_approved'       => false,
+            'approved_by_user_id' => $userId,
         ]);
         $this->notificationService->createAutoForUser([
             'title'     => 'Agendamento confirmado',

+ 25 - 0
database/migrations/2026_07_28_000002_add_approval_fields_to_appointments_table.php

@@ -0,0 +1,25 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    public function up(): void
+    {
+        Schema::table('appointments', function (Blueprint $table) {
+            $table->boolean('auto_approved')->default(false)->after('status');
+            $table->foreignId('approved_by_user_id')->nullable()->after('auto_approved')
+                ->constrained('users')->nullOnDelete();
+        });
+    }
+
+    public function down(): void
+    {
+        Schema::table('appointments', function (Blueprint $table) {
+            $table->dropConstrainedForeignId('approved_by_user_id');
+            $table->dropColumn('auto_approved');
+        });
+    }
+};