Procházet zdrojové kódy

feat(franchisee): create unit and franchisee in the same request.

ebagabee před 2 dny
rodič
revize
b7a6a51c7f

+ 3 - 1
app/Http/Requests/UnitRequest.php

@@ -30,6 +30,7 @@ public function rules(): array
             'avatar'                    => 'sometimes|nullable|image|max:2048',
             'contracts'                 => 'sometimes|nullable|array',
             'contracts.*'               => 'file|mimes:pdf|max:10240',
+
             'partners'                  => 'sometimes|nullable|array',
             'partners.*.name'           => 'required|string|max:255',
             'partners.*.cpf'            => 'required|string|max:20',
@@ -39,7 +40,7 @@ public function rules(): array
             'partners.*.birth_date'     => 'nullable|date',
             'partners.*.participation'  => 'nullable|numeric|min:0|max:100',
             'partners.*.email'          => 'nullable|email|max:255',
-            'partners.*.secondary_email'=> 'nullable|email|max:255',
+            'partners.*.secondary_email' => 'nullable|email|max:255',
             'partners.*.phone_number'   => 'nullable|string|max:20',
             'partners.*.cell_number'    => 'nullable|string|max:20',
             'partners.*.postal_code'    => 'nullable|string|max:9',
@@ -70,6 +71,7 @@ public function rules(): array
             foreach ($required as $field) {
                 $rules[$field] = str_replace('sometimes|required', 'required', $rules[$field]);
             }
+
         }
 
         return $rules;

+ 23 - 13
app/Models/Franchisee.php

@@ -4,34 +4,44 @@
 
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
+use Illuminate\Database\Eloquent\Relations\BelongsToMany;
+use Illuminate\Database\Eloquent\SoftDeletes;
 
 /**
  * @property int $id
+ * @property string $name
+ * @property string|null $cpf
+ * @property string|null $rg
+ * @property string|null $cnpj
+ * @property string|null $phone
+ * @property string|null $cellphone_number
+ * @property string $street
+ * @property string|null $address_number
+ * @property string $neighborhood
+ * @property string $postal_code
+ * @property int $city_id
+ * @property int $state_id
+ * @property string $birth_date
  * @property \Carbon\Carbon $created_at
  * @property \Carbon\Carbon $updated_at
+ * @property \Carbon\Carbon|null $deleted_at
  */
 class Franchisee extends Model
 {
-    use HasFactory;
+    use HasFactory, SoftDeletes;
 
     protected $table = 'franchisees';
 
-    protected $guarded = [
-        'id', // Add more fields that shouldn't be edited here
-    ];
+    protected $guarded = ['id'];
 
     protected $casts = [
         'created_at' => 'datetime',
         'updated_at' => 'datetime',
-        // Add your casts here (e.g., 'is_active' => 'boolean')
+        'deleted_at' => 'datetime',
     ];
 
-    // Relationships
-
-    // Business Logic Methods
-
-    // Custom Finders
-
-    // Query Scopes
-
+    public function units(): BelongsToMany
+    {
+        return $this->belongsToMany(Unit::class, 'franchisee_units');
+    }
 }

+ 6 - 0
app/Models/Unit.php

@@ -5,6 +5,7 @@
 use Illuminate\Database\Eloquent\Factories\HasFactory;
 use Illuminate\Database\Eloquent\Model;
 use Illuminate\Database\Eloquent\Relations\BelongsTo;
+use Illuminate\Database\Eloquent\Relations\BelongsToMany;
 use Illuminate\Database\Eloquent\Relations\HasMany;
 use Illuminate\Database\Eloquent\SoftDeletes;
 
@@ -61,4 +62,9 @@ public function partners(): HasMany
     {
         return $this->hasMany(UnitPartner::class, 'unit_id');
     }
+
+    public function franchisees(): BelongsToMany
+    {
+        return $this->belongsToMany(Franchisee::class, 'franchisee_units');
+    }
 }

+ 24 - 19
app/Services/UnitService.php

@@ -2,9 +2,9 @@
 
 namespace App\Services;
 
+use App\Models\Franchisee;
+use App\Models\FranchiseeUnit;
 use App\Models\Unit;
-use App\Models\UnitContract;
-use App\Models\UnitPartner;
 use Illuminate\Database\Eloquent\Collection;
 use Illuminate\Http\UploadedFile;
 use Illuminate\Support\Facades\Storage;
@@ -31,28 +31,31 @@ public function findById(int $id): ?Unit
 
     public function create(array $data): Unit
     {
-        $partners  = $data['partners'] ?? [];
-        $contracts = $data['contracts'] ?? [];
-        unset($data['partners'], $data['contracts']);
+        $franchiseeData = [
+            'name'             => $data['fantasy_name'],
+            'cnpj'             => $data['cnpj'],
+            'cpf'              => null,
+            'rg'               => null,
+            'phone'            => $data['cell_number'] ?? null,
+            'cellphone_number' => $data['phone_number'] ?? null,
+            'street'           => $data['street'],
+            'address_number'   => $data['address_number'] ?? null,
+            'neighborhood'     => $data['neighborhood'],
+            'postal_code'      => $data['postal_code'],
+            'city_id'          => $data['city_id'],
+            'state_id'         => $data['state_id'],
+            'birth_date'       => null,
+        ];
 
         $data = $this->handleAvatar($data);
         $unit = Unit::create($data);
 
-        foreach ($partners as $partnerData) {
-            if (isset($partnerData['avatar']) && $partnerData['avatar'] instanceof UploadedFile) {
-                $partnerData['avatar_url'] = $partnerData['avatar']->store('unit-partners/avatars');
-                unset($partnerData['avatar']);
-            }
-            UnitPartner::create(array_merge($partnerData, ['unit_id' => $unit->id]));
-        }
+        $franchisee = Franchisee::create($franchiseeData);
 
-        foreach ($contracts as $file) {
-            UnitContract::create([
-                'unit_id'  => $unit->id,
-                'name'     => $file->getClientOriginalName(),
-                'file_url' => $file->store('unit-contracts'),
-            ]);
-        }
+        FranchiseeUnit::create([
+            'franchisee_id' => $franchisee->id,
+            'unit_id'       => $unit->id,
+        ]);
 
         return $unit;
     }
@@ -65,6 +68,8 @@ public function update(int $id, array $data): ?Unit
             return null;
         }
 
+        unset($data['franchisee']);
+
         $data = $this->handleAvatar($data, $model->avatar_url);
         $model->update($data);
         return $model->fresh(['city', 'state']);

+ 22 - 0
database/migrations/2026_04_29_000001_alter_franchisees_make_birth_date_nullable.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('franchisees', function (Blueprint $table) {
+            $table->date('birth_date')->nullable()->change();
+        });
+    }
+
+    public function down(): void
+    {
+        Schema::table('franchisees', function (Blueprint $table) {
+            $table->date('birth_date')->nullable(false)->change();
+        });
+    }
+};