Explorar o código

feat: support multi-unit association for users

- UserRequest: accept unit_ids[] array alongside legacy unit_id
- UserResource: expose units[] array and backward-compatible unit_id
- UserService: sync multiple units on create/update via unit_ids[]
ebagabee hai 2 semanas
pai
achega
ad254ea2f1

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

@@ -23,7 +23,9 @@ public function rules(): array
             'user_type' => 'sometimes|nullable|string|exists:user_types,slug',
             'language'  => ['sometimes', Rule::enum(LanguageEnum::class)],
             'state_id'  => 'sometimes|nullable|integer|exists:states,id',
-            'unit_id'   => 'sometimes|nullable|integer|exists:units,id',
+            'unit_id'    => 'sometimes|nullable|integer|exists:units,id',
+            'unit_ids'   => 'sometimes|nullable|array',
+            'unit_ids.*' => 'integer|exists:units,id',
         ];
 
         if ($this->isMethod('post')) {

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

@@ -24,6 +24,10 @@ public function toArray(Request $request): array
             'status'        => $this->status,
             'state_id'      => $this->state_id,
             'unit_id'       => $this->whenLoaded('units', fn() => $this->units->first()?->id),
+            'units'         => $this->whenLoaded('units', fn() => $this->units->map(fn($u) => [
+                'id'           => $u->id,
+                'fantasy_name' => $u->fantasy_name,
+            ])->values()->toArray()),
             'avatar_url'    => $this->avatar_url
                 ? Storage::temporaryUrl($this->avatar_url, now()->addHours(24))
                 : null,

+ 23 - 13
app/Services/UserService.php

@@ -23,7 +23,7 @@ public function getAll(): Collection
 
     public function getAllByUnit(): Collection
     {
-        $unitId = Auth::user()->units->first()?->id;
+        $unitId = request()->input('active_unit_id') ?? Auth::user()->units->first()?->id;
 
         if (!$unitId) {
             return User::with(['state', 'units', 'userType'])->whereNull('id')->get();
@@ -42,20 +42,25 @@ public function findById(int $id): ?User
 
     public function create(array $data): User
     {
-        $unitId = $data['unit_id'] ?? Auth::user()->units->first()?->id;
-        unset($data['unit_id']);
+        // Suporta unit_ids[] (múltiplas) ou unit_id (retrocompatibilidade)
+        $unitIds = $data['unit_ids'] ?? null;
+        if (empty($unitIds) && isset($data['unit_id'])) {
+            $unitIds = array_filter([$data['unit_id']]);
+        }
+        if (empty($unitIds)) {
+            $fallback = Auth::user()->units->first()?->id;
+            $unitIds  = $fallback ? [$fallback] : [];
+        }
+        unset($data['unit_ids'], $data['unit_id']);
 
         $data = $this->handleAvatar($data);
         $user = User::create($data);
 
-        if ($unitId) {
-            UnitUser::create([
-                'unit_id' => $unitId,
-                'user_id' => $user->id,
-            ]);
+        if (!empty($unitIds)) {
+            $user->units()->sync($unitIds);
         }
 
-        return $user->load('state');
+        return $user->load('state', 'units');
     }
 
     public function update(int $id, array $data): ?User
@@ -66,14 +71,19 @@ public function update(int $id, array $data): ?User
             return null;
         }
 
-        $hasUnitId = array_key_exists('unit_id', $data);
-        $unitId    = $data['unit_id'] ?? null;
-        unset($data['unit_id']);
+        // Suporta unit_ids[] (múltiplas) com fallback para unit_id (retrocompatibilidade)
+        $hasUnitIds = array_key_exists('unit_ids', $data);
+        $unitIds    = $data['unit_ids'] ?? null;
+        $hasUnitId  = array_key_exists('unit_id', $data);
+        $unitId     = $data['unit_id'] ?? null;
+        unset($data['unit_ids'], $data['unit_id']);
 
         $data = $this->handleAvatar($data, $model->avatar_url);
         $model->update($data);
 
-        if ($hasUnitId) {
+        if ($hasUnitIds) {
+            $model->units()->sync(array_filter($unitIds ?? []));
+        } elseif ($hasUnitId) {
             $model->units()->sync($unitId ? [$unitId] : []);
         }