Bladeren bron

✨ feat(user-dependent): adicionar módulo de dependentes do associado

Fase: dev | Origin: melhoria-interna
Gustavo Zanatta 1 week geleden
bovenliggende
commit
2994924302

+ 50 - 0
app/Http/Controllers/UserDependentController.php

@@ -0,0 +1,50 @@
+<?php
+
+namespace App\Http\Controllers;
+
+use App\Http\Requests\UserDependentRequest;
+use App\Http\Resources\UserDependentResource;
+use App\Services\UserDependentService;
+use Illuminate\Http\JsonResponse;
+
+class UserDependentController extends Controller
+{
+    public function __construct(protected UserDependentService $service) {}
+
+    public function indexByUser(int $userId): JsonResponse
+    {
+        $items = $this->service->getAllByUser($userId);
+        return $this->successResponse(payload: UserDependentResource::collection($items));
+    }
+
+    public function store(UserDependentRequest $request): JsonResponse
+    {
+        $item = $this->service->create($request->validated());
+        return $this->successResponse(
+            payload: new UserDependentResource($item),
+            message: __('messages.created'),
+            code: 201,
+        );
+    }
+
+    public function show(int $id): JsonResponse
+    {
+        $item = $this->service->findById($id);
+        return $this->successResponse(payload: new UserDependentResource($item));
+    }
+
+    public function update(UserDependentRequest $request, int $id): JsonResponse
+    {
+        $item = $this->service->update($id, $request->validated());
+        return $this->successResponse(
+            payload: new UserDependentResource($item),
+            message: __('messages.updated'),
+        );
+    }
+
+    public function destroy(int $id): JsonResponse
+    {
+        $this->service->delete($id);
+        return $this->successResponse(message: __('messages.deleted'), code: 204);
+    }
+}

+ 29 - 0
app/Http/Requests/UserDependentRequest.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace App\Http\Requests;
+
+use App\Enums\KinshipEnum;
+use App\Enums\UserDependentStatusEnum;
+use Illuminate\Foundation\Http\FormRequest;
+use Illuminate\Validation\Rule;
+
+class UserDependentRequest extends FormRequest
+{
+    public function rules(): array
+    {
+        $rules = [
+            'responsible_user_id' => 'sometimes|integer|exists:users,id',
+            'name'                => 'sometimes|string|max:255',
+            'kinship'             => ['sometimes', Rule::enum(KinshipEnum::class)],
+            'status'              => ['sometimes', Rule::enum(UserDependentStatusEnum::class)],
+        ];
+
+        if ($this->isMethod('post')) {
+            $rules['responsible_user_id'] = 'required|integer|exists:users,id';
+            $rules['name']                = 'required|string|max:255';
+            $rules['kinship']             = ['required', Rule::enum(KinshipEnum::class)];
+        }
+
+        return $rules;
+    }
+}

+ 23 - 0
app/Http/Resources/UserDependentResource.php

@@ -0,0 +1,23 @@
+<?php
+
+namespace App\Http\Resources;
+
+use Carbon\Carbon;
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\JsonResource;
+
+class UserDependentResource extends JsonResource
+{
+    public function toArray(Request $request): array
+    {
+        return [
+            'id'                  => $this->id,
+            'responsible_user_id' => $this->responsible_user_id,
+            'name'                => $this->name,
+            'kinship'             => $this->kinship,
+            'status'              => $this->status,
+            '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'),
+        ];
+    }
+}

+ 29 - 0
app/Models/UserDependent.php

@@ -0,0 +1,29 @@
+<?php
+
+namespace App\Models;
+
+use App\Enums\KinshipEnum;
+use App\Enums\UserDependentStatusEnum;
+use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\Relations\BelongsTo;
+use Illuminate\Database\Eloquent\SoftDeletes;
+
+class UserDependent extends Model
+{
+    use SoftDeletes;
+
+    protected $guarded = ['id'];
+
+    protected function casts(): array
+    {
+        return [
+            'kinship' => KinshipEnum::class,
+            'status'  => UserDependentStatusEnum::class,
+        ];
+    }
+
+    public function responsibleUser(): BelongsTo
+    {
+        return $this->belongsTo(User::class, 'responsible_user_id');
+    }
+}

+ 49 - 0
app/Services/UserDependentService.php

@@ -0,0 +1,49 @@
+<?php
+
+namespace App\Services;
+
+use App\Models\UserDependent;
+use Illuminate\Database\Eloquent\Collection;
+
+class UserDependentService
+{
+    public function getAllByUser(int $userId): Collection
+    {
+        return UserDependent::where('responsible_user_id', $userId)
+            ->orderBy('name')
+            ->get();
+    }
+
+    public function findById(int $id): ?UserDependent
+    {
+        return UserDependent::find($id);
+    }
+
+    public function create(array $data): UserDependent
+    {
+        return UserDependent::create($data);
+    }
+
+    public function update(int $id, array $data): ?UserDependent
+    {
+        $model = $this->findById($id);
+
+        if (!$model) {
+            return null;
+        }
+
+        $model->update($data);
+        return $model->fresh();
+    }
+
+    public function delete(int $id): bool
+    {
+        $model = $this->findById($id);
+
+        if (!$model) {
+            return false;
+        }
+
+        return $model->delete();
+    }
+}

+ 37 - 0
database/migrations/2025_01_01_000003_alter_users_table_add_new_fields.php

@@ -0,0 +1,37 @@
+<?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->string('cpf', 14)->nullable()->unique()->after('email');
+            $table->string('registration')->nullable()->unique()->after('cpf');
+            $table->string('status')->default('active')->after('registration');
+            $table->date('admission_date')->nullable()->after('status');
+            $table->date('expiry_date')->nullable()->after('admission_date');
+            $table->foreignId('position_id')->nullable()->constrained('positions')->nullOnDelete()->after('expiry_date');
+            $table->foreignId('sector_id')->nullable()->constrained('sectors')->nullOnDelete()->after('position_id');
+
+            $table->index('status');
+            $table->index('position_id');
+            $table->index('sector_id');
+        });
+    }
+
+    public function down(): void
+    {
+        Schema::table('users', function (Blueprint $table) {
+            $table->dropForeign(['position_id']);
+            $table->dropForeign(['sector_id']);
+            $table->dropIndex(['status']);
+            $table->dropIndex(['position_id']);
+            $table->dropIndex(['sector_id']);
+            $table->dropColumn(['cpf', 'registration', 'status', 'admission_date', 'expiry_date', 'position_id', 'sector_id']);
+        });
+    }
+};

+ 29 - 0
database/migrations/2025_01_01_000005_create_user_dependents_table.php

@@ -0,0 +1,29 @@
+<?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::create('user_dependents', function (Blueprint $table) {
+            $table->id();
+            $table->foreignId('responsible_user_id')->constrained('users')->cascadeOnDelete();
+            $table->string('name');
+            $table->string('kinship');
+            $table->string('status')->default('active');
+            $table->timestamps();
+            $table->softDeletes();
+
+            $table->index('responsible_user_id');
+            $table->index('status');
+        });
+    }
+
+    public function down(): void
+    {
+        Schema::dropIfExists('user_dependents');
+    }
+};

+ 16 - 0
routes/authRoutes/user_dependent.php

@@ -0,0 +1,16 @@
+<?php
+
+use App\Http\Controllers\UserDependentController;
+use Illuminate\Support\Facades\Route;
+
+Route::controller(UserDependentController::class)->prefix('user-dependent')->group(function () {
+    Route::get('/user/{userId}', 'indexByUser')->middleware('permission:associado.dependente,view');
+
+    Route::post('/', 'store')->middleware('permission:associado.dependente,add');
+
+    Route::get('/{id}', 'show')->middleware('permission:associado.dependente,view');
+
+    Route::put('/{id}', 'update')->middleware('permission:associado.dependente,edit');
+
+    Route::delete('/{id}', 'destroy')->middleware('permission:associado.dependente,delete');
+});