orderBy('fantasy_name') ->get(); } public function findById(int $id): ?Unit { return Unit::with(['city', 'state', 'partners'])->find($id); } public function create(array $data): Unit { $franchiseeData = [ 'name' => $data['name'], 'cnpj' => $data['cnpj'], 'cpf' => null, 'rg' => null, 'phone' => $data['phone_number'] ?? null, 'cellphone_number' => $data['cell_number'], '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); $userType = UserType::create([ 'unit_id' => $unit->id, 'system_key' => 'ADMIN_FRANCHISEE', 'scope_key' => "unit:{$unit->id}", 'slug' => 'ADMIN_FRANCHISEE', 'label' => 'Administrador', 'is_system' => true, 'access_scope' => 'unit', ]); // Clona os perfis customizados (Neurotrainer, Financeiro, Gestor) baseados na unidade da Andreia $andreiaUnitId = \App\Models\User::find(11)?->units()->value('units.id'); if ($andreiaUnitId) { $templateRoles = UserType::where('unit_id', $andreiaUnitId) ->where('is_system', false) ->with('permissions') ->get(); foreach ($templateRoles as $templateRole) { $newRole = UserType::create([ 'unit_id' => $unit->id, 'system_key' => $templateRole->system_key, 'scope_key' => "unit:{$unit->id}", 'slug' => \Illuminate\Support\Str::slug($templateRole->label . '-' . $unit->id), 'label' => $templateRole->label, 'is_system' => false, 'access_scope' => 'unit', ]); foreach ($templateRole->permissions as $p) { \App\Models\UserTypePermission::create([ 'user_type' => $newRole->slug, 'user_type_id' => $newRole->id, 'permission_id' => $p->permission_id, 'bits' => $p->bits, ]); } } } $franchisee = Franchisee::create($franchiseeData); FranchiseeUnit::create([ 'franchisee_id' => $franchisee->id, 'unit_id' => $unit->id, ]); // Dados financeiros da unidade já nascem com a cobrança de ROI/FNM ativa; // para desativar, edita-se na tab Financeiro da unidade. UnitFinancial::create([ 'unit_id' => $unit->id, 'charge_roi' => true, 'charge_fnm' => true, ]); $this->replicatePackagesToUnit($unit->id); return $unit; } public function update(int $id, array $data): ?Unit { $model = $this->findById($id); if (!$model) { return null; } unset($data['franchisee']); $data = $this->handleAvatar($data, $model->avatar_url); $model->update($data); return $model->fresh(['city', 'state']); } public function delete(int $id): bool { $model = $this->findById($id); if (!$model) { return false; } if ($model->avatar_url) { Storage::delete($model->avatar_url); } return $model->delete(); } // private function replicatePackagesToUnit(int $unitId): void { ClassPackage::with(['pavaoProposal.products', 'irrecusableProposal.products'])->get()->each(function (ClassPackage $package) use ($unitId) { $this->packageUnitService->replicateFromBasePackage($unitId, $package); }); } private function handleAvatar(array $data, ?string $oldAvatarPath = null): array { if (!isset($data['avatar'])) { return $data; } if ($data['avatar'] instanceof UploadedFile) { if ($oldAvatarPath) { Storage::delete($oldAvatarPath); } $data['avatar_url'] = $data['avatar']->store('units/avatars'); } elseif (is_null($data['avatar'])) { if ($oldAvatarPath) { Storage::delete($oldAvatarPath); } $data['avatar_url'] = null; } unset($data['avatar']); return $data; } }