浏览代码

feat: :sparkles: feat (termos condicoes) associado obrigatorio aceitar termos

adicionada funcao que obriga associado a aceitar termos e condicoes ao realizar fluxo de primeiro acesso

fase:dev | origin:prod
Gustavo Zanatta 1 天之前
父节点
当前提交
fa7cc45f22

+ 9 - 0
app/Http/Controllers/UserController.php

@@ -133,9 +133,18 @@ class UserController extends Controller
             'phone'          => 'sometimes|string|max:20',
             'position_id'    => 'sometimes|nullable|integer|exists:positions,id',
             'sector_id'      => 'sometimes|nullable|integer|exists:sectors,id',
+            'terms_accepted' => 'sometimes|accepted',
         ]);
 
+        $termsAccepted = (bool) ($data['terms_accepted'] ?? false);
+        unset($data['terms_accepted']);
+
         $user = Auth::user();
+
+        if ($termsAccepted && !$user->terms_accepted_at) {
+            $data['terms_accepted_at'] = now();
+        }
+
         $user->update($data);
 
         return $this->successResponse(

+ 1 - 1
app/Http/Requests/FirstAccessRegisterRequest.php

@@ -38,7 +38,7 @@ class FirstAccessRegisterRequest extends FormRequest
             'position_id'  => 'required|integer|exists:positions,id',
             'sector_id'    => 'required|integer|exists:sectors,id',
             'password'     => ['required', 'confirmed', Password::min(8)->mixedCase()->numbers()],
-            // Obrigatória apenas quando a administração ainda não cadastrou uma foto para o associado.
+            'terms_accepted' => ['accepted'],
             'photo'        => ['nullable', Rule::requiredIf(fn(): bool => !$user?->photo_path), 'image', 'max:5120'],
         ];
     }

+ 1 - 0
app/Http/Resources/UserResource.php

@@ -37,6 +37,7 @@ class UserResource extends JsonResource
                                                 ? Storage::disk('s3')->temporaryUrl($this->photo_path, now()->addHours(24))
                                                 : null,
             'first_access_completed_at'  => $this->first_access_completed_at?->format('Y-m-d H:i:s'),
+            'terms_accepted_at'          => $this->terms_accepted_at?->format('Y-m-d H:i:s'),
             'on_leave_at'                => $this->on_leave_at?->format('Y-m-d H:i:s'),
             'on_leave_by_user_id'        => $this->on_leave_by_user_id,
             'first_access_at'            => $this->access_logs_min_accessed_at

+ 1 - 0
app/Models/User.php

@@ -80,6 +80,7 @@ class User extends Authenticatable
             "status"            => UserStatusEnum::class,
             "admission_date"    => "date",
             "first_access_completed_at" => "datetime",
+            "terms_accepted_at" => "datetime",
             "expiry_date"       => "date",
             "excluded_at"       => "datetime",
             "on_leave_at"       => "datetime",

+ 1 - 1
app/Services/FirstAccessService.php

@@ -103,9 +103,9 @@ class FirstAccessService
             $user->name                      = $data['name'];
             $user->password                  = $data['password'];
             $user->first_access_completed_at = now();
+            $user->terms_accepted_at         = $user->terms_accepted_at ?? now();
             $user->save();
 
-            // Sem arquivo novo, mantém a foto que a administração já havia cadastrado.
             if ($photo) {
                 $this->mediaService->uploadUserAvatar($photo, $user);
             }

+ 22 - 0
database/migrations/2026_08_13_000001_add_terms_accepted_at_to_users_table.php

@@ -0,0 +1,22 @@
+<?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('users', function (Blueprint $table) {
+            $table->timestamp('terms_accepted_at')->nullable()->after('first_access_completed_at');
+        });
+    }
+
+    public function down(): void
+    {
+        Schema::table('users', function (Blueprint $table) {
+            $table->dropColumn('terms_accepted_at');
+        });
+    }
+};

+ 1 - 0
lang/en/validation.php

@@ -205,6 +205,7 @@ return [
         'sector_id'    => 'sector',
         'status'       => 'status',
         'photo'        => 'photo',
+        'terms_accepted' => 'terms and conditions',
     ],
 
 ];

+ 1 - 0
lang/es/validation.php

@@ -205,6 +205,7 @@ return [
         'sector_id'    => 'sector',
         'status'       => 'estado',
         'photo'        => 'foto',
+        'terms_accepted' => 'términos y condiciones',
     ],
 
 ];

+ 1 - 0
lang/pt/validation.php

@@ -206,6 +206,7 @@ return [
         'sector_id'    => 'setor',
         'status'       => 'status',
         'photo'        => 'foto',
+        'terms_accepted' => 'termos e condições',
     ],
 
 ];