Browse Source

feat: adiciona modulo de Franchisee

ebagabee 1 month ago
parent
commit
0c7814e01d

+ 45 - 0
app/Http/Controllers/FranchiseeController.php

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

+ 34 - 0
app/Http/Requests/FranchiseeRequest.php

@@ -0,0 +1,34 @@
+<?php
+
+namespace App\Http\Requests;
+
+use Illuminate\Foundation\Http\FormRequest;
+
+class FranchiseeRequest extends FormRequest
+{
+    public function rules(): array
+    {
+        $rules = [
+            // Add your validation rules here
+            //'field' => 'sometimes|string|max:255',
+        ];
+
+        // Different rules for creation
+        //if ($this->isMethod('POST')) {
+            // Make fields required if needed
+            // $rules['field'] = 'required|string|max:255';
+        //}
+
+        return $rules;
+    }
+
+    /**
+    * Add custom messages when needed
+    * public function messages(): array
+    * {
+    *   return [
+    *        'field.required' => __('message.algo'),
+    *    ];
+    * }
+    */
+}

+ 45 - 0
app/Http/Resources/FranchiseeResource.php

@@ -0,0 +1,45 @@
+<?php
+
+namespace App\Http\Resources;
+
+use Carbon\Carbon;
+use Illuminate\Http\Request;
+use Illuminate\Http\Resources\Json\JsonResource;
+use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
+use App\Models\Franchisee;
+
+class FranchiseeResource extends JsonResource
+{
+    /**
+     * Transform the resource into an array.
+     *
+     * @return array<string, mixed>
+     */
+    public function toArray(Request $request): array
+    {
+        return [
+            'id' => $this->id,
+            'name' => $this->name,
+            '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'),
+            // Add your fields here
+
+            // Conditional fields
+            // $this->mergeWhen($request->user()?->isAdmin(), [
+            //     'internal_notes' => $this->internal_notes,
+            // ]),
+
+            // Relationships
+            // 'user' => new UserResource($this->whenLoaded('user')),
+        ];
+    }
+
+    /**
+     * @param \Illuminate\Database\Eloquent\Collection<Franchisee> $resource
+     * @return \Illuminate\Http\Resources\Json\AnonymousResourceCollection<FranchiseeResource>
+     */
+    public static function collection($resource): AnonymousResourceCollection
+    {
+        return parent::collection($resource);
+    }
+}

+ 37 - 0
app/Models/Franchisee.php

@@ -0,0 +1,37 @@
+<?php
+
+namespace App\Models;
+
+use Illuminate\Database\Eloquent\Factories\HasFactory;
+use Illuminate\Database\Eloquent\Model;
+
+/**
+ * @property int $id
+ * @property \Carbon\Carbon $created_at
+ * @property \Carbon\Carbon $updated_at
+ */
+class Franchisee extends Model
+{
+    use HasFactory;
+
+    protected $table = 'franchisees';
+
+    protected $guarded = [
+        'id', // Add more fields that shouldn't be edited here
+    ];
+
+    protected $casts = [
+        'created_at' => 'datetime',
+        'updated_at' => 'datetime',
+        // Add your casts here (e.g., 'is_active' => 'boolean')
+    ];
+
+    // Relationships
+
+    // Business Logic Methods
+
+    // Custom Finders
+
+    // Query Scopes
+
+}

+ 50 - 0
app/Services/FranchiseeService.php

@@ -0,0 +1,50 @@
+<?php
+
+namespace App\Services;
+
+use App\Models\Franchisee;
+use Illuminate\Database\Eloquent\Collection;
+
+class FranchiseeService
+{
+    public function getAll(): Collection
+    {
+        return Franchisee::orderBy('created_at', 'desc')
+            ->get();
+    }
+
+    public function findById(int $id): ?Franchisee
+    {
+        return Franchisee::find($id);
+    }
+
+    public function create(array $data): Franchisee
+    {
+        return Franchisee::create($data);
+    }
+
+    public function update(int $id, array $data): ?Franchisee
+    {
+        $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();
+    }
+
+    // Add custom business logic methods here
+}

+ 5 - 5
database/migrations/0001_01_01_000000_create_users_table.php

@@ -13,13 +13,13 @@ public function up(): void
     {
         Schema::create('users', function (Blueprint $table) {
             $table->id();
-            $table->string('name');
-            $table->string('email')->unique();
-            $table->timestamp('email_verified_at')->nullable();
+            $table->string('name')->index();
+            $table->string('email')->index();
             $table->string('password');
-            $table->string('type')->default('GUEST');
-            $table->string('language')->default('pt');
+            $table->enum('status', ['ACTIVE', 'INACTIVE'])->default('ACTIVE');
+            $table->string('user_type')->default('USER');
             $table->timestamps();
+            $table->softDeletes();
         });
 
         Schema::create('password_reset_tokens', function (Blueprint $table) {

+ 37 - 0
database/migrations/2026_03_20_132856_create_franchisees_table.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::create('franchisees', function (Blueprint $table) {
+            $table->id();
+            $table->string('name');
+            $table->string('cpf')->nullable();
+            $table->string('rg')->nullable();
+            $table->string('cnpj')->nullable();
+            $table->string('phone')->nullable();
+            $table->string('cellphone_number')->nullable();
+            $table->string('street');
+            $table->string('address_number')->nullable();
+            $table->string('neighborhood');
+            $table->string('postal_code');
+            $table->foreignId('city_id')->constrained('cities');
+            $table->foreignId('state_id')->constrained('states');
+            $table->date('birth_date');
+            $table->timestamps();
+            $table->softDeletes();
+
+            $table->index(['name', 'state_id', 'city_id']);
+        });
+    }
+
+    public function down(): void
+    {
+        Schema::dropIfExists('franchisees');
+    }
+};

+ 16 - 0
routes/authRoutes/franchisee.php

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